系列文章目录
第一章 ROS空间创建、helloworld的实现、开启多个节点
第二章 话题通信
第三章 服务通信
第四章 参数服务器
第五章 常用指令
第六章 通信机制实操
第七章 ROS通信机制进阶(常用API、Python模块的导入)
第八章 元功能包、节点运行管理launch文件(teleop_twist安装方法)
第九章 重名问题、分布式通信
第十章-第一节 TF坐标变换(内含PyKDL 和PyInit__tf2功能缺失等解决)
第十章-第二节 TF坐标变换实操
第十章-第三节 rosbag、rqt工具箱
第十一章-第一节 机器人系统仿真(URDF相关)
第十一章-第二节 机器人系统仿真(Gazebo相关)
第十二章 机器人导航(仿真)
文章目录
前言
现在大二,之前大一有幸参加了2021的国赛,很壮烈的拿了个江苏赛区的二等奖。但发现无人机这个题,真的是往堆钱上走了。不上ROS不行,现在来记录一下一个纯小白学习ROS的过程和遇到的问题。防止学弟、学妹们再走我走过的弯路。板子用的是学长给的Jetson Nano(4GB),版本是Ubuntu18.04(已配置好基础ROS所需配置)
一、ROS元功能包
显而易见的,逐一安装功能包的效率低下,在ROS中,提供了一种方式可以将不同的功能包打包成一个功能包,当安装某个功能模块时,直接调用打包后的功能包即可,该包又称之为元功能包(metapackage)。
- 新建一个功能包 (依赖项为空即可)
修改package.xml ,内容如下:
51行:
<buildtool_depend>catkin</buildtool_depend>
<exec_depend>plumbing_pub_sub</exec_depend>
<exec_depend>plumbing_server_client</exec_depend>
<exec_depend>plumbing_param_server</exec_depend>
59行:
<export>
<!-- Other tools can request additional information be placed here -->
<metapackage />
</export>
- 修改 CMakeLists.txt,内容如下:(把原有的所有行都删除)
cmake_minimum_required(VERSION 3.0.2)
project(plumbing_my)
find_package(catkin REQUIRED)
catkin_metapackage()
二、ROS节点运行管理launch文件
1.引入
launch 文件是一个 XML 格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。简化节点的配置与启动,提高ROS程序的启动效率。
- 建立功能包,(依赖: roscpp rospy std_msgs turtlesim)在功能包下添加 launch目录, 目录下新建
xxxx.launch 文件,编辑 launch 文件。 代码如下:
<launch>
<!--启动的节点 pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
- 编译运行
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch
注意:roslaunch 命令执行launch文件时,首先会判断是否启动了 roscore,如果启动了,则不再启动,否则,会自动调用 roscore
2.launch文件标签之launch
<launch>
标签是所有 launch 文件的根标签,充当其他标签的容器
- 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
代码如下:
<launch deprecated ="此文件已经过时">
<!--启动的节点 pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
- 编译运行
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch
3.launch文件标签之node
<node>
标签用于指定 ROS 节点,是最常见的标签,需要注意的是: roslaunch 命令不能保证按照 node 的声明顺序来启动节点(节点的启动是多进程的)
- pkg=“包名”
节点所属的包 - type=“nodeType”
节点类型(与之相同名称的可执行文件) - name=“nodeName”
节点名称(在 ROS 网络拓扑中节点的名称) - argv=“xxx xxx xxx” (可选)
将参数传递给节点 - machine=“机器名”
在指定机器上启动节点 - respawn=“true | false” (可选)
如果节点退出,是否自动重启 - respawn_delay=" N" (可选)
如果 respawn 为 true, 那么延迟 N 秒后启动节点 - required=“true | false” (可选)
该节点是否必须,如果为 true,那么如果该节点退出,将杀死整个 roslaunch - ns=“xxx” (可选)
在指定命名空间 xxx 中启动节点 - clear_params=“true | false” (可选)
在启动前,删除节点的私有空间的所有参数 - output=“log | screen” (可选)
日志发送目标,可以设置为 log 日志文件,或 screen 屏幕,默认是 log
- 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
代码如下:
<launch>
<!--启动的节点 pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
<!--respawn="true"节点关闭后自动重启-->
<!--required="true"节点退出后,关闭整个系统-->
<!--ns="hello" 设置节点的命名空间,即name前的前缀,可用rosnode来查寻-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
- 编译运行
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch
4.launch文件标签之include
<include>
标签用于将另一个 xml 格式的 launch 文件导入到当前文件,即调用另一个launch文件里的节点
- 在launch目录下新建 xxxx.launch 文件,编辑 launch 文件。 代码如下:
<!--需要copy start_turtle.launch-->
<launch>
<!--包含以下launch文件中节点:file="$(find 包名)/xxx/xxx.launch"-->
<include file="$(find launch01_basic)/launch/start_turtle.launch"/>
<!--其他节点-->
</launch>
- 编译运行
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle_use.launch
注意:若被调用的launch文件指定了命名空间,则在调用他的launch中也需指定命名空间导入文件
ns=“xxx” (可选)
在指定命名空间导入文件
5.launch文件标签之remap(teleop_twist_keyboard功能包安装)
用于话题重命名
- 安装teleop_twist_keyboard功能包
在工作空间下,安装功能包。
cd 工作空间/src
git clone https://github.com/ros-teleop/teleop_twist_keyboard
cd 工作空间
catkin_make
source ~/工作空间/devel/setup.bash
source ~/.bashrc
将编译好的功能包路径添加到环境变量中,在其他终端也可以使用teleop_twist_keyboard功能包了。操作如下:
新开一个终端:gedit ~/.bashrc :
在打开的文件中添加编译好的setup.bach文件: source ~/工作空间/devel/setup.bash
启动roscore
,新开一个命令行输入:rosrun teleop_twist_keyboard teleop_twist_keyboard.py
即可使用键盘控制。
- 以下是统一teleop_twist_keyboard与我开的乌龟话题的方法:
建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
代码如下:
<launch>
<!--启动的节点 pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
<!--respawn="true"节点关闭后自动重启-->
<!--required="true"节点退出后,关闭整个系统-->
<!--ns="hello" 设置节点的命名空间,即name前的前缀,可用rosnode来查寻-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen">
<remap from="/turtle1/cmd_vel" to="/cmd_vel" />
</node>
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
- 编译运行
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch
新开一个命令行:rosrun teleop_twist_keyboard teleop_twist_keyboard.py
即:
from=“xxx”
#原始话题名称
to=“yyy”
#目标名称
注意:若launch文件指定了命名空间,则话题名称需要更换!!
6.launch文件标签之param
<param>
标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value 指定,也可以通过外部文件加载,在标签中时,会给参数名称+一个前缀,相当于私有命名空间。
- name=“命名空间/参数名”
参数名称,可以包含命名空间 - value=“xxx” (可选)
定义参数值,如果此处省略,必须指定外部文件作为参数源 - type=“str | int | double | bool | yaml” (可选)
指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:
如果包含 ‘.’ 的数字解析未浮点型,否则为整型
“true” 和 “false” 是 bool 值(不区分大小写)
其他是字符串
- 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
代码如下:
<launch>
<!--启动的节点 pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
<!--respawn="true"节点关闭后自动重启-->
<!--required="true"节点退出后,关闭整个系统-->
<!--ns="hello" 设置节点的命名空间,即name前的前缀,可用rosnode来查寻-->
<!--param 使用:向参数服务器设置参数-->
<!--格式1:launch下,node外-->
<param name="param_A" type="int" value="100" />
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen">
<remap from="/turtle1/cmd_vel" to="/cmd_vel" />
<!--格式2:node下 私有命名空间-->
<param name="param_B" type="double" value="3.14" />
</node>
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
- 编译运行
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch
新开一个命令行:rosparam list
即可查看到响应:
/my_turtle/background_b
/my_turtle/background_g
/my_turtle/background_r
/my_turtle/param_B
/param_A
/rosdistro
/roslaunch/uris/host_lzl_desktop__35979
/rosversion
/run_id
7.launch文件标签之rosparam
<rosparam>
标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,标签在标签中时被视为私有。
- command=“load | dump | delete” (可选,默认 load)
加载、导出或删除参数 - file=“$(find xxxxx)/xxx/yyy…”
加载或导出到的 yaml 文件 - param=“参数名称”
ns=“命名空间” (可选)
- 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件(2个),编辑 launch 文件。
代码1如下:
<launch>
<!--启动的节点 pkg你要执行的功能包,type被执行的相关文件,neme节点的名称,output把日志输出到控制台-->
<!--respawn="true"节点关闭后自动重启-->
<!--required="true"节点退出后,关闭整个系统-->
<!--ns="hello" 设置节点的命名空间,即name前的前缀,可用rosnode来查寻-->
<!--param 使用:向参数服务器设置参数-->
<!--格式1:launch下,node外-->
<param name="param_A" type="int" value="100" />
<!--rosparam 使用:操作参数服务器数据-->
<!--格式1:launch下,node外-->
<!--加载参数-->
<rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>
<!--导出参数 rosparam的优先级比node高-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen">
<remap from="/turtle1/cmd_vel" to="/cmd_vel" />
<!--格式2:node下 私有命名空间-->
<param name="param_B" type="double" value="3.14" />
<!--格式2:node下 私有命名空间-->
<rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>
</node>
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
代码2如下:
<launch>
<rosparam command="dump" file="$(find launch01_basic)/launch/params_out.yaml"/>
<!--删除参数-->
<rosparam command="delete" param="bg_B" />
</launch>
- 编译运行
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic start_turtle.launch
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic dump.launch
8.launch文件标签之group
<group>
标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间。子级标签是除了launch 标签外的其他标签。
- ns=“名称空间” (可选)
- clear_params=“true | false” (可选)
启动前,是否删除组名称空间的所有参数(慎用…此功能危险)
- 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
代码如下:
<launch>
<!--启动两对乌龟GUI与键盘控制节点-->
<group ns="first">
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</group>
<group ns="second">
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</group>
</launch>
- 编译运行
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic turtles.launch
新开一个命令行:rosnode list
即可看到响应结果:
/first/my_key
/first/my_turtle
/rosout
/second/my_key
/second/my_turtle
9.launch文件标签之arg
<arg>
标签是用于动态传参,类似于函数的参数,可以增强launch文件的灵活性
-
name=“参数名称”
-
default=“默认值” (可选)
-
value=“数值” (可选)
不可以与 default 并存 -
doc=“描述”
参数说明
- 建立功能包,在功能包下添加 launch目录, 目录下新建 xxxx.launch 文件,编辑 launch 文件。
代码如下:
<launch>
<!--需求:演示arg的使用,需要设置多个参数,这些参数的使用是同一个值(小车的长度),怎么设置-->
<!-- <param name="A" value="0.55"/>
<param name="B" value="0.55"/>
<param name="C" value="0.55"/> -->
<arg name="car_length" default="0.55"/>
<param name="A" value="$(arg car_length)"/>
<param name="B" value="$(arg car_length)"/>
<param name="C" value="$(arg car_length)"/>
</launch>
- 编译运行
roscore
新开一个命令行:
source ./devel/setup.bash
roslaunch launch01_basic arg.launch
rosparam list
还可以直接修改参数:roslaunch launch01_basic arg.launch car_length:=0.6
总结
以上就是今天要讲的内容,本文仅仅简单记录了ROS元功能包、节点运行管理launch文件(teleop_twist安装方法),如果有问题请在博客下留言或者咨询邮箱:layraliu@foxmail.com。