node
node标签会指定一个准备运行的ROS节点,它实现了同时启动多个ROS节点的功能。
<node pkg="ego_planner" name="drone_$(arg drone_id)_traj_server" type="traj_server" output="screen">
<remap from="~planning/bspline" to="drone_$(arg drone_id)_planning/bspline"/>
<param name="traj_server/time_forward" value="1.0" type="double"/>
</node>
1.1 参数解析
pkg:节点所在功能包的名称
name: 节点运行时的名称
type: 可执行文件(节点)的名称
screen: 是否将节点信息输出到屏幕,如果不设置该属性,则节点信息会被写入到日志文件,并不会显示到屏幕上
remap: 实现节点名称的重映射,每个remap标签包含一个原始名称和一个新名称,在系统运行后原始名称会被替换为新名称
param: 在工程项目开发中,我们常常需要改变程序变量的一些参数,如果在程序中赋值,我们每次修改参数都需要重新编译程序,降低了开发效率,而param标签则可以实现传递参数的功能,它可以定义一个将要被设置到参数服务器的参数
1.2 代码备注
- 三个名称的区别:pkg是功能包的名称。type节点名指的是,生成的可执行文件名字。在cmake里可以查到生成的对应文件。生成好的节点文件放在devel/lib/ego_planner目录中。一个功能包下可以有多个节点文件。name:如果此处node标签下的name属性与init()中的节点名不一致,那么node标签的name属性会覆盖init()中的节点名
- $(arg drone_id)是一个参数占位符,用于在运行时根据传入的drone_id参数动态地生成节点的名称
- ~: 私有命名空间,哪个节点调用,就是用该节点名代替~
- remap:
<remap from="chatter" to="hello">
你有一个节点订阅了「chatter」主题,但是你只有一个节点发布「hello」主题,而「hello」和「chatter」的类型相同,所以我们可以将「chatter」简单地替换为「hello」,从而实现订阅「hello」主题。例如,在.cpp文件中,存在代码:
bspline_pub_ = nh.advertise<traj_utils::Bspline>("planning/bspline", 10);
include
它可以导入其他 roslaunch 的启动文件到当前 include 标签所在的位置。
<include file="$(find ego_planner)/launch/advanced_param_exp.xml">
<arg name="drone_id" value="$(arg drone_id)"/>
</include>
- 项目中使用绝对路径不太方便,可以使用 find 来查找。
arg
- arg:启动时参数,只在启动文件 launch 中有意义
- param:运行时参数,存储在参数服务器中