第七篇:ROS的rosrun&roslaunch、rosparam联合使用【重点】

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理

文章目录

  • 系列文章目录
  • 前言
  • 一、rosrun&roslaunch工具
    • 1.ROS功能包的介绍
    • 2.功能包自动检索
    • 3.rosrun&roslaunch的使用场景
  • 二、launch文件的功能
  • 三、2、launch文件的<>标签类型
    • 1.嵌套标签【用于启动其他模块的launch文件】
    • 2.变量标签
    • 3.标签
    • 4.是启动一个节点标签
    • 5.重映射标签
  • 四、launch文件的启动方式
    • 1.命令行的形式
    • 2.launch文件包含的形式
  • 五、设备开机自启动launch
  • 六、rosparam参数服务器的原理
  • 七、rosparam参数服务器的功能【列举、设置、获取、 删除、加载文件、写入文件】
  • 八、rosparam参数服务器的使用方法【命令行、launch、源码编程】
    • (1)方法一:命令行接口【rosrun&&rosparam】
    • (2)方法二:.launch接口【&&】
    • (3)方法三:源码编程接口【有句柄的方式(较好)、无句柄的方式】
  • 九、.yaml文件的编写【.yaml文件一般用来存放变量集】
    • (1)yaml编写规则
    • (2)通用格式
    • (3)例子
  • 十、.csv文件的编写【.csv文件一般用来存放数据集--电子表格和数据库】
    • (1)csv编写规则
    • (2)例子
    • 参考资料
  • 十一、注意事项(经验)


前言

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!

本文先对ROS的rosrun&roslaunch、rosparam联合使用做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章


提示:以下是本篇文章正文内容

一、rosrun&roslaunch工具

1.ROS功能包的介绍

ros的功能包是最小的目录单位,功能包和功能包之间不想相互嵌套【防盗标记–盒子君hzj】

2.功能包自动检索

【命令行启动】
在catkin_make和source之后,使用roslaunch命令+功能包+launch名字快速启动,不需要路径信息,补全可能反应比较慢

【launch文件启动】
在catkin_make和source之后,使用launch文件的include标签可以启动其他模块的launch ,$(find 功能包名)/文件下功能包的相对路径/XXX.launch

3.rosrun&roslaunch的使用场景

Rosrun和roslaunch的命令行相似;rosrun/roslaunch 功能包+节点名字

在ROS中可以用rosrun运行一个节点,又可以用roslaunch运行一堆节点

rosrun一般用来启动单个.py文件节点,py文件不用编译直接可以理解成节点名字

roslaunch一般用来启动多个C++ 的一堆节点
【防盗标记–盒子君hzj】
.
.
.

二、launch文件的功能

launch 文件是一个 XML 格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数,启动其他launch文件等(自启动ROS Master)【防盗标记–盒子君hzj】

三、2、launch文件的<>标签类型

根元素采用标签定义,所有的东西都要在该标签下

1.嵌套标签【用于启动其他模块的launch文件】

1、功能:当系统中有很多个launch文件的时候,可以相互包含,类似于C语言中的头文件
2、格式:

2.变量标签

launch文件内部的局部变量,仅限于launch文件使用,定义局部变量,类似于宏【防盗标记–盒子君hzj】

(1)定义格式


(2)调用格式
$(arg xxx)



注意
变量可以是参数、也可以是功能包代号

3.标签

(1)功能
	设置ROS系统运行中的参数,储存在参数服务器中

(2)设置多个参数(.yaml文件)
	介绍:使用在node文件的外部变量
	格式:
	rosparam file:参数名文件及路径
	command:操作指令
	ns:命名空间属性
【防盗标记–盒子君hzj】

(3)设置单个参数
	【尽量写在yaml文件,好修改】
	格式:
	name:参数名
	value:参数值

4.是启动一个节点标签

格式:
pkg:节点所在功能包的名称
type:节点的可执行文件名称
name:节点运行时的名称
其他参数
output:运行时吧日志输出到屏幕上或者存起来
respawn:节点失效的时候重新启动
required:应答数据
ns:命名空间属性
args:节点的输入参数(若是启动rviz,这就是.rviz的路径和文件名)

【防盗标记–盒子君hzj】

5.重映射标签

(1)功能:重映射ROS中的计算图资源的命名(类似于重命名)
(2)格式:to="/A/B/C(现在重新命名的话题)"
(3)from:原话题名
(4)to:重映射现在的话题名
(5)弊端:使用重映射后调用的环境变量可能找不到了

四、launch文件的启动方式

1.命令行的形式

在launch文件夹开一个终端【roslaunch 文件名.launch】
【launch文件是存放相对自由的,可在功能包内,也可以在功能包外】

