- 博客(77)
- 收藏
- 关注
原创 flow_controllers
这些流控制器用于管理 DDS 中数据发布的同步性、异步性和调度策略,确保数据按需高效传输。此函数初始化流控制器工厂,创建三种默认流控制器实例(
2025-06-09 20:56:11
180
原创 解析XML函数调用
XMLProfileManager.cpp XMLP_ret XMLProfileManager::loadXMLFileXMLParser.cpp XMLP_ret XMLParser::loadXML()XMLProfileManager.cpp XMLP_ret XMLProfileManager::extractProfiles()XMLProfileManager.cpp XMLP_ret XMLProfileManager::extractPar
2025-04-30 15:43:14
133
原创 RTI QOS继承关系
在RTI Connext中,QoS继承关系是指一个QoS Profile可以从另一个QoS Profile继承配置,从而简化配置过程并提高可重用性。通过继承,子Profile会首先初始化为父Profile的所有QoS设置,然后可以覆盖其中的部分设置。
2025-04-24 16:02:30
417
原创 QOS-Patiton 分区策略
分区是一种灵活且高效的机制,用于在域和主题的基础上进一步隔离和管理发布者与订阅者。通过动态更改分区成员资格和支持多分区成员资格,分区能够满足复杂的数据分离和通信需求,同时减少系统资源的消耗。分区与端点相关,而不是与数据更改相关。这意味着端点的历史记录不会受到分区更改的影响。例如,如果一个发布者切换了分区,之后需要重新发送某些旧的更改,它会将这些更改发送到新的分区集合中,而不考虑这些更改是在哪些分区定义时创建的。这意味着一个晚加入的订阅者可能会接收到在另一个分区集合活动期间创建的更改。
2025-04-23 16:48:15
715
原创 信号的概念
硬件 异步 ctrl +c 向硬件中断的处理程序发了一个信号。自己写好的函数作为参数让别人来调用。把函数当成 参数 函数指针。软件 异步 kill-9。软件 同步 abort。
2025-04-20 20:52:14
212
原创 rtps报文分析
在RTPS(实时发布订阅协议,Real-Time Publish-Subscribe)协议中,HEARTBEAT报文用于在发布者和订阅者之间进行心跳检测,确保通信链路的活性和数据传输的可靠性。通过这个字段,发送方(如发布者)可以了解接收方已经成功接收了哪些数据包,从而避免重复发送已接收的数据。它标识了发送方已传输的数据包的最大序列号。假设发布者已经发送了序列号1到100的数据包,而订阅者已经成功接收了序列号1到95的数据包。,这意味着接收方已经确认接收了所有发送方发送的数据包。
2025-04-18 10:08:55
282
原创 ROS中订阅(Subscribe)最新消息以及消息队列相关问题
Subscriber所订阅的消息的发布频率可能是很高的,而这些操作的运算速度肯定达不到消息发布的速度。所以,如果我们要是没有取舍的对于每个消息都调用一次回调函数,那么势必会导致计算越来越不实时,很有可能当下在处理的还是几十秒以前的数据。通过使用消息队列和多线程,可以有效地管理高频率发布的消息,确保只处理最新的消息,避免系统延迟和处理过时数据。以下是一个使用C++实现的示例代码,展示如何在ROS的Subscriber回调函数中只处理最新的消息。
2025-04-16 17:06:47
509
原创 CMake学习
如果使用其他编译器(如Microsoft Visual C),这些选项不会被添加,可能需要在不同的编译器上进行不同的配置。通过以上步骤,这段CMake代码确保了项目在使用g++或Clang编译器时会启用额外的警告选项,同时指定了项目所需的CMake最低版本和项目名称。,开发者可以更方便地配置ROS2项目的构建,而不需要手动处理复杂的CMake配置。通过这两行代码,项目的源文件被正确地收集和编译,形成了一个可以在其他部分引用的库。nm命令主要用于显示二进制文件中的符号信息,包括函数和变量的地址和类型。
2025-04-16 16:12:56
879
原创 RTPS数据包分析
特性DATA(r)DATA用途通知发布者关于订阅者的属性信息。传输实际的用户数据内容。内容订阅者的属性信息,如QoS设置、主题过滤条件等。用户应用层的具体数据内容。触发条件订阅者创建或修改属性时发送。每当有新的数据需要发布时发送。消息类型控制消息,用于建立和管理订阅关系。数据消息,用于实际数据传输。
2025-04-14 20:53:06
970
原创 内核态切换到用户态
是操作系统中 CPU 执行模式的一种切换过程,涉及从高权限的内核态(Kernel Mode)切换到低权限的用户态(User Mode)。通过这种切换机制,操作系统能够为应用程序提供安全、高效的运行环境,同时保护硬件资源不被滥用。,导致 CPU 从用户态切换到内核态。当用户态程序需要访问硬件资源或执行特权操作时,会触发。
2025-04-09 20:23:36
356
原创 POSIX线程库信号量线程同步
这段代码展示了如何使用信号量来控制线程之间的同步。sem_init用于初始化信号量,sem_wait用于等待信号量,sem_post用于释放信号量。通过这样的机制,可以确保线程之间的协调执行。
2025-04-08 10:39:39
226
原创 文件映射mmap与管道文件
简单来说,把磁盘里的数据与内存的用户态建立一一映射关系,让读写内存等价于读写磁盘,支持随机访问。named pipe /FIFO 命名管道:在文件系统中存在路径。在用户态申请内存,内存内容和磁盘内容建立一一映射。管道文件:进程间通信机制,不占用磁盘空间。创建管道 mkfifo 1.pipe。进程之间沟通可以通过磁盘文件沟通。管道需要两个进程通信才能使用。读写内存等价于读写磁盘。
2025-04-06 18:17:35
201
原创 vscode使用方式
一、常用快捷键与代码操作Ctrl + /;1。代码缩进:选中代码段后按Tab(右移)或(左移)1。Ctrl + P;Ctrl + G;12。(复制行);Alt + ↑/↓(移动行)1。Alt + 单击或(上下插入)1。或1。
2025-04-06 10:56:02
863
原创 主题(topic)中使用键(key)来区分同一主题下的多个数据实例
1. **主题(Topic)**:在DDS中,主题是数据的类型或类别。4. **数据区分**:在订阅时,订阅者可以根据键来指定感兴趣的数据实例。总结来说,在Fast DDS中,通过为同一主题下的不同数据实例分配唯一的键,可以实现对数据的精确区分和高效管理,确保数据在分布式系统中的准确传输和处理。3. **键(Key)**:键是用于唯一标识同一主题下的不同数据实例的标识符。5. **数据管理**:通过键,DDS系统可以高效地管理数据实例,包括数据的持久化、历史数据的维护以及数据一致性的保证。
2025-04-03 15:46:11
162
原创 二维数组按行读取和按列读取的效率比较
二维数组在内存中通常采用行主序(Row-Major Order)存储,即同一行的元素在内存中是连续存储的。这种存储方式使得按行读取元素能够更好地利用CPU缓存,提高读取效率。而按列读取则需要跳跃式访问内存,可能导致缓存未命中,性能较差。在大多数情况下,按行读取二维数组的效率会比按列读取快,这主要得益于行主序存储方式和CPU缓存的局部性原理。
2025-04-02 13:59:33
149
原创 如何发现死锁,在开发时怎么避免死锁
死锁是指在多线程或多进程环境中,由于资源分配不当,导致两个或多个进程/线程无限阻塞,永远无法继续执行的现象。常见的死锁例子包括数据库的事务死锁、线程间的资源竞争等,死锁往往在高并发或者复杂的业务场景下才会出现.。
2025-04-02 10:53:20
284
原创 怎么发现性能瓶颈
要发现性能瓶颈,通常需要结合工具和手动分析。使用 Profiler 获取整体的性能数据。找出消耗时间最多的函数或代码块。手动分析这些代码,判断是否有优化空间。验证优化效果。通过这些方法,你可以系统地定位并解决性能问题。
2025-04-02 10:34:40
252
原创 如何调试内存泄漏
检测和修复内存泄露至关重要,这有助于确保 C++ 程序的稳定性。通过了解泄露的原理、使用检测工具和遵循正确的修复步骤,我们可以防止此类缺陷并维护健壮的代码。这个函数修改了一个指针指向的值,但没有释放指针指向的内存。
2025-04-02 10:29:39
324
原创 WireShark与rtps协议组合使用
https://community.rti.com/static/documentation/wireshark/2020-07/doc/understanding_rtps.html
2025-03-20 13:39:30
555
原创 Fast dds 内存调优
将 Writer 端的缓存大小从 100 调整为 10,可以显著优化内存占用、降低调度开销、减少网络带宽占用并提高实时性。然而,这需要根据具体的应用场景和需求进行权衡,确保调整后的配置不会影响系统的功能和可靠性。
2025-03-15 15:20:15
384
原创 ros2 常用命令
例子:ros2 topic pub /aaa std_msgs/msg/String 无内容ros2 topic pub /aaa std_msgs/msg/String "data: '123'" 有内容和复制复制。
2025-03-15 14:54:22
653
原创 服务发现详解
在(一种高性能的DDS middleware)中,和是两种不同的服务发现机制,用于节点之间的发现和通信。它们的主要区别在于节点之间如何发现彼此以及如何建立通信关系。
2025-03-07 09:55:19
540
原创 帧率和带宽
帧率,通常指的是每秒传输的帧数,帧就是一段数据包。带宽则是指在单位时间内可以传输的数据量,通常以比特每秒来衡量帧率在ROS2中可能指的是每秒发布的消息数量。也就是说,一个节点发布话题的频率。比如,每秒发布10次消息,那帧率就是10 Hz。带宽在ROS2中可能指的是每秒传输的数据量。比如,一个话题每秒传输的数据大小,如果每次消息是1 KB,每秒传输10次,那么带宽就是10 KB/s,或者换算成比特每秒就是80 Kbps。
2025-02-27 20:04:18
214
原创 零拷贝知识分享
零拷贝是一种通过减少不必要的数据复制来提高数据传输效率的技术,广泛应用于高性能计算、网络服务器、分布式系统等领域。尽管零拷贝在实现上有一定的挑战和限制,但其在优化数据传输和提升系统性能方面具有重要的意义。通过合理设计和优化内存管理、利用硬件的DMA功能、优化内核和用户空间的接口,可以有效实现零拷贝,提升系统的整体性能。
2025-02-15 17:17:14
883
原创 IPC通信
因此,IPC机制为进程提供了一种安全、有效的通信方式。在FastDDS中,**DataSharing**和**Shared Memory**结合使用,可以高效地实现数据共享和传输,减少数据复制的开销,提升系统性能。- **概念**:管道是最基本的IPC机制之一,它是一种单向的通信方式,数据只能从一个进程流向另一个进程。- **概念**:RPC是一种高级IPC机制,允许一个进程调用另一个进程(甚至远程计算机上的进程)的函数。- **概念**:套接字是用于不同进程(甚至不同计算机)之间通信的机制。
2025-02-14 16:31:15
422
原创 unorder_map与map 的选择
使用哈希表来存储元素,所以当哈希函数均匀分布键且没有冲突时,可以实现非常快的查找速度。中的元素是没有顺序的,这意味着它不会因为维护排序而消耗额外的时间。:尽管哈希表可能需要额外的空间来存储指针和哈希码,但在大多数情况下,不允许有重复的键,但如果需要存储具有相同键的多个条目,可以使用。总结来说,在需要快速查找且不关心元素顺序的情况下,推荐使用。能够有效地利用内存,特别是在低负载因子的情况下。而在需要排序或执行基于排序的操作时,则应该选择。在插入和删除元素时也能够保持较高的效率。:同样得益于哈希表的设计,
2024-12-07 11:42:25
344
原创 反序列化失败问题
下面我将提供一个基本的C++脚本示例,该脚本创建一个ROS2节点,该节点会定期调用一个回调函数,在这个函数中可以实现数据包的捕获逻辑。4. **限制捕获时间**:可以结合`time`命令或者`timeout`命令来限制`tcpdump`运行的时间。1. **设置捕获大小**:你可以限制每个数据包的最大字节数,这样可以减小捕获文件的大小。2. **限制捕获的数据包数量**:使用`-c`选项指定要捕获的最大数据包数。7. **清理旧的捕获文件**:定期清理不再需要的旧捕获文件,确保磁盘空间得到有效利用。
2024-11-06 21:43:34
505
原创 RTPS发布订阅一条消息流程
创建订阅者源代码文件:Domain.cpp ParticipantImpl.cpp SubscriberImpl.cpp Subscriber.cpp RTPSDomain.cpp RTPSParticipant.cpp RTPSReader.cpp。通过这两条特殊信息,可确保信息交互的可靠性,从而判断信息是否丢失或需要发送,可通过PublisherAttributes设置心跳报文的频率,提高心跳报文频率会产生大量的信息被发出,但会加快系统对数据丢失的响应。发现过程包含两个主要阶段:参与者发现和端点发现。
2024-11-01 14:25:22
362
原创 ros2 bag 详解
一.命令行详解ros2 bag是一个命令行工具,用于记录系统中发布的主题数据。它积累传递给任意数量主题的数据,并将其保存在数据库中。然后可以重放数据以再现测试和实验的结果。记录主题也是分享你的工作并让别人重新创造它的好方法。在对选定的主题运行此命令之前,打开一个新的终端并移动到前面创建的bag_files目录中,因为 rosbag 文件将保存在运行它的目录中。记录多个主题-o选项允许您为您的包文件选择一个唯一的名称。下面的字符串(在本例中是subset)是文件名。
2024-10-17 16:27:03
1152
原创 sizeof与strlen的区别
sizeof是C语言中的一个操作符(而非函数),用于获取某个数据类型或变量所占用的内存字节数。它可以在编译时计算其操作数的大小,而不需要访问实际的内存内容。strlen是C语言中的一个标准库函数,用于计算一个字符串(以'\0'结尾的字符数组)的长度,即不包括结尾的空字符'\0'在内的字符个数。它的原型是,定义在string.h头文件中。
2024-09-08 10:59:06
437
原创 自定义string类
`std::forward<T>(item)` 这个函数的作用是完美地将`item`转发给`data_.emplace_back`。如果`item`是一个左值,那么它会被转发为左值。这比使用`push_back`更高效,因为`push_back`通常需要先创建一个临时对象再将其移动到容器中,而`emplace_back`则是在容器中直接构造对象,省去了临时对象的创建和移动。- `insert(iterator position, n, val)`: 在`position`前插入`n`个`val`值。
2024-09-06 11:01:19
1030
原创 remove_if详解
的元素)移动到容器的开始部分,并返回一个迭代器,该迭代器指向新的逻辑末尾(即最后一个不应被移除的元素之后的位置)。需要注意的是,被“移除”的元素(即谓词返回。首先将所有奇数移动到向量的开始部分,并返回一个迭代器指向最后一个奇数之后的位置(即第一个偶数原本所在的位置)。返回一个迭代器,指向最后一个不应被移除的元素之后的位置。函数是 C++ 标准库中的一个算法,它用于移除容器中满足特定条件的元素。然而,重要的是要理解。的元素)仍然保留在容器中,但它们现在位于新的逻辑末尾之后,因此可以通过后续操作(如。
2024-08-29 11:12:01
616
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人