【ROS2】 忽略局域网多机通信导致数据接收的bug

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

本地记录一次ros2开发中的bug纠错。

之前系统地学习过ros1,由于ros1中需要实现多机通信需要配置,现在正在做一个ros2的项目,也没有怎么学就直接上阵了,还不知道ros2无需配置就可以实现局域网内多机通信,所以导致了如下的离谱bug。

ros2中 接收数据异常,订阅一辆小车的位姿会出现在两点反复跳跃,小车不受控制等等bug,甚至可能出现明明本地什么ros节点都没有启动,但是却能使用ros2 topic list查看到一大堆话题。


一、Bug体现

情况1:订阅一辆小车的位姿会出现在两点反复跳跃,很有可能就是开启本机和局域网内其他机器同时开启小车位姿发布节点(比如同时开启了gazebo的小车仿真,那么会用两个及以上gazebo往/odom实时发布小车位姿),此时如果在本机启动一个节点来订阅小车位姿并实时rviz展示轨迹,就会出现两个gazebo中小车的实时坐标在所连成的线在rviz中画出来。此时如果两个gazebo的小车还在移动,那么就会出现z字画线(因为两个gazebo都在,然后本机rviz接收到了都会画出来,如果二者发布消息交替地到达rviz,就会形成这样的z字画线)

情况2:自己手写了一个控制节点,发布Twist消息,然后局域网另外一个主机在使用键盘控制节点也在发布Twist消息,那么二者发布的Twist消息就会交替执行,表现的效果就是小车不受控制

情况3:也是同样的情况,同一局域网下其他主机开启了ros节点,在本机就可以看到话题信息


二、总结及解决方法

ros2支持同一局域网下ros节点的通信,如果发现有其他机器在运行相同功能包节点(尤其是同一个项目组连上同一个wifi然后使用同一份代码,共同调试同一份bug时,如果忘记局域网ros2的通信功能就会越调试"bug"越多,而且还会感到疑惑,为什么有的bug会出现的不稳定,明明复现条件的一样,还会具有随机性),发布相同话题的数据来进行干扰.

除了小组成员互相沟通,关掉多余的ros节点,还可以参考这篇文章https://blog.csdn.net/aibingjin/article/details/123865963,修改设置好当前主机的ros控制域id,避免出现上面的bug

可以在终端或者.bashrc内设置(二选一即可)

bash 复制代码
$ export ROS_DOMAIN_ID=5 #当前终端的节点控制域的id号为5

$ echo "export ROS_DOMAIN_ID=5" >> ~/.bashrc  #写入到.bashrc后,当前机器的所有ros节点的控制域id都为5
相关推荐
小此方19 小时前
「插曲:Git」企业规范篇:DevOps开发模型、Git Flow五类分支设计与测试/预发布/生产环境Bug修复及Hotfix紧急发布流程
git·bug·devops
米糕闯编程2 天前
鱼香ros2(十二)C++话题订阅与发布
开发语言·c++·ros2·话题
中文英文-我选中文3 天前
FreeRTOS 玄学Bug:调换任务创建顺序,程序时而正常、时而死机(栈溢出内存踩踏深度复盘)
bug
Keven_113 天前
BUG:UVA116
算法·bug·图论
鬼手点金3 天前
opencode-隐私优先配置
服务器·前端·javascript·bug·openclaw
朝朝辞暮i4 天前
C++ 第 36 课:Action——机械臂/VLA 非常重要
开发语言·c++·算法·ros2
itmigrate4 天前
异步请求竞态,藏在页面渲染里的隐形bug
bug
朝朝辞暮i5 天前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
朝朝辞暮i5 天前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2
朝朝辞暮i5 天前
C++ 第 38 课:线程、SingleThreadedExecutor、MultiThreadedExecutor、Callback Group
开发语言·c++·算法·ros2