Ros_运行的节点、话题、及参数、launch
(浅记一些学习ros的笔记
一、元功能包
- 作用:方便用户的安装,我们只需要这一个包就可以把其他相关的软件包组织到一起安装了。
- 首先:新建一个功能包(不添加 roscpp rospy std_msg 等依赖)
- 然后:修改 package.xml ,内容如下:
<exec_depend>被集成的功能包</exec_depend>
.....
<export>
<metapackage />
</export>
- 最后:修改 CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(demo)
find_package(catkin REQUIRED)
catkin_metapackage()
PS:CMakeLists.txt 中不可以有换行。
二、launch
- XML 文件 启动多个节点,编写一个 launch
<launch>
标签是所有 launch 文件的根标签,充当其他标签的容器,(属性之一:deprecated = “弃用声明”
launch 文件标签之 node
<node>
标签用于指定 ROS 节点,是最常见的标签,需要注意的是: roslaunch 命令不能保证按照 node 的声明顺序来启动节点(节点的启动是多进程的)
属性:(c 以后全是可选的
- pkg
- type
- name
- output =“screen|log”
- respawn =“true|false”
- required =“true|false”,如果 requried 设置为 true,则关闭后整个都是进程都得关闭
- args="xxx"传参数给节点
- ns=“xxx” 可以在节点名称加命名空间,避免重名问题,比如加了 ns=“hello”,那么 rosnode list 中可发现/hello/my_turtle
launch 文件标签之 include
代码复用
比如:
<include file="$(find 包名)/xxx/xxx.launch" ns="xx" />
launch 文件标签之 remap
话题重命名
<remap from="xx" to="xx"/>
launch 文件标签之 param
<param>
标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value 指定,也可以通过外部文件加载,在 <node>
标签中时,相当于私有命名空间。
-
name=“命名空间/参数名” 参数名称,可以包含命名空间
-
value=“xxx” (可选) 定义参数值,如果此处省略,必须指定外部文件作为参数源
-
type=“str | int | double | bool | yaml” (可选)
指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:
-
如果包含 ‘.’ 的数字解析浮点型,否则为整型
-
“true” 和 “false” 是 bool 值(不区分大小写)
-
其他是字符串
launch 文件标签之 rosparam
ps:实行 dump 操作时候,最好新建一个 lauch 文件,因为在同一个 lauch 文件中,rosparam 会率先执行,再执行 node,导致无法导出 node 的参数。
<rosparam>
标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,<rosparam>
标签在 <node>
标签中时被视为私有。
- command=“load | dump | delete” (可选,默认 load) 加载、导出或删除参数
- file=“$(find xxxxx)/xxx/yyy…” 加载或导出到的 yaml 文件
- param=“参数名称”
- ns=“命名空间” (可选)
launch 文件标签之 group
<group>
标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间
1.属性
- ns=“名称空间” (可选)
- clear_params=“true | false” (可选) 启动前,是否删除组名称空间的所有参数(慎用…此功能危险)
2.子级标签
- 除了 launch 标签外的其他标签
launch 文件标签之 arg
类似函数的传参
属性有 name,可选属性 default、value、doc
<launch>
<arg name="xxx" />
<param name="param" value="$(arg xxx)" />
</launch>
三、ROS 工作空间
查看环境变量
echo $ROS_PACKAGE_PATH
计算机按照环境变量的顺序执行
三、rosrun 设置节点命名空间与重映射
- 设置命名空间:rosrun 包名 节点名 __ns:=新名称
rosrun turtlesim turtlesim_node __ns:=/xxx
ps:使用环境变量也可以设置命名空间,启动节点前在终端键入如下命令:
export ROS_NAMESPACE=xxxx
- 名称重映射: rosrun 包名 节点名 __name:=新名称
rosrun turtlesim turtlesim_node __name:=t1 | rosrun turtlesim turtlesim_node /turtlesim:=t1(不适用于python)
四、launch 文件设置节点命名空间与重映射
直接使用 node 的属性 ns 与 name 就行
五、 rosrun 设置话题命名空间与重映射
rosrun 名称重映射语法: rorun 包名 节点名 话题名:=新话题名称
六、 launch 文件设置话题命名空间与重映射
<node pkg="xxx" type="xxx" name="xxx">
<remap from="原话题" to="新话题" />
</node>
七、编码设置话题
话题名称大致可以分为三种类型:
- 全局(话题参考 ROS 系统,与节点命名空间平级)
- 相对(话题参考的是节点的命名空间,与节点名称平级)
- 私有(话题参考节点名称,是节点名称的子级)
1.C++ 实现
- 全局名称:以
/
开头的名称,和节点名称无关,比如下面设置的也是全局
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter/money",1000);
- 相对名称:非
/
开头的名称,参考命名空间(与节点名称平级)来确定话题名称
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter/money",1000);
- 私有名称:以
~
开头的名称,此时结果为/xxx/hello/chatter/money
ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter/money",1000);
2.Python 实现
- 全局话题:以
/
开头的名称,和节点名称无关
pub = rospy.Publisher("/chatter",String,queue_size=1000)
- 相对话题:**😗*非
/
开头的名称,参考命名空间(与节点名称平级)来确定话题名称
pub = rospy.Publisher("chatter",String,queue_size=1000)
- 私有:以
~
开头的名称
pub = rospy.Publisher("~chatter",String,queue_size=1000)
八、ROS 参数名称设置
- rosrun 命令行实现:** **rosrun 包名 节点名称 _参数名:=参数值
ps:一定要记得下滑线
- launch 设置参数:
可以在 node 标签外,或 node 标签中通过 param 或 rosparam 来设置参数。在 node 标签外设置的参数是全局性质的,参考的是 / ,在 node 标签中设置的参数是私有性质的,参考的是 /命名空间/节点名称。
参考 param 和 rosparam
- 编码方式
- cpp
- ros::param 设置参数
ros::param::set("/set_A",100); //全局,和命名空间以及节点名称无关
ros::param::set("set_B",100); //相对,参考命名空间
ros::param::set("~set_C",100); //私有,参考命名空间与节点名称
- ros::NodeHandle 设置参数
ros::NodeHandle nh;
nh.setParam("/nh_A",100); //全局,和命名空间以及节点名称无关
nh.setParam("nh_B",100); //相对,参考命名空间
ros::NodeHandle nh_private("~");
nh_private.setParam("nh_C",100);//私有,参考命名空间与节点名称
- Py
rospy.set_param("/py_A",100) #全局,和命名空间以及节点名称无关
rospy.set_param("py_B",100) #相对,参考命名空间
rospy.set_param("~py_C",100) #私有,参考命名空间与节点名称
九、ROS 分布式通信
ROS 对网络配置有某些要求:
- 所有端口上的所有机器之间必须有完整的双向连接。
- 每台计算机必须通过所有其他计算机都可以解析的名称来公告自己
- 先要保证不同计算机处于同一网络中,最好分别设置固定 IP,如果为虚拟机,需要将网络适配器改为桥接模式
- 修改不同计算机的 /etc/hosts 文件
从机的IP 从机计算机名 #主机端
主机的IP 主机计算机名 #从机端
IP 地址查看名: ifconfig
计算机名称查看: hostname
- 主机端 ~/.bashrc
export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=主机IP
从机端~/.bashrc
export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=从机IP