【ROS学习】(十一)常见问题及解决方案
2016-05-01 21:32
211 查看
如何多次启动相同名称的节点
这个问题一般出现的场合有几种,需要用一份驱动程序打开多个相同的传感器,或者不同计算机通过协作,可能有节点和话题的名称产生冲突。
对于这种情况,ROS给出了很简便的解决方案,要做的只是采用launch文件启动节点,在launch文件中使用名字空间,将一个节点用两个同的节点名称来启动。例如我们有一个GPS传感器的驱动程序节点,节点名称为GPS_Driver,如果我们需要启动一个GPS传感器时,我们只需要写这样一个启动文件
这样,使用同一份驱动程序,通过配置两个不同的串口,就能够启动两个不同的GPS传感器。运行上面的launch文件,启动的两个GPS_Driver将被冠上’ns’指定的名字空间,使用命令rosnode list可以看到
需要注意的是,这样的方式启动节点后,该节点发布的话题也将被加上名字空间,因此可能会导致有的接收节点无法接收正确的话题消息,可以使用remap消息名称的方式来解决。例如,rtk gps原先的话题名字为/fix,加上名字空间变为/rtk/fix,有个名为“process_rtk_gps”的需要接收rtk gps的定位信息,但是该程序源代码中接收的话题为/fix,这时候我们不需重新修改和编译将该程序,只要在启动该文件时remap消息名称即可,例如
更改msg文件后重新编译不起作用
这个问题一般在这两种情况下出现,一是直接从其他计算机上拷贝的程序包放在本地计算机上编译时,二是对于本地已经写好的程序修改了msg文件,不起作用的意思是原本正常使用的msg文件失效了,就算重新编译,源程序也无法正确使用新编译的msg文件,例如原先有个程序节点发布了自定义消息my_msg,后来更改了my_msg.msg里的内容,重新编译后,该节点发布的my_msg使用命令rostopic echo 就无法输出了。
这中情况的解决方案是,注释掉CMakeList.txt中生成可执行文件的部分,先编译msg文件,再将源程序编译成可执行文件。
这个问题一般出现的场合有几种,需要用一份驱动程序打开多个相同的传感器,或者不同计算机通过协作,可能有节点和话题的名称产生冲突。
对于这种情况,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_Driver garmin/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文件,再将源程序编译成可执行文件。
相关文章推荐
- 第九周学习进度
- Android Handler的内部原理
- Poj 2255 Tree Recovery【dfs遍历树】
- android.os.NetworkOnMainThreadException
- SINGLETON(单例模式)
- poj 1228(稳定凸包)
- 线程
- python里的re模块
- JDK源码解析之StringBuilder和StringBuffer
- 十三、迭代器设计模式
- DP 动态规划 Problem K 1011 蜜蜂爬蜂房
- Redis主从复制
- 数据库的备份与还原(vb.net代码篇)
- Ellipse
- Ellipse
- 反射 Reflect
- leetcode——133——Clone Graph
- 文件编译执行的4个阶段
- 高级指针概念和应用
- java并发编程(5)--线程池的使用