- 博客(149)
- 收藏
- 关注
原创 二进制分析
system call trace(strace, 系统调用追踪)是基于pstrace系统调用的一款工具,strace通过在一个循环中使用PTRACE_SYSCALL请求来显示运行中程序的系统调用(也称为syscalls)活动相关的信息以及程序执行中捕捉到的信号量。object dump是一种对代码进行快速反编译的简洁方案,在反编译简单的,未被篡改的二进制文件时非常有用,但缺陷是需要依赖ELF节头,并且不会进行控制流分析。
2026-02-14 18:48:52
75
原创 ROS2资源汇总
ros2 论坛:https://discourse.openrobotics.org/ros2 官方文档:https://docs.ros.org/
2026-01-25 22:15:13
270
原创 FastDDS中的Qos配置
这个配置下面指定了HistoryQosPolicy和ResourceLimitsQosPolicy这两个Qos在DataWriters和DataReaders端的配置,也可以直接在topic下配置。
2026-01-19 14:22:42
906
原创 软件测试中的ST/IT/UT/DT
对于 UT:✅ 使用依赖注入便于mock✅ 每个测试一个断言✅ 测试异常和边界情况❌ 避免测试私有方法❌ 不要依赖外部服务对于 IT:✅ 使用测试数据库(内存数据库或容器)✅ 测试真实的集成点✅ 清理测试数据❌ 避免测试UI层❌ 不要测试外部服务的内部逻辑对于 ST:✅ 模拟真实用户场景✅ 包含性能和安全测试✅ 在不同环境中测试❌ 避免过多的E2E测试❌ 不要依赖不稳定的外部服务自动化一切可以自动化的测试保持测试快速反馈。
2026-01-09 16:11:05
1266
原创 SMACC2框架原理
正交区域(Orthogonals):正交区域在整个状态机的生命周期中持续存在。从概念上讲,可以将它们视为构成机器人的硬件设备的模块化插槽。每个正交区域应至少包含一个客户端,并且可以包含多个客户端行为。有关正交区域的更多信息,请点击此处。分层状态机架构,是一种用于设计和实现复杂系统(特别是实时系统、嵌入式系统和机器人系统)的软件架构模式。只有叶子状态应该有正交区域。
2025-12-14 19:37:33
861
原创 ROS中msg到idl的处理
em模块各接口文档:http://www.alcyone.com/software/empy/home/max/projects/empy/doc/em.html#usage。执行的python代码拷贝到:/opt/ros2/x86_64/lib/python3.8/site-packages/rosidl_adapter。经过rosidl处理之后存放在$(build)/<包名>/rosidl_adapter/<包名>/msg/idl文件名.idl。2. 只有注释符#没有注释内容。1. 注释前后各有空格。
2025-11-13 14:03:30
288
原创 ROS2的优化
通信层:DDS 选型与 QoS 调优。资源层:线程、内存、CPU 的精细控制。实时性:内核配置与优先级管理。工具链:性能分析与编译优化。可以通过 “ros2 doctor” 和 “ros2 param list” 检查系统状态,逐步应用上述策略并验证效果。
2025-08-12 10:50:25
1020
原创 C++代码层面优化
优化数据结构:使用std::unordered_map替代std::map(O(1) vs O(log n)查找)。锁优化:使用std::mutex、std::atomic或无锁数据结构(如std::lock_guard)。缓冲I/O:使用std::ios::sync_with_stdio(false)加速C++流I/O。减少拷贝:使用std::move、引用传递或std::string_view避免不必要拷贝。异步编程:使用std::async、std::future处理异步任务。
2025-08-05 17:28:21
694
原创 GoogleBenchmark用法
Google Benchmark 是一个功能强大的 C++ 微基准测试库,用于精确测量代码的性能。它由 Google 开发和维护,提供了丰富的功能来支持各种基准测试场景,从简单函数的性能测量到复杂的参数化测试。它通过自动调整迭代次数以确保统计稳定性,提供了高精度的性能数据。自动化迭代:动态确定运行次数以获得稳定的统计结果。多种时间测量:支持 CPU 时间、墙钟时间(Wall Clock Time)以及进程总 CPU 时间。灵活的参数化:支持参数化测试,方便测试不同输入规模或配置。
2025-07-19 15:06:07
871
原创 Linux下代码调试
手动实现堆栈回溯,通过直接读取栈帧(stack frame)和程序计数器(PC)。使用 libdwfl(或 libelf)动态解析 PC 地址为函数名,需链接 libdw 和 libelf。具体原理就是读取栈指针(SP)并遍历栈帧,获取程序计数器(PC)值。栈帧结构包含返回地址(PC)、寄存器等,需解析栈顶。PC 地址(例如 0x0000555555555186)需要结合调试符号解析为函数名和行号。函数捕获调用堆栈,会显示调用栈的地址、函数名(如果有调试符号)、文件和行号。),依赖调试符号(-g)。
2025-06-04 16:04:38
1108
1
原创 ros2 bag录包与播包原理
ros2 bag用于记录和回放ros2的发布消息,允许用户记录不同topic的消息流以及服务和服务响应,还可以记录节点间的参数和日志信息,对于调试,数据分析,以及重现实验场景非常有用。播包用于播放之前记录的bag文件,播放过程中通过先前记录的bag消息会被发布到ros2对应的topic中,就像这些消息是在实时生成一样。
2024-12-29 11:39:31
1569
原创 FastDDS之DataSharing
本文详细记录Fast DDS中Data Sharing的实现原理和代码分析。DataSharing的概念:FastDDS中在同一台机器内通过利用共享内存共享DataWriter和DataReader的history实现通信加速,这种方式避免了传输层中的任何开销,有效减少了数据在DataWriter和DataReader之间复制所带来的额外负担。Fast DDS 使用DomainParticipant的来识别运行在同一主机上的其他participant。如果两个participant的。
2024-11-19 22:27:47
1615
原创 FastDDS之进程内通信
Fast DDS 允许在同一进程内的实体之间加快通信,避免了传输层带来的任何开销。进程内通信通过发布者(Publisher)直接调用订阅者(Subscriber)的接收函数,不仅避免了传输过程中的数据复制或发送操作,还确保了消息能够被订阅者接收到,从而绕过了确认机制。如果在网络运行过程中网络接口有所更改,那么新创建的DomainParticipant将会得到一个新的GUID前缀,并且系统会认为它是在不同的主机上运行。进程内的通信默认是开启的,也可以通过配置XML开启。来识别在同一进程中运行的对等方。
2024-11-19 16:40:06
699
原创 FastDDS服务发现之EDP的收发
EDP对象的创建在中有详细介绍,PDP的收发在中有详细介绍,本文主要分析Simple EDP报文的发送和消息接收。
2024-11-06 15:10:34
1496
原创 UML之用例视图
用例图是表示一个系统中用例与参与者之间关系的图,它描述了系统中相关用户和系统对不同用户提供的功能和服务。对于用户而言,最关心的是一个系统具有的功能与呈现的外部特性,而并不十分关注实际过程及实现方法本身。用例视图就相当于从用户的视角来描述和建模整个系统,分析系统的功能和行为。用例视图中主要元素包括参与者,用例以及元素之间的关系,此外,用例视图还可以包括注释和约束,也可以使用包将图中的元素组合成模块。用例视图用于展示参与者和用例。
2024-10-24 22:20:43
1115
原创 ROS2中的插件机制
ros中提供了动态加载class的方式。这样可以做到应用代码和class所在的so解耦合。一般情况下,使用dlopen动态加载C风格函数,C++风格的类无法直接使用dlopen加载,通过ros中的这种方式,可以做到动态加载。其思想核心仍然是通过dlopen加载so,然后通过静态对象的构造将外部类进行初始化,这一步中,将需要动态加载的class类作为模板参数加载到进程地址空间中,然后,通过wrapper类将外部可以调用的回调函数绑定到class的成员函数中,即可实现动态加载。
2024-09-08 22:37:23
675
原创 Linux网络使用与性能分析
比如,传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。一旦网络包超过 MTU 的大小,就会在网络层分片,以保证分片后的 IP 包不大于 MTU 值。MTU 越大,需要的分包也就越少,自然,网络吞吐能力就越好。有了 TCP/IP 模型后,在进行网络传输时,数据包就会按照协议栈,对上一层发来的数据进行逐层处理;然后封装上该层的协议头,再发送给下一层。
2024-09-06 11:41:12
655
原创 UML之时序图
用例是一个系统提供给参与者的外部接口,代表着一系列交互步骤,最终目标是要实现参与者的目标。用例的表达有条简洁至上的原则,即越朴素越好,越不涉及代码越好,而且用力很难与类,接口等元素一一对应。因此,为了方便开发人员统筹和协调各个类和对象,UML对用例所概括的参与者的系统之间的交互行为提供了表达方式,时序图就是一种。时序图是按时间顺序显示对象交互的图,具体来说,他显示了参与交互的对象和所交换信息的先后顺序,用来表示用例中的行为,并将这些行为建模成信息交换。
2024-08-29 11:13:30
2072
原创 RTPS协议之PSM:UDP/IP
RTPS协议都会给内置的entities定义entity IDs。PIM 指定参与者的 EntityId_t 有预定义的值 ENTITYID_PARTICIPANT。所有预定义的实体 ID 对应的 PSM 映射出现在下表中 - 由 RTPS 协议完全预定义的 EntityId_t 值中。在这个主版本(2)中,这些实体 ID 的含义不会改变,但是未来的次要版本可能会增加额外的保留实体 ID。
2024-08-27 11:18:05
1698
原创 RTPS协议之Messages Module子消息
这个子消息允许Reader通知Writer它接收到的序列号和它仍然缺少的序列号。既可以用于正向确认,也可以用于负向确认(正面确认代表Reader成功接收到了某一序列号的数据,负面确认则表示Reader没有接收到某一序列号的数据,需要Writer重新发送。简单来说,正面确认就是“我收到了你的数据”,而负面确认就是“我没收到你的数据,需要你重新发送”。可能的变化包括数据对象的值的变化以及数据对象生命周期的变化。Reader通过发送AckNack消息给Writer,来表示其对Writer使用的序列号的状态。
2024-07-23 14:20:29
1515
原创 ROS2编译系统
参数来跳过某些包的编译。:通过正则表达式跳过一些包的编译,比如你要跳过所有以。:可以在一个特定的文件中列出你想跳过的包,然后用。install:每个package安装的目录。build:中间文件存放的地方。log:生成的log文件。
2024-07-16 10:57:41
2199
原创 Linux中的共享内存
Linux共享内存是一种进程间通信的方式,让不同的进程可以访问同一块内存区域。这样,一个进程可以直接读取或者修改另一进程的数据,避免了数据的复制,提高了通信效率。Linux中的共享内存被组织成一种名为“段”(segment)的数据结构,每个段都有一个全系统唯一的键值。进程可以通过这个键值来获取相应的内存段。Linux支持两种类型的共享内存:System V IPC共享内存和POSIX共享内存共享内存涉及到的主要操作有创建和连接共享内存、读写共享内存和断开和删除共享内存。
2024-07-05 19:54:45
754
原创 CI构建pipelines
CI构建可以分为几个部分:构建代码(可以是多个平台)——>UT用例 ——> 代码覆盖率 ——> 代码静态检测首先保证有可以CMakeLists.txt可以在本地正常编译业务代码和UT代码。
2024-06-25 15:11:53
1034
原创 RTPS协议之Messages Module结构
TypePurpose枚举值用于标识是什么类型的sub msg,有这些:DATA, GAP, HEARTBEAT, ACKNACK, PAD, INFO_TS, INFO_REPLY, INFO_DST, INFO_SRC, DATA_FRAG, NACK_FRAG, HEARTBEAT_FRAGTime_t时间戳,至少到ns,TIME_ZERO,TIME_INVALID TIME_INFINITECount_t保存递增的计数,用于识别重复消息用于在参数列表中唯一标识参数的类型。
2024-05-29 14:14:54
1512
原创 RTPS协议之Behavior Module
主要描述rtps实体的动态行为,主要记录rtps writer和rtps reader之间的有效的序列消息交换,和这些消息交换的时间限制。
2024-05-29 14:12:07
1560
原创 Fast DDS中的xml配置
Qos (Quality of Service)用于指定服务的行为,允许用户指定每个实体怎样表现或运行。通过XML文件(Profiles)来配置或者在代码中直接指定。
2024-04-23 21:55:36
2792
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