最近没啥可写博客了的,而且自己的毕业设计刚好是ROS的SLAM+MoveIt相关的,怕写的太多论文查重没法通过。

最近有小伙伴联系到我,问了我八个ROS问题,我觉得很有意义,所以在这里给大家整理一下供大家一起学习。

大家在学习有困惑可以发送问题给我(1692697820@qq.com),我会找时间整理并回复大家。也欢迎大家在“泡泡”里面进行提问~

这里我们来讲解第一个问题,如何进行时间同步操作。


说到这个问题,我们先来了解下什么是时间同步?

​ 时间同步,从根本上是指两个设备的的时间要处于一模一样的状态,在多个设备组成的分布式系统之间,通过时间的反馈我们可以获取很多有用的信息。比如说我们当前的一个分布式网络中三台设备,这三台设备之间的要相互进行数据传输的操作。我们做出规定,第1s的时候,设备1发出一个数据给设备2和设备3;第2s的时候,设备2发出一个数据给设备1和设备3;第3s的时候,设备3发出一个数据给设备1和设备2。假若在这个过程当中我们没有收到数据,那么这是数据丢失重新发送或者舍弃即可。但是出现了本来应该是在第2s出现的数据,却在第4s的时候出现,那么你一定要注意是不是时间同步的问题。

​ 时间同步对于ROS系统来说至关重要,我们现在有个雷达车在进行导航的时候,第1s的雷达数据和第1s的里程计数据肯定是要对应的。但是如果第1s的雷达数据在第2s的时候才发出来,这很有可能会导致撞墙的情况出现。不过你放心,这种情况在ROS系统下是会给你报错的。

​ 上面的这个问题,是我在跑完古月老师mbot仿真之后,尝试将仿真的参数移植到真实机器人出现的情况。机器人上是发布激光雷达数据、发布IMU数据、发布里程计数据,同时订阅cmd_vel速度控制话题,有关gmapping的算法在我的电脑端运行(另外一台装有ROS系统的电脑)。

​ 这个时候看到报错内容, Costmap2DROS transform timeout. Current time: 1631848699.4749, global_pose stamp: 1631848698.9679, tolerance: 0.5000(Costmap2DROS变换超时。当前时间:1631848699.4749,global_pose stamp: 1631848698.9679,公差:0.5000)。

​ 这个时候我犯了三个错误。

​ 首先是时间同步。机器人的主控和我电脑,两台设备的时间不一样。我的电脑设置的是网络获取时间,机器人主控那里因为不连接网络,所以它的时间是靠自身主板的RTC时钟芯片来维护的,当机器人主控板联网后,这个时间会自动更新。网上当时查的方案,将两台电脑的时钟服务器配置成同一个,让他俩都是从一个地方获取时间,就可以解决这个问题。

​ 第二个问题是网络带宽。我在机器人上面装了一个4G路由器,买的时候没有看参数,网络带宽带不动。这个问题还是最后才发现的。带宽带不动就出现了网络延时的状况,从而导致了数据延时。因为我是将机器人的雷达、陀螺仪、底盘数据发送到电脑端,电脑端运行建图导航程序再发布速度指令返回给机器人,如果出现网络状态差的情况,数据传输的延时会对我们的机器人产生很大的影响,毕竟建图导航对数据的实时性要求是很高的。

​ 那么这个问题是怎么被发现的呢?我在转动真实机器人的时候,雷达“归位”大概有3s左右的一个时差,但是在本地测试的时候是十分流畅的。这个时候我打开了ping命令,通过ping命令的延迟看出来。事实很明显,当终端每次产生上面警告的时候,ping命令的时间差不多在2000ms+。

​ 第三个问题是频率。这简直就是一个隐藏性的bug,我的雷达是星秒的,雷达数据的频率是在30Hz;陀螺仪是WT61CTTL,自己写的驱动,发布频率是在50Hz;下位机也是自己做的,发布轮子Odom的频率是50Hz。雷达到底盘、陀螺仪到底盘这两个的静态tf发布频率是100Hz,这些完全没有问题,却最后机器人就是跑不起来。

​ 雷达的数据30Hz,没有任何问题。陀螺仪这里,因为是我自己写的驱动功能包,其实就是串口读取数据然后以imu发布出来即可,这里出现了数据阻塞。陀螺仪串口采集的频率是100Hz,我以50Hz的频率发布数据,然后就出现了数据“压着”的情况。我本来以为数据会自己丢到的,结果数据是在压着,结果就是随着时间的推移,陀螺仪数据延迟越来越大,毫无实时性可言。

​ 你以为到这里就结束了吗?不,并没有。我把gmapping里面的一些数据参数订阅频率调的比较大,还是不行,然后报错还是上面的内容,这简直就是神坑。怎么调试的我也不说了,归根结底就是一句话,根据逻辑层次,最上层到最下层,频率最好是递减的。如果有有个“最大公因数”那就更棒了!

​ 时间同步所保证的是设备之间数据传输的可靠性、稳定性、实时性,这个对于真实机器人来说至关重要。