42 posts
中间件 · 导航 · 真机工程
节点怎么起、TF 怎么查、Nav2 卡在哪——把算法接到能跑的系统上时记下的东西。
ContentFilteredTopic:把过滤下推到中间件还是应用层
对比订阅端丢弃、应用层条件判断与 DDS 内容过滤的 CPU/带宽边界,说明表达式能力与发现时序限制;用高频率噪声话题与延迟尖峰验收过滤位置选择。
ROS 2 Action 取消语义:收到 cancel 不等于执行器已经停下
梳理 goal handle 状态机、取消回调与硬件停止之间的异步边界;用可中断执行循环、截止时间和终态发布构建契约并以注入验收。
ROS 2 大消息内存路径:intra-process、loaned message 与 shared memory 不是一回事
以 4K 图像和点云管线为例,逐段核对 rclcpp、RMW 与进程边界上的所有权、分配和真实拷贝。
ROS 2 回调里调服务:Future 的完成回调为何会死锁
在 ROS 2 Jazzy 中拆开同步服务死锁的等待环,用 call_async、callback group 和可重复命令验证响应路径。
Python Launch 重构:部署图,而不是第二套业务代码
按子系统拆分、参数外置、顶层组装;用冒烟守住入口,把业务逻辑赶回节点。
tf2 时间查询:报错是分诊,不是噪音
传感器查 TF 用消息 stamp;外推失败指向时钟、缓存与拓扑;禁止无限重试掩盖。
Nav2 行为树:把失败策略写在决策层
BT 管重试与恢复;用可观察条件,避免无界重试与空转。
Composition:进程边界换通信成本,不是架构炫技
组件化部署要算清 intra-process 收益与崩溃隔离代价;接口契约与加载诊断同等重要。
Lifecycle Node:把资源生命周期显式化,而不是构造即抢设备
configure/activate/cleanup 对称;关键路径用生命周期,工具节点保持简单。
传感器 QoS:最新帧语义,不是默认可靠
Best Effort + 小 depth 服务实时流;用 topic info -v 证明无数据可纯由 QoS 造成。
可观测性与 Tracing:把延迟打到时间线
日常用诊断与结构化日志;攻坚用短时 tracing 回答执行器占用与回调因果。
Launch 冒烟测试:合并前抓住图断裂
launch_testing 断言进程、端点与 lifecycle;不替代算法测,但阻止集成回退。
ROS 2 CLI 分诊:一条可复现的证据链
从节点图、QoS、频率到时间戳逐步收敛;echo 是显微镜,不是结论。
Gazebo Bridge:映射是接口契约,不是「开了就有」
话题名、类型、QoS、时钟与 TF 职责一次对齐;桥配置进版本库,最小回显再叠算法。
硬件抽象:从独立驱动节点走到 ros2_control
用底盘多电机同步与急停复用讲清为何需要硬件接口,以及 Controller Manager / Hardware Interface / Resource Manager 如何分工。
多机发现与命名:先定协作模型,再谈话题
隔离 domain 或同域 namespace 二选一;ROS_DOMAIN_ID、发现与带宽在算法之前。
Nav2 调参:因果顺序比旋钮百科重要
先定位与代价地图,再规划,最后控制器;一次一簇并量化成功标准。
TF 广播模式:一帧一主,stamp 随源
禁止多父抢帧;静态/动态分工;职责表进仓库,MR 改广播必须改表。
定时器与 Watchdog:频率声明不等于截止时间
回调预算 + 超时安全停;跨节点心跳对齐 QoS 与时钟;看门狗动作表驱动。
QoS 深读:兼容矩阵、持久性与数据类剖面
按数据类建剖面表;用 deadline 让沉默可观测;不兼容匹配常常是静默的。
DDS 发现与 QoS:先看见彼此,再谈匹配
discovery 失败与 QoS 不兼容症状相似但修法不同;域 ID、网卡、RMW 要系统级锁定。
SROS 2 基础:默认开放图的边界
权限与密钥是部署契约;先锁关键话题,区分权限失败与 QoS 失败。
Component Container:共享 Executor 的收益与故障域
合进程换零拷贝与同调度;重回调与崩溃会连坐,按预算决定拆合。
Lifecycle Bringup:按依赖激活,而不是 Timer 睡五秒
沿硬件→状态→感知→规划的边编排;失败要挡住下游假 active。
Nav2 Progress Checker:卡死要能失败,而不能永远「运行中」
用可解释的位移窗口触发恢复;与碰撞监测分工,避免误触与永不失败。
Nav2 规划与控制:分开评价,避免互相补偿
路径质量与跟踪误差分测;选型看底盘算力,增益勿从仿真硬抄。
Nav2 Costmap 层:世界观错了就不要拧控制器
层职责单一、膨胀与足迹一致;先证明地图诚实再调跟踪。
robot_state_publisher:模型 TF 的单一真相源
RSP 专责 URDF 运动学;别与定位/Gazebo 抢边;joint 名与 sim_time 必须对齐。
URDF/Xacro:模型是硬件接口,不是 launch 补丁对象
分文件、惯性可追溯、碰撞简化;关节名与 ros2_control 对齐,错误回模型层修。
激光滤波:你在删噪声,也在删障碍
滤波改变世界模型;链路位置单一、可解释,窄门场景袋做前后对比。
图像管线 QoS:最新帧优先还是无损优先
视觉链路默认 sensor data 语义;延迟与丢帧分列度量,证明瓶颈在队列还是算法。
message_filters:对齐的是时间,不是运气
先修 stamp 与帧率;Exact/Approximate 策略、slop 与丢弃率要可监控。
静态 TF 与动态 TF:语义不同,别混发
外参冻结为 static;定位与关节走动态;晚加入与 cache 行为截然不同。
Diagnostics Aggregator:把健康状态收成可行动的树
稳定命名、诚实级别、超时与降级联动;诊断是运维接口。
rosbag 采集策略:证据优先,而不是全量备份
按假设分层录包;TF/参数/时钟与感知带宽分开设计,回放要对齐 QoS。
仿真时钟与 use_sim_time:域一致比算法更先验
仿真/回放/真机分清时钟域;混用是 TF 与同步器间歇失败的主因。
命名空间与 Remap:可复制的图,而不是全局话题平原
节点内相对名,launch 推前缀;绝对名白名单;remap 是适配器不是架构。
Launch:XML/YAML 与 Python 的分工,不是信仰站队
稳定子图用声明式,条件装配用 Python;团队默认一种,迁移只换装配层。
参数声明:配置契约,而不是静默默认
declare 定类型与默认;动态参数写清副作用;yaml 与声明防漂移。
Executor 与回调组:延迟从哪来,为什么加线程救不了
用互斥回调组与阻塞 I/O 解释卡顿;多线程不是开关,预算与有界队列才是。
接口设计:单位、演进成本与可机器判断的错误
msg/srv/action 按演进成本定价;单位、坐标与错误码写进契约。
通信原语:Topic、Service、Action 的代价边界
从背压、失败可见性与可取消性选原语;演示能通的选择,产品期会卡死。