ROS 1 Noetic
Ubuntu 20.04 Focal, ROS 1 Noetic.
一些基本概念:
rviz,3D 可视化工具,用来创建地图、显示 3D 点云。
tf,坐标变换系统。两种坐标系:固定坐标系(用于表示世界的参考坐标系),目标坐标系(相对于摄像机视角的参考坐标系)
Gazebo,物理仿真工具。
SLAM(Simultaneous Localization and Mapping),同步定位与建图
工作空间
创建工作空间:
# 创建空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
# 初始化
cd ~/catkin_ws/src
catkin_init_workspace # 在src文件夹
# 编译工作空间,需要切换到工作空间根目录
cd ~/catkin_ws/
catkin_make
catkin_make install # 可选,生成 install 目录
# 从指定源代码目录进行编译
catkin_make --source my_src
catkin_make install --source my_src
# 指定软件包进行构建
catkin_make --pkg xxx
# 设置环境变量
source devel/local_setup.bash
# 查看当前环境变量
echo $ROS_PACKAGE_PATH
# 创建一个软件包
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
# 查看软件包的依赖
# 运行所有 ROS 命令之前,新开一个终端
roscore
# else
rospack
roscd
rosls
工作空间目录:
src 源代码
build 编译空间
devel 开发空间
某个软件包的目录结构:
CMakeLists.txt, package.xml, scripts/ , msg/ , srv/ , include/ , src/ , launch/ , urdf/ , config/ , meshes/
PS: 如果找不到软件包,用 source devel/setup.bash
而非 source devel/local_setup.bash
。
ROS 节点
查看节点:
rosnode list
rosnode info <node_name>
运行一个节点,基于一个软件包:
rosrun [package_name] [node_name]
运行多个节点,基于 .launch 文件:
roslaunch [package] [filename.launch]
launch 文件的结构
launch 文件:
- pkg:节点所在的功能包名称
- node:节点名称
- type:节点的可执行文件名称
- name:节点运行时的名称
- output:“log | screen” (可选)日志发送目标,可以设置为 log 日志文件,或 screen 屏幕,默认是 log
- group:组,有命名空间特性
- param / rosparam:参数
- arg :launch 文件内部局部变量
- remap:重映射
具体来讲:
标签 node:
<node pkg="package_name" type="executable_node" name="node_name" args="$()" respawn="true" output="sceen">
pkg 节点所在包的名称,type 可执行文件(节点)的名称,name 节点运行时的名称,args 传递命令行设置的参数,respawn 是否自动重启,output 是否将节点输出到屏幕。
标签 param,改变程序变量的参数值:
<param name="param_name" type="param_type" value="param_value" />
<!-- param 标签可以嵌入到 node 标签中,以此来作为该 node 的私有参数 -->
<node>
<param name="param_name" type="param_type" value="param_value" />
</node>
name 参数名称,type 参数类型(double,str,int等),value 参数值。
标签 rosparam,实现节点从参数服务器上 load,dump,delete YAML 文件:
<!-- 加载package_name功能包下的example.yaml文件 -->
<rosparam command="load" file="$(find package_name)/example.yaml">
<!-- 导出example_out.yaml文件到package_name功能包下 -->
<rosparam command="dump" file="$(find package_name)/example_out.yaml" />
<!-- 删除参数 -->
<rosparam command="delete" param="xxx/param">
command 功能类型,file 参数文件的路径,param 参数名称。
标签 include,导入其他 launch 文件:
<include file="$(find package_name)/launch_file_name">
标签 remap,实现节点名称的重映射,原始名称-->新名称:
<remap from="turtle1/cmd_vel" to="/cmd_vel" />
<!-- remap 标签同样可以嵌入到 node 标签中,以此来作为该 node 的私有重映射 -->
<node>
<remap from="turtle1/cmd_vel" to="/cmd_vel" />
</node>
标签 arg,表示启动参数:
<arg name="arg_name" default="arg_default" />
<arg name="arg_name" value="arg_value" />
<!-- 命令行传递的 arg 参数可以覆盖 default,但不能覆盖 value。 -->
注意:
arg | 启动时的参数,只在launch文件中有意义 |
---|---|
param | 运行时的参数,参数会存储在参数服务器中 |
标签 group,可以实现将一组配置应用到组内的所有节点,它也具有命名空间特点,可以将不同的节点放入不同的 namespace。
<!-- 用法1 -->
<group ns="namespace_1">
<node pkg="pkg_name1" .../>
<node pkg="pkg_name2" .../>
...
</group>
<group ns="namespace_2">
<node pkg="pkg_name3" .../>
<node pkg="pkg_name4" .../>
...
</group>
<!-- 用法2 -->
<!-- if = value:value 为 true 则包含内部信息 -->
<group if="$(arg foo1)">
<node pkg="pkg_name1" .../>
</group>
<!-- unless = value:value 为 false 则包含内部信息 -->
<group unless="$(arg foo2)">
<node pkg="pkg_name2" .../>
</group>
<!--
当 foo1 == true 时包含其标签内部
当 foo2 == false 时包含其标签内部
-->
launch文件启动之前,无需再执行roscore
指令启动rosmaster
,launch文件可以自启动rosmaster
rqt 工具
使用 rqt_graph 查看节点状态图:
rosrun rqt_graph rqt_graph
rqt
rqt_graph
话题、服务、参数
关于话题的命令:
rostopic bw display bandwidth used by topic
rostopic echo print messages to screen
rostopic hz display publishing rate of topic
rostopic list print information about active topics
rostopic pub publish data to topic
rostopic type print topic type
rosmsg show <topic_type_name>
关于服务的命令:
rosservice list print information about active services
rosservice call call the service with the provided args
rosservice type print service type
rosservice find find services by service type
rosservice uri print service ROSRPC uri
关于参数的命令:
rosparam set set parameter
rosparam get get parameter
rosparam load load parameters from file
rosparam dump dump parameters to file
rosparam delete delete parameter
rosparam list list parameter names
编辑某一个软件包内的某一个文件:
rosed [package_name] [filename]
添加软件包需要的依赖,修改:
package.xml 文件中的 <depend>xxx</depend>
标签。
CMakeLists.txt 文件中的
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
# Add more dependencies here
)
rosdep 工具
使用 rosdep 检查是否满足依赖,以及安装未依赖的包:
rosdep check --from-path src --ignore-src -r -y
rosdep install --from-path src --ignore-src -r -y
录制数据包
.bag 文件可以保存 ROS 系统运行过程中产生的话题和服务数据,并播放出来供其他系统使用。
开始录制数据:
rosbag record -a
rosbag record -O xxx /turtle1/cmd_vel /turtle1/pose
录制全部话题,或者选择其中一部分话题。
rosbag info xxx.bag
rosbag play xxx.bag
rosbag play xxx.bag -r 4
查看数据包信息,以及播放数据包、按照一定速率播放数据包。