【ROS学习】(十一)常见问题及解决方案

来源:互联网 发布:穿越火线m4a1千变数据 编辑:程序博客网 时间:2024/05/03 16:29
  • 如何多次启动相同名称的节点

这个问题一般出现的场合有几种,需要用一份驱动程序打开多个相同的传感器,或者不同计算机通过协作,可能有节点和话题的名称产生冲突。
对于这种情况,ROS给出了很简便的解决方案,要做的只是采用launch文件启动节点,在launch文件中使用名字空间,将一个节点用两个同的节点名称来启动。例如我们有一个GPS传感器的驱动程序节点,节点名称为GPS_Driver,如果我们需要启动一个GPS传感器时,我们只需要写这样一个启动文件

<launch>    <node ns="rtk" pkg="GPS_Driver" type="GPS_Driver" name="GPS_Driver">    <param name="port" value="/dev/ttyS0" />    </node>    <node ns="garmin" pkg="GPS_Driver" type="GPS_Driver" name="GPS_Driver">    <param name="port" value="/dev/ttyS1" />    </node></launch>

这样,使用同一份驱动程序,通过配置两个不同的串口,就能够启动两个不同的GPS传感器。运行上面的launch文件,启动的两个GPS_Driver将被冠上’ns’指定的名字空间,使用命令rosnode list可以看到

rtk/GPS_Drivergarmin/GPS_Driver

需要注意的是,这样的方式启动节点后,该节点发布的话题也将被加上名字空间,因此可能会导致有的接收节点无法接收正确的话题消息,可以使用remap消息名称的方式来解决。例如,rtk gps原先的话题名字为/fix,加上名字空间变为/rtk/fix,有个名为“process_rtk_gps”的需要接收rtk gps的定位信息,但是该程序源代码中接收的话题为/fix,这时候我们不需重新修改和编译将该程序,只要在启动该文件时remap消息名称即可,例如

<launch>    <node pkg="process_rtk_gps" type="process_rtk_gps" name="process_rtk_gps">    <remap from="rtk/fix" to="/fix"/>    </node></launch>

  • 更改msg文件后重新编译不起作用

这个问题一般在这两种情况下出现,一是直接从其他计算机上拷贝的程序包放在本地计算机上编译时,二是对于本地已经写好的程序修改了msg文件,不起作用的意思是原本正常使用的msg文件失效了,就算重新编译,源程序也无法正确使用新编译的msg文件,例如原先有个程序节点发布了自定义消息my_msg,后来更改了my_msg.msg里的内容,重新编译后,该节点发布的my_msg使用命令rostopic echo 就无法输出了。
这中情况的解决方案是,注释掉CMakeList.txt中生成可执行文件的部分,先编译msg文件,再将源程序编译成可执行文件。

0 0