Launch文件最好放在一个功能包里面,用命令行容易寻找得到,同时编程的时候工程也不用这么乱。总的launch文件搞一个robot_launch功能包,子功能包内放一个launch文件夹来存放
【防盗标记–盒子君hzj】

2.launch文件包含的形式

.
.

五、设备开机自启动launch

1.将多个要启动的ros node写入同一个launch文件
2.将要启动的roslaunch命令加入~/.bashrc文件中
3.实现系统开机自动登录功能
4.sudo reboot就ok了【防盗标记–盒子君hzj】

注意
roslaunch 命令执行launch文件时,首先会判断是否启动了 roscore,如果启动了,则不再启动,否则,会自动调用 roscore

六、rosparam参数服务器的原理

(1)主要思想

使用集中参数服务器( parameter server )维护一个变量集的值,【防盗标记–盒子君hzj】节点可以主动查询其感兴趣的参数的值。留出方便的参数调试接口

(2)主要原理
在ROS Master中就存在一个参数服务器Parameter Server,它是一个全局字典,用来保存各个节点的配置参数,每个节点都是可以访问的,并且会返回需要得到的值。无论是在哪里设置的,只要是参数就会被放到这个全局字典里面,参数服务器是可通过网络访问的共享的多变量字典。它是节点存储参数的地方、用于配置参数、全局共享参数。
【防盗标记–盒子君hzj】
.
.

七、rosparam参数服务器的功能【列举、设置、获取、 删除、加载文件、写入文件】

通过rosparam -h命令

Commands:
    rosparam list       列出参数服务器中的参数
    rosparam set       设置参数
    rosparam get	     获取参数值
    rosparam delete  删除参数【防盗标记–盒子君hzj】
    rosparam load     从文件中加载参数到参数服务器【文件类型仅限是.yaml文件】
    rosparam dump  将参数服务器中的参数写入到文件【文件类型仅限是.yaml文件】

.
.

八、rosparam参数服务器的使用方法【命令行、launch、源码编程】

(1)方法一:命令行接口【rosrun&&rosparam】

(1)通过rosrun命令行设置参数

(1)语法
	rosrun 包名 节点名称 _参数名:=参数值

(2)示例
	rosrun turtlesim turtlesim_node _A:=100

(2)通过rosparam命令行设置参数

(1)终端加载文件
		rosparam load   从文件加载参数【防盗标记–盒子君hzj】
		$ rosparam load param.yaml

(2)终端查看参数服务器内的参数名
		$ rosparam list
		rosparam list   列举参数名称


(3)终端查看参数名对应的内容
		$ rosparam get 参数名
		rosparam get +参数类型/参数名【查参数内容和格式】

(4)终端设置参数值
		$rosparam set [参数名] [参数值]
		rosparam set    设置参数

(5)rosparam delete 删除参数

.

(2)方法二:.launch接口【&&】

(1)优点
	1、可以不查看源程序就可以知道节点用到的参数以及给定的初始值;
	2、要修改参数的初始值,可以将它保存到launch文件而不必修改和重新编译源程序

(2)使用步骤
	1)使用标签直接定义参数【针对单个参数】【防盗标记–盒子君hzj】
	
	

	2)使用标签标签配置参数【针对.yaml文件】
	

(3)示例
	
	    
	    
	        
	    
	


(4)标签与标签对比
		标签用于加载文件
		标签用于加载单个参数
		是用来设置单个参数的,而是用来加载参数的,加载的是yaml文件里面配置的参数
		
		第一个属性是yaml文件的路径,第二个是选择为加载,第三个是他的命名空间

注意
1)rosparam参数服务器既可以定义全局变量参数,又可以定义局部变量参数
2)标签的type形参不全会自动适配类型,若给定type类型就会强制转换【防盗标记–盒子君hzj】

(3)方法三:源码编程接口【有句柄的方式(较好)、无句柄的方式】

roscpp的参数API有两套:一套在ros::param名字空间下,另一套封装在句柄handle中

(0)创建句柄的方式

	ros::NodeHandle n;

(1)为参数设置默认值

	用参数名为、或值为的参数初始化类型的变量variable,其中一般在.yaml和launch文件中定义【优先级较高】,是一个默认值会被覆盖的【优先级较低】
	
	1)有句柄的方式(较好)
	nh.param<>("", variable, );
	
	2)无句柄的方式
	ros::param::param<>("", variable, );
	【这个更好一点】

(2)为参数设置动态值

将参数赋值为

