我们接着上一节的继续,上一节主要讲了ROS最重要的部分也是优势最明显的部分----他的通信机制,包括消息传递机制和服务调用机制,两者的异同在上一节中也已经详细介绍到了,那么在我们了解了这些之后呢,我们如何来调用这些节点,大概可以分为两种方式,一种是终端命令行的方式,另一种就是本节要着重介绍的启动文件的方式。
启动文件的方式相对于直接在终端命令行中直接输入命令相比有明显的优势,尤其是在复杂的机器人系统中,我们所调用的节点往往比较多,在终端命令行下输入命令比较繁琐,但为了保持行文的完整性我们在这里也简单总结一下命令行方式的调用方法。
一、终端命令行
ROS软件包命令:
rospack list 列出系统中所有软件包的目录
rospack findpackage-name 寻找一个包的目录
roslspackage-name 查看软件包的目录下的文件列表
roscdpackage-name 进入软件包的目录
节点管理器命令:
roscore 启动节点管理器,在整个过程中一般都会先运行这个命令并保持窗口一直运行
roslaunch 一次性启动多个节点,如果没有节点管理器,将会默认启动新的节点管理器,如果有就用现在的
注:节点管理器在关闭后重新启动挂在他上边的节点必须也得重新启动
启动节点命令:
rosrun package-nameexecutable-name 启动节点 package-name是功能包的名称 executable-name该软件包中的可执行文件的名称
注://rosrun 没有什么“神奇”的:它只不过是一个 shell脚本,能够理解 ROS 的文件组织结构,知道到哪里能找到与给定包名称对应的可执行文件。一旦它找到你要的程序,rosrun 就会正常启动节点。例如,如果你真的想要,你可以像执行任何其他程序一样直接执行 turtlesim_node:/opt/ros/indigo/lib/turtlesim/turtlesim_node
这里还要强调一点,通过节点管理器注册成为ROS 节点发生在程序的内部,而不是通过 rosrun 命令。
rosnode list 查看节点列表
rosnode infonode-name 查看节点的信息
rosnode killnode-name 终止节点 //与直接在节点运行的终端下用ctrl+c的区别:ctrl+c也可以终止节点,但不能在rosnode列表中提出该节点,如果想剔除该节点必须再运行rosnode cleanup
注:节点在终止之后在重新启动不会对其他节点有什么影响,即使该节点正在传输数据过程中终止也会在重新启动后重新链接传输数据
话题和消息相关命令:
rqt_graph 以图的形式查看这些节点的关系
rostopiclist 获得当前活跃话题列表
rostopic echotopic-name 该命令将会在终端里显示出指定该话题发布的任何消息
rostopic hztopic-name 查看消息发布的频率
rostopic bwtopic-name 查看这些消息占用的带宽
rostopic infotopic-name 查看话题的信息
此命令输出为
Type:(消息类型)
Publishers:
Subscribers:
rosmsg showmessage-type-name 查看消息类型
rostopic pub –r rate-in-hztopic-name message-type message-content 用命令行发布消息 例:rostopic pub –r 1/turtle1/cmd_vel geometry_msgs/Twist ’[2,0,0]’ ’[0,0,0]’
与服务相关的终端命令
列出所有服务 reservice list
查看提供服务的节点 rosservicenode service-name
查找服务的详情 rosserviceinfo service-name
查询服务的数据类型 rossrv showservice-data-type-name
例:rossrv showturtlesim/Spawn
输出结果为:
float32 x
float32 y
float 32 theta
string name
---
string name
这里横线之前为请求项的数据,横线之后的为响应项的数据
从命令行调用服务 rosservice call service-name request-content
例:rosservice call /spawn 3 3 0 Mikey
该命令创建了一个位置为(3,3)角度为0,名字为Mikey的新海龟,他的默认命名空间为Mikey他是一个新的节点
与参数相关的终端命令:
rosparam list 查看参数列表
rosparam getparameter_name 查询某个参数的值
rosparam setparameter_name parameter_value 设置参数的值
rosparam dumpfilename namespace 创建参数文件,使得参数以yaml的方式存储在命名空间中
rosparam loadfilename namespace 加载参数文件,将参数文件中的参数读入到计算机中
二、启动文件
调用驱动文件的命令:
roslaunchpackage-name launch-file-name
package-name包名称 launch-file-name启动文件名称
启动文件书写方式:
1.主体框架:
……
2.定义节点:
pkg=”package-name” type=”executable-name” name=”node-name”/> 或 pkg=”package-name” type=”executable-name” name=”node-name”
3.节点属性
respawn="true" 为真时说明在节点停止时,relaunch会重新启动该节点
output=”screen” 意思是将标准输出到屏幕上而不是记录在日志文档中
required=”true” 证明该节点为必要节点,当必要节点终止时,roslaunch会终止所有其他活跃节点并退出。
launch-prefix=”xetrm-e” 为该节点维护独立的窗口
ns=”namespace” 该节点的命名空间
4. 命名重映射
from=”original-name” to =”new-name” /> 5. 包含其他文件 file=”$(find package-name)/launch-file-name” /> 或 6. 启动参数 name=”arg-name” default=”arg-value” /> 或 name=”arg-name” value=”arg-value” /> 定义参数并赋值 default可以通过命令行赋值来覆盖默认值,value不可以覆盖 获取参数值${arg arg-name} 参数值的命名地方说明了该参数的作用域,如果该参数声明在节点内则说明该参数属于该节点,在其他节点内就没有该参数的相关内容,如果某参数声明在节点外就证明在该启动文件中所有的节点内该参数都有效,如果要将其他启动文件中的参数引入到该节点中,那么我们需要做在启动文件include中重新引入该节点。 7.创建组 … 组的意义在于将一个组内的节点共用同样的命名空间 8. 在启动文件中定义参数
name="param-name" value="param-value" /> 这个与之前6中的参数不同之处在于。此参数存储在参数服务器中,每个活跃的节点都可以通过ros::param::get函数来获取parameter的值,用户也可以通过rosparam来获取parameter的值,而argument只在启动文件内存在意义,他的值不能被节点直接获取。 本文显得有些啰嗦而且散碎的知识点太多,但本文的主要目的是在于希望能够将如何调用节点这件事描述清楚,通过命令行和启动文件两种方式进行。我们借用本节也将常用的ROS命令行命令给梳理了一下,方便大家查阅。老铁们,本文到这里也就结束了,欢迎大家批评指正!咱们下期再见。