第一章 ROS空间创建、helloworld的实现、开启多个节点
第二章 话题通信
第三章 服务通信
第四章 参数服务器
第五章 常用指令
第六章 通信机制实操
第七章 ROS通信机制进阶(常用API、Python模块的导入)
第八章 元功能包、节点运行管理launch文件(teleop_twist安装方法)
第九章 重名问题、分布式通信
第十章-第一节 TF坐标变换(内含PyKDL 和PyInit__tf2功能缺失等解决)
现在大二,之前大一有幸参加了2021的国赛,很壮烈的拿了个江苏赛区的二等奖。但发现无人机这个题,真的是往堆钱上走了。不上ROS不行,现在来记录一下一个纯小白学习ROS的过程和遇到的问题。防止学弟、学妹们再走我走过的弯路。板子用的是学长给的Jetson Nano(4GB),版本是Ubuntu18.04(已配置好基础ROS所需配置)
显而易见的,逐一安装功能包的效率低下,在ROS中,提供了一种方式可以将不同的功能包打包成一个功能包,当安装某个功能模块时,直接调用打包后的功能包即可,该包又称之为元功能包(metapackage)。
<buildtool_depend>catkinbuildtool_depend>
<exec_depend>plumbing_pub_subexec_depend>
<exec_depend>plumbing_server_clientexec_depend>
<exec_depend>plumbing_param_serverexec_depend>
59行:
<export>
<metapackage />
export>
cmake_minimum_required(VERSION 3.0.2)
project(plumbing_my)
find_package(catkin REQUIRED)
catkin_metapackage()
launch 文件是一个 XML 格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。简化节点的配置与启动,提高ROS程序的启动效率。
<launch>
<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
标签是所有 launch 文件的根标签,充当其他标签的容器
<launch deprecated ="此文件已经过时">
<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
标签用于指定 ROS 节点,是最常见的标签,需要注意的是: roslaunch 命令不能保证按照 node 的声明顺序来启动节点(节点的启动是多进程的)
<launch>
<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
标签用于将另一个 xml 格式的 launch 文件导入到当前文件,即调用另一个launch文件里的节点
<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” (可选)
在指定命名空间导入文件
用于话题重命名
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
即可使用键盘控制。
<launch>
<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文件指定了命名空间,则话题名称需要更换!!
标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value 指定,也可以通过外部文件加载,在标签中时,会给参数名称+一个前缀,相当于私有命名空间。
<launch>
<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" />
<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
标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,标签在标签中时被视为私有。
<launch>
<param name="param_A" type="int" value="100" />
<rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen">
<remap from="/turtle1/cmd_vel" to="/cmd_vel" />
<param name="param_B" type="double" value="3.14" />
<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
标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间。子级标签是除了launch 标签外的其他标签。
<launch>
<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
标签是用于动态传参,类似于函数的参数,可以增强launch文件的灵活性
name=“参数名称”
default=“默认值” (可选)
value=“数值” (可选)
不可以与 default 并存
doc=“描述”
参数说明
<launch>
<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安装方法),如果有问题请在博客下留言或者咨询邮箱:[email protected]。