1)有句柄的方式(较好)
ros::NodeHandle::setParam("",)
	(1)原理
	设置参数时,首先需要创建 NodeHandle 对象,然后调用该对象的 setParam 函数,【防盗标记–盒子君hzj】
	该函数参数1为参数名,参数2为要设置的参数值,如果参数名以 / 开头,那么就是全局参数,
	如果参数名不以 / 开头,那么,该参数是相对参数还是私有参数与NodeHandle 对象有关,
	如果NodeHandle 对象创建时如果是调用的默认的无参构造,那么该参数是相对参数
	
	(2)示例
	ros::NodeHandle nh;
	nh.setParam("/nh_A",100); //全局,和命名空间以及节点名称无关
	
	nh.setParam("nh_B",100); //相对,参考命名空间
	
	ros::NodeHandle nh_private("~");
	nh_private.setParam("nh_C",100);//私有,参考命名空间与节点名称



(2)无句柄的方式
	(1)原理
		设置参数调用API是ros::param::set,该函数中,参数1传入参数名称,参数2是传入参数值,参数1中参数名称设置时,如果以 / 开头,那么就是全局参数,如果以 ~ 开头,那么就是私有参数,既不以 / 也不以 ~ 开头,那么就是相对参数。

	(2)示例
		(1)ros::param::set("/set_A",100); //全局,和命名空间以及节点名称无关【防盗标记–盒子君hzj】
		(2)ros::param::set("set_B",100); //相对,参考命名空间
		(3)ros::param::set("~set_C",100); //私有,参考命名空间与节点名称
	
	ros::param::set("",)【这个更好一点】

(3)判断参数是否存在

判断参数是否存在,一般用于条件判断和获取参数之前
	(1)有句柄的方式(较好)
		ros::NodeHandle::hasParam("")

(2)无句柄的方式
		ros::param::has("")
		【这个更好一点】

(4)从参数服务器获取一个参数值

从参数服务器获取名为的参数的值,赋值给变量variable【防盗标记–盒子君hzj】
(1)有句柄的方式(较好)
	ros::NodeHandle::getParam("", variable)
	
(2)无句柄的方式
	ros::param::get("", variable)
	【这个更好一点】

(5)删除参数

删除参数
(1)有句柄的方式(较好)
	ros::NodeHandle::deleteParam("")

(2)无句柄的方式
	ros::param::del("")
【这个更好一点】

.
.

九、.yaml文件的编写【.yaml文件一般用来存放变量集】

(1)yaml编写规则

(1)大小写敏感

(2)使用缩进表示层级关系,缩进时不允许使用Tal键,只允许使用空格,缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

(3)”#” 表示注释,从这个字符一直到行尾,都会被解析器忽略【防盗标记–盒子君hzj】

(4)YAML只有两种结构类型需要知道: lists%2c maps
.
.

(2)通用格式

一级变量:
    变量1:XXX
    变量2:XXX
    ....
二级变量:
    变量1:XXX
    变量2:XXX
    ....

(3)例子

#There are some params which will be loaded
yaml_param_string1: abcd123
yaml_param_string2: 567efg
 
yaml_param_num1: 123.123
yaml_param_num2: 1234567
 
yaml_param_set:
  param_set_string1: zzzzz
  param_set_num1: 999
  param_set_string2: a6666
  param_set_num2: 2333
 
param_subset:
  param_set_string1: qwer
  param_set_num1: 5432
  param_set_string2: a12s3

.
.

十、.csv文件的编写【.csv文件一般用来存放数据集–电子表格和数据库】

(1)csv编写规则

文件的每一行都是一组数据记录。每个记录由一个或多个字段组成,用逗号分隔
每行的数据长度可以不一致【防盗标记–盒子君hzj】
每行的数据类型也可以不一样

(2)例子

zzz,yyy,xxx
aaa,bbb,ccc
qqq,www,eee,rrr,ttt,yyy
"aaa","bbb","ccc"

参考资料

https://blog.csdn.net/woaixiaoyu520/article/details/78455650

十一、注意事项(经验)

(1)ROS中所有的全局参数都用rosparam进行管理
【若是一个参数用list\set\get\delete进行调用】
【若是某个功能包的一堆参数,用.yaml文件进行存储,用load/dump进行调用】【防盗标记–盒子君hzj】

(2)若读写的文件不是.yaml文件,先用一个参数对.csv文件名进行赋值设置(也可以把文件名作为一个变量写在.yaml文件中),再用C++的读写文件的库进行.csv文件的读取
.txt、.csv

(3)若是设置的name名称较长,可以再外面设置,通过引用的方式放到param的指令中

(4)roscpp的参数API有两套,两套不能混用,一套在ros::param名字空间下,另一套封装在handle中

(5)在启动工程终端的时候,rosparam的参数加载情况会最先打印出来的【防盗标记–盒子君hzj】


你可能感兴趣的:(【2】Git,Linux,ROS,FreeRTOS系统平台,自动驾驶,人工智能,机器学习)