- 博客(61)
- 收藏
- 关注
原创 主题(topic)中使用键(key)来区分同一主题下的多个数据实例
1. **主题(Topic)**:在DDS中,主题是数据的类型或类别。4. **数据区分**:在订阅时,订阅者可以根据键来指定感兴趣的数据实例。总结来说,在Fast DDS中,通过为同一主题下的不同数据实例分配唯一的键,可以实现对数据的精确区分和高效管理,确保数据在分布式系统中的准确传输和处理。3. **键(Key)**:键是用于唯一标识同一主题下的不同数据实例的标识符。5. **数据管理**:通过键,DDS系统可以高效地管理数据实例,包括数据的持久化、历史数据的维护以及数据一致性的保证。
2025-04-03 15:46:11
106
原创 二维数组按行读取和按列读取的效率比较
二维数组在内存中通常采用行主序(Row-Major Order)存储,即同一行的元素在内存中是连续存储的。这种存储方式使得按行读取元素能够更好地利用CPU缓存,提高读取效率。而按列读取则需要跳跃式访问内存,可能导致缓存未命中,性能较差。在大多数情况下,按行读取二维数组的效率会比按列读取快,这主要得益于行主序存储方式和CPU缓存的局部性原理。
2025-04-02 13:59:33
114
原创 如何发现死锁,在开发时怎么避免死锁
死锁是指在多线程或多进程环境中,由于资源分配不当,导致两个或多个进程/线程无限阻塞,永远无法继续执行的现象。常见的死锁例子包括数据库的事务死锁、线程间的资源竞争等,死锁往往在高并发或者复杂的业务场景下才会出现.。
2025-04-02 10:53:20
270
原创 怎么发现性能瓶颈
要发现性能瓶颈,通常需要结合工具和手动分析。使用 Profiler 获取整体的性能数据。找出消耗时间最多的函数或代码块。手动分析这些代码,判断是否有优化空间。验证优化效果。通过这些方法,你可以系统地定位并解决性能问题。
2025-04-02 10:34:40
198
原创 如何调试内存泄漏
检测和修复内存泄露至关重要,这有助于确保 C++ 程序的稳定性。通过了解泄露的原理、使用检测工具和遵循正确的修复步骤,我们可以防止此类缺陷并维护健壮的代码。这个函数修改了一个指针指向的值,但没有释放指针指向的内存。
2025-04-02 10:29:39
295
原创 WireShark与rtps协议组合使用
https://community.rti.com/static/documentation/wireshark/2020-07/doc/understanding_rtps.html
2025-03-20 13:39:30
536
原创 Fast dds 内存调优
将 Writer 端的缓存大小从 100 调整为 10,可以显著优化内存占用、降低调度开销、减少网络带宽占用并提高实时性。然而,这需要根据具体的应用场景和需求进行权衡,确保调整后的配置不会影响系统的功能和可靠性。
2025-03-15 15:20:15
321
原创 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
482
原创 服务发现详解
在(一种高性能的DDS middleware)中,和是两种不同的服务发现机制,用于节点之间的发现和通信。它们的主要区别在于节点之间如何发现彼此以及如何建立通信关系。
2025-03-07 09:55:19
498
原创 帧率和带宽
帧率,通常指的是每秒传输的帧数,帧就是一段数据包。带宽则是指在单位时间内可以传输的数据量,通常以比特每秒来衡量帧率在ROS2中可能指的是每秒发布的消息数量。也就是说,一个节点发布话题的频率。比如,每秒发布10次消息,那帧率就是10 Hz。带宽在ROS2中可能指的是每秒传输的数据量。比如,一个话题每秒传输的数据大小,如果每次消息是1 KB,每秒传输10次,那么带宽就是10 KB/s,或者换算成比特每秒就是80 Kbps。
2025-02-27 20:04:18
186
原创 零拷贝知识分享
零拷贝是一种通过减少不必要的数据复制来提高数据传输效率的技术,广泛应用于高性能计算、网络服务器、分布式系统等领域。尽管零拷贝在实现上有一定的挑战和限制,但其在优化数据传输和提升系统性能方面具有重要的意义。通过合理设计和优化内存管理、利用硬件的DMA功能、优化内核和用户空间的接口,可以有效实现零拷贝,提升系统的整体性能。
2025-02-15 17:17:14
868
原创 IPC通信
因此,IPC机制为进程提供了一种安全、有效的通信方式。在FastDDS中,**DataSharing**和**Shared Memory**结合使用,可以高效地实现数据共享和传输,减少数据复制的开销,提升系统性能。- **概念**:管道是最基本的IPC机制之一,它是一种单向的通信方式,数据只能从一个进程流向另一个进程。- **概念**:RPC是一种高级IPC机制,允许一个进程调用另一个进程(甚至远程计算机上的进程)的函数。- **概念**:套接字是用于不同进程(甚至不同计算机)之间通信的机制。
2025-02-14 16:31:15
402
原创 unorder_map与map 的选择
使用哈希表来存储元素,所以当哈希函数均匀分布键且没有冲突时,可以实现非常快的查找速度。中的元素是没有顺序的,这意味着它不会因为维护排序而消耗额外的时间。:尽管哈希表可能需要额外的空间来存储指针和哈希码,但在大多数情况下,不允许有重复的键,但如果需要存储具有相同键的多个条目,可以使用。总结来说,在需要快速查找且不关心元素顺序的情况下,推荐使用。能够有效地利用内存,特别是在低负载因子的情况下。而在需要排序或执行基于排序的操作时,则应该选择。在插入和删除元素时也能够保持较高的效率。:同样得益于哈希表的设计,
2024-12-07 11:42:25
315
原创 反序列化失败问题
下面我将提供一个基本的C++脚本示例,该脚本创建一个ROS2节点,该节点会定期调用一个回调函数,在这个函数中可以实现数据包的捕获逻辑。4. **限制捕获时间**:可以结合`time`命令或者`timeout`命令来限制`tcpdump`运行的时间。1. **设置捕获大小**:你可以限制每个数据包的最大字节数,这样可以减小捕获文件的大小。2. **限制捕获的数据包数量**:使用`-c`选项指定要捕获的最大数据包数。7. **清理旧的捕获文件**:定期清理不再需要的旧捕获文件,确保磁盘空间得到有效利用。
2024-11-06 21:43:34
459
原创 RTPS发布订阅一条消息流程
创建订阅者源代码文件:Domain.cpp ParticipantImpl.cpp SubscriberImpl.cpp Subscriber.cpp RTPSDomain.cpp RTPSParticipant.cpp RTPSReader.cpp。通过这两条特殊信息,可确保信息交互的可靠性,从而判断信息是否丢失或需要发送,可通过PublisherAttributes设置心跳报文的频率,提高心跳报文频率会产生大量的信息被发出,但会加快系统对数据丢失的响应。发现过程包含两个主要阶段:参与者发现和端点发现。
2024-11-01 14:25:22
346
原创 ros2 bag 详解
一.命令行详解ros2 bag是一个命令行工具,用于记录系统中发布的主题数据。它积累传递给任意数量主题的数据,并将其保存在数据库中。然后可以重放数据以再现测试和实验的结果。记录主题也是分享你的工作并让别人重新创造它的好方法。在对选定的主题运行此命令之前,打开一个新的终端并移动到前面创建的bag_files目录中,因为 rosbag 文件将保存在运行它的目录中。记录多个主题-o选项允许您为您的包文件选择一个唯一的名称。下面的字符串(在本例中是subset)是文件名。
2024-10-17 16:27:03
1030
原创 sizeof与strlen的区别
sizeof是C语言中的一个操作符(而非函数),用于获取某个数据类型或变量所占用的内存字节数。它可以在编译时计算其操作数的大小,而不需要访问实际的内存内容。strlen是C语言中的一个标准库函数,用于计算一个字符串(以'\0'结尾的字符数组)的长度,即不包括结尾的空字符'\0'在内的字符个数。它的原型是,定义在string.h头文件中。
2024-09-08 10:59:06
428
原创 自定义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
1013
原创 remove_if详解
的元素)移动到容器的开始部分,并返回一个迭代器,该迭代器指向新的逻辑末尾(即最后一个不应被移除的元素之后的位置)。需要注意的是,被“移除”的元素(即谓词返回。首先将所有奇数移动到向量的开始部分,并返回一个迭代器指向最后一个奇数之后的位置(即第一个偶数原本所在的位置)。返回一个迭代器,指向最后一个不应被移除的元素之后的位置。函数是 C++ 标准库中的一个算法,它用于移除容器中满足特定条件的元素。然而,重要的是要理解。的元素)仍然保留在容器中,但它们现在位于新的逻辑末尾之后,因此可以通过后续操作(如。
2024-08-29 11:12:01
527
原创 gdb详解
cmake .. -DCONNEXTDDS_DIR=/opt/rti/x86_64/rti_connext_dds-6.1.2 -DCMAKE_BUILD_TYPE=Debug
2024-08-29 11:10:29
195
原创 linux知识
内核是操作系统的核心部分,它负责管理系统资源、提供安全访问、实现硬件抽象等功能。内核的性能和稳定性直接影响到整个操作系统的性能和稳定性。随着计算机技术的不断发展,内核的设计和实现也在不断进步和完善。
2024-08-20 23:06:53
347
原创 设计模式详解
std::cout << "SimpleHouse 包括:\n" << std::endl;设计模式不是算法,算法提供明确的步骤,模式更像是一个蓝图(能看到最终的结果)设计模式是软件设计中常见的典型解决方案,可用于解决代码反复出现的设计问题。实现:接口,不可以创建对象,哺乳动物。工厂方法:用类的方式去延迟new。针对接口编程,不针对实现编程。为交互对象之间的松耦合而努力。组合:生命周期,一只猫有手。生成器构造比价复杂的对象。对扩展开放,对修改关闭。依赖:陌生的关系,点餐。设计模式分类(意图)
2024-08-09 14:37:33
797
原创 内存序详解
这行代码是一个C++函数中的返回语句,它使用了原子操作来读取一个标志位的值,并且将该值作为函数的返回结果。在多线程上下文中使用原子操作和适当的内存序是至关重要的,这样可以确保程序的正确性和预期的行为。,这个读取操作可能看到一个过期的值,如果其他线程正在写入同一个变量,而这个写入操作没有完成。或类似的类型),这种类型的变量是为了在多线程环境中安全地进行读取和写入而设计的。变量的当前值,而不关心其他线程可能对该变量进行的写入操作。是原子类型的一个成员函数,用于获取变量的当前值。的值,并将其作为函数的返回值”。
2024-08-08 10:19:50
171
原创 fast dds initial peers 详解
允许配置包含一个或多个此类 IP 端口地址的初始对等体列表 对应远程 DomainParticipants PDP 发现的监听资源,使得本地 DomainParticipant 不仅会将其 PDP 流量发送到其域指定的默认组播地址端口, 以及初始对等体列表中指定的所有 IP 端口地址对。TRANSIENT_DURABILITY_QOS:当一个新的DataReader加入时,它的历史记录会填充过去的样本,这些样本会存储在持久存储上(请参阅持久服务)。中设置的值的每个端口。也有可能不定义初始对等端口。
2024-08-03 16:54:15
829
原创 git 使用总结
这也是我们经常用的命令,他会把此次提交追加到上一次的commit内容里。例如,如果你喜欢使用 Vim,可以运行。例如,如果你喜欢使用 Vim,可以运行。:Git 可能没有正确地识别你的默认文本编辑器。:Git 可能没有正确地识别你的默认文本编辑器。取出缓存区栈顶(即最近一次)的内容,并且会删除此次。,于是出现了右边这个界面,即打开了一个vim。内容,并且提交此次修改,如果敲入“:q。将工作区的修改保存到缓存区,且取名为。的提交内容,包括所有文件的修改信息。),把他的修改在新分支上再修改一遍。
2024-07-17 14:36:51
689
原创 CmakeLists
如果使用的静态库, libcalc.a 可被打包到生成的可执行文件当中,动态库里面的数据不会打包到可执行文件里面,当程序一启动,可执行文件和静态库都会被加载到内存中,但是动态库不会,动态库只是执行到的时候才会被加载到内存中。CMAKE_CURRENT_SOURCE_DIR执行cmake时后面携带的路径 CMakeLists.txt对应的路径。PROJECT_SOURCE_DIR:执行cmake时后面携带的路径 CMakeLists.txt对应的路径。发布给客户需要给include 和库文件。
2024-07-17 14:36:48
445
原创 RTI DDS大数据碎片
PublicationBuiltingTopicData或SubscriptionBuiltnTopicData样本较大的最常见原因是序列化的TypeCode或TypeObject,但您也可能发送了大量属性(通过7.5.19 PROPERTY QosPolicy(DDS扩展))或具有较大的ContentFilteredTopic筛选器表达式,以及其他大小可变的字段,这可能会导致样本大小较大。如果您尝试发送一个大小大于MTU的DDS样本,但尚未设置DDS级碎片,您将看到IP级碎片。
2024-07-17 14:35:09
1145
原创 Rti DDS qos
1.parent.allow_interfaces_list字符串列表,每个字符串标识一系列接口地址或接口名称。接口必须指定为逗号分隔的字符串,每个逗号分隔一个接口。例如,以下是可接受的字符串:192.168.1.1192.168.1.*192.168.*192.*ether0如果列表非空,则此“白色”列表将应用于parent.dny_interfaces_list列表之前。DomainParticipant将使用由此产生的接口列表来通知其远程参与者哪些单播地址可用于联系D
2024-07-10 10:06:12
460
原创 protobuf的使用
protobuf:是一种数据格式,独立于平台,独立于语言,是一种二进制格式,可以存储更加复杂的数据结构,比如图,树,结构体,类。使用数据时,需要从磁盘里面加载数据--->反序列化。三条数据打包成大的数据块->TLV type length 数据。数据组织,若干条数据组成为一个大包然后转为string发送出去。2.数据的网络传输 数据从服务端发送到客户端。1.持久化:把数据存储到磁盘--->序列化。接收端:string反序列化为数据元素格式。# 或者使用 -I 参数。
2024-07-09 20:23:37
231
原创 fast dds statistics 模块
这是因为子类对象在内存中实际上是包含了父类部分的,为了正确地初始化父类部分(包括成员变量等),子类构造函数会隐式地(或显式地,如果你使用了初始化列表)调用父类的构造函数。在这个例子中,你可以看到无论是隐式还是显式地调用父类的构造函数,父类的构造函数都会在子类的构造函数之前被调用。:如果你没有在子类的构造函数中显式地调用父类的构造函数,编译器会隐式地调用父类的默认构造函数(无参构造函数)。如果父类没有定义默认构造函数,而你又没有在子类的构造函数中显式调用父类的某个构造函数,编译器将报错。
2024-07-08 16:25:11
825
原创 二级指针(double pointer)或称为指针的指针
在C++中,二级指针(double pointer)或称为指针的指针,是一个指向指针的指针。这意味着二级指针存储的是一个指针的地址,而这个指针又指向另一个地址。
2024-04-06 15:12:47
407
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人