ROS: 机器人操作系统(Robot Operating System, ROS)机器人软件框架。
开源社区内的ROS功能包呈指 数级增长, 涉及的应用领域包括轮式机器人、 人形机器人、 工业机器 人、 农业机器人等。
ROS中的功能模块都封装于独立的功能包(Package) 或元功能包(Meta Package)
实验室或者研究机构共同协作来开发机器人软件 。 例如一个拥有室内地图建模领域专家的实验室可能会开发并发布一个先进的地图建模系统; 一个拥有导航方面专家的组织可以使用建模完成的地图进行机器人导航; 另一个专注于机器人视觉的组织可能开发出了一种物体识别的有效方法。
1 | sudo sh -c '. /etc/lsb-release && echo \ |
2-架构
架构分层:
OS层:基于Linux系统的OS层;
中间层:实现ROS核心通信机制以及众多机器人开发库;
应用层:在ROS Master的管理下保证功能节点的正常运行。
ROS的三种通信机制:
基于发布/订阅的话题通信、
基于客户端/服务器的服务通信
基于RPC的参数服务器
系统实现角度,ROS划分三个层次:计算图、 文件系统和 开源社区。其中涵盖了ROS中的关键概念, 如节点、 消息、 话题、 服务、 功能包、 元功能包等。

通信层:
除了TCPROS/UDPROS的通信机制外, ROS还提供一种进程内的通信方法——Nodelet, 可以为多进程通信提供一种更优化的数据传输方式, 适合对数据传输实时性方面有较高要求的应用。
在通信机制之上, ROS提供了大量机器人开发相关的库, 如数据类型定义、 坐标变换、 运动控制等, 可以提供给应用层使用。

计算图
节点:执行运算任务的进程
消息:支持标准数据类型(整型、 浮点型、 布尔型等) , 也支持嵌套结构和数组(类似于C语言的结构体struct) , 还可以根据需求由开发者自主定义。
话题:消息以一种发布/订阅(Publish/Subscribe) 的方式传递。
一个节点可以针对一个给定的话题(Topic) 发布消息(称为发布者/Talker) ,
也可以关注某个话题并订阅特定类型的数据(称为订阅者/Listener) 。
多对多模式:可以多个Talker,多个Listener
不适合双向的同步传输模式
服务:基于客户端/服务器(Client/Server) 模型, 包含两个部分的通信数据类型: 一个用于请求, 另一个用于应答, 类似于Web服务器。
- 与话题不同的是, ROS中只允许有一个节点提供指定命名的服务。
ROS Master :节点管理器
文件系统
Package: 功能包,包含节点,库,配置文件
Package Manifest: package.xml 记录功能包基本信息,作者,许可,依赖,编译标志
Meta Package:组织多个用于同一目地的功能包,例如ROS导航功能包,包含建模,定位,导航等多个功能包

功能包:

1) config: 放置功能包中的配置文件, 由用户创建, 文件名可以不同。
2) include: 放置功能包中需要用到的头文件。
3) scripts: 放置可以直接运行的Python脚本。
4) src: 放置需要编译的C++代码。
5) launch: 放置功能包中的所有启动文件。
6) msg: 放置功能包自定义的消息类型。
7) srv: 放置功能包自定义的服务类型。
8) action: 放置功能包自定义的动作指令。
9) CMakeLists.txt: 编译器编译功能包的规则。
10) package.xml: 功能包清单, 图2-7是一个典型的功能包清单示例。
命令
命令 | 作用 |
---|---|
catkin_create_pkg | 创建功能包 |
rospack | 获取功能包的信息 |
catkin_make | 编译工作空间中的功能包 |
rosdep | 自动安装功能包依赖的其他包 |
roscd | 功能包目录跳转 |
roscp | 拷贝功能包中的文件 |
rosed | 编辑功能包中的文件 |
rosrun | 运行功能包中的可执行文件 |
roslaunch | 运行启动文件 |
Meta Package
package.xml
1 | <package> |
1 | roscd navigation |
社区

通信机制
话题通信机制
- 节点建立连接后, 可以关掉ROS Master, 节点之间的数据传输并不
会受到影响, 但是其他节点也无法加入这两个节点之间的网络。
- 节点建立连接后, 可以关掉ROS Master, 节点之间的数据传输并不
服务通信机制
参数管理机制RPC
- 不涉及TCP/UDP的通信
话题服务



3-基础
1) src: 代码空间(Source Space) , 开发过程中最常用的文件夹,用来存储所有ROS功能包的源码文件。
2) build: 编译空间(Build Space) , 用来存储工作空间编译过程 中产生的缓存信息和中间文件。
3) devel: 开发空间(Development Space) , 用来放置编译生成的可执行文件。
4) install: 安装空间(Install Space) , 编译成功后, 可以使用make install命令将可执行文件安装到该空间中, 运行该空间中的环境变量脚本, 即可在终端中运行这些可执行文件。 安装空间并不是必需的,很多工作空间中可能并没有该文件夹
1 | mkdir -p ~/catkin_ws/src |
创建新包
1 | catkin_create_pkg <package_name> [depend1] [depend2] [depend3] |
小乌龟仿真
键盘控制一只小乌龟在界面中移动,而且会接触到第一个ROS功能包——turtlesim。
该功能包的核心是turtlesim_node节点, 提供一个可视化的乌龟仿真器, 可以实现很多ROS基础功能的测试。
1 | 安装依赖 |
Publisher/Subscriber
Server/Client
多机器通信
master_URI=ip:11311
4-组件
launch文件
TF坐标转换
Qt工具箱
rviz三维可视化平台
gazebo仿真环境
rosbag数据记录与回放
launch启动文件
1 | <launch> |
嵌套使用
1 | <include file="$(dirname)/other.launch" /> |
TF工具
tf_monitor
1 | tf_monitor |
tf_echo: 查看指定坐标系之间的变换关系
1 | tf_echo <source_frame> <target_frame> |
static_transform_publisher
- 发布两个坐标系之间的静态左边变换
view_frames
可视化调试工具,生成pdf
$rosrun tf view_frames # 查看TF树信息 $evince frames.pdf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#### QT工具
#### Rviz可视化
#### Gazebo仿真环境
```shell
# Install
sudo apt-get install ros-kinetic-gazebo-ros-pkgs \
ros-kinetic-gazebo-ros-control
# start ros gazebo
roscore
rosrun gazebo_ros gazebo
rostopic list # 查看gazebo的topic
rosservice list # 查看gazebo的服务
模型的加载需要连接国外网站, 为了保证模型顺利加载, 可以提前将模型文件下载并放置到本地路径~/.gazebo/models下, 模型文件的下载地址:
rosbag数据记录和回放
1 | 首先启动键盘控制乌龟例程所需的所有节点: |
5-ROBOT平台搭建
什么是机器人? 一个完整的机器人系统包含哪些部分?
如何构建一个真实的机器人系统? 学习完本章内容后, 你就会有答案了
如何驱动USB摄像头和RGB-D摄像头,
通过ROS提供的工具将这些图像数据显示出来。
控制系统
嵌入式系统的选择有很多, 比如常用的Raspberry Pi、 TK1、RK3288、 Odroid、 Arduino等
Raspberry PI控制系统
Ubuntu 20.04.5 LTS (Focal Fossa)
GitHub - dajianli/mrobot: mrobot ros package
1 |
安装ROS
1 | sudo apt-get install ros-kinetic-ros-base |
1 | QT 图像显示工具--订阅图像topic |
mrobot_teleop
1 | roscore (PC) |
5.6 摄像头
1 | sudo apt-get install ros-kinetic-usb-cam |
6-ROBOT建模,仿真
大纲:
URDF
xacro优化模型
<gazebo>
标签,传感器,转动结构等仿真rviz + ArbotiX 仿真环境,机器人控制等仿真
ros_control 在Gazebo物理仿真创建世界,仿真
6.1 URDF语法
(Unified Robot Description Format, 统一机器人描述格式)
link(刚体)
<link>
标签用于描述机器人某个刚体部分的外观和物理属性,
包括尺寸(size) 、 颜色(color) 、 形状(shape) 、 惯性矩阵(inertial matrix) 、 碰撞参数(collision properties)
1 | <link> |
joint(关节)
描述机器人关节的运动学和动力学属性, 包括关节运动的位置和速度限制。
关节类型 | 描述 |
---|---|
continuous | 旋转关节,可以围绕单轴无限旋转 |
revolute | 旋转关节,类似于continuous,但是有旋转的角度极限 |
prismatic | 滑动关节,沿某一轴线移动的关节,带有位置极限 |
planar | 平面关节,允许在平面正交方向上平移或者旋转 |
floating | 浮动关节,允许进行平移、旋转运动 |
fixed | 固定关节,不允许运动的特殊关节 |

与人的关节一样, 机器人关节的主要作用是连接两个刚体link, 这两个link分别称为parent link和child link,
1 | <joint name="<name of the joint>"> |
其中必须指定joint的parent link和child link, 还可以设置关节的其他属性。
·
·
·
·
·

robot
最顶层标签, 和
gazebo
1 | <gazebo reference="link_1"> |
6.2 创建URDF模型
1 | catkin_create_pkg mrobot_description urdf xacro |
mrobot_description功能包含urdf,meshes,launch和config文件夹
urdf: 存放URDF或 xacro文件
meshes: 模型渲染文件
launch: 启动文件
config: rviz配置文件
MRobot底盘模型有7个link和6个joint。7个link包含1个底盘,2个电机,2个驱动轮,2个万向轮‘;6个joint负责连接各个组件到底盘上;
模型文件mrobot_description/urdf/mrobot_chassis.urdf
1 |
|
检查URDF模型整体结构(生成pdf文件)
1 | apt install liburdfdom-tools |
1 | urdf_to_graphiz mrobot_chassis.urdf |
模型解析
1 | <!-- motor wheel joint (type=?)--> |
viza显示模型
1 | <launch> |
img


6.3 模型xacro优化
xacro
1 | 将xacro文件转换成URDF文件 |
直接调用xacro文件解析器
1 | <arg name="model" default="$(find xacro)/xacro --inorder |

- 注意:xacro定义的组件,使用时需要加xacro命名空间(ROS2)
6.4 传感器添加
- 注意:name=“ ”不要有空格

6.5 Arbox+rviz
ArbotiX是一款控制电机、 舵机的控制板, 并提供相应的ROS功能包, 但是这个功能包的功能不仅可以驱动真实的ArbotiX控制板, 它还提供一个差速控制器, 通过接收速度控制指令更新机器人的joint状态,从而帮助我们实现机器人在rviz中的运动。
1 | apt install ros-noetic-arbotix |
配置arbotix
创建launch文件
创建配置文件(控制器)
运行仿真
roslaunch mrobot_description arbotix_mrobot_with_kinect.launch
话题cmd_vel (tostopic list)
控制运行(键盘)
roslaunch mrobot_teleop mrobot_teleop.launch
此时rviz中设置的“Fixed Frame”是odom, 也就是机器人的里程计坐 标系。 这是一个全局坐标系, 通过里程计记录机器人当前的运动位姿,从而更新rviz中的模型状态。
rviz+ArbotiX可以构建一个较为简单的运动仿真器, 在本书后续内 容中还会多次使用这个仿真器实现导航等功能。 除此之外, ROS还集成 了更为强大的物理仿真平台——Gazebo, 可以做到类似真实机器人的高度仿真状态, 包括物理属性、 传感器数据、 环境模型等
mrobot_teleop.launch
- 控制模块
6.6 ros_control
针对不同类型的机器人(移动机器人、 机械臂等),ros_control可以提供多种类型的控制器(controller) , 但是这些控制器的接口各不相同。 为了提高代码的复用率, ros_control还提供一个硬件抽象层, 负责机器人硬件资源的管理, 而controller从抽象层请求资源即可, 并不直接接触硬件。
1 框架
(1) 控制器管理器(Controller Manager)
提供一种通用的接口来管理不同的控制器。 控制器管理器的输入就是ROS上层应用功能包的输出。
(2) 控制器(Controller)
控制器可以完成每个joint的控制, 读取硬件资源接口中的状态, 再发布控制命令, 并且提供PID控制器。
(3) 硬件资源(Hardware Resource)
为上下两层提供硬件资源的接口。
(4) 机器人硬件抽象(RobotHW)
机器人硬件抽象和硬件资源直接打交道, 通过write和read方法完成硬件操作, 这一层也包含关节约束、 力矩转换、 状态转换等功能。
(5) 真实机器人(Real Robot)
真实机器人上也需要有自己的嵌入式控制器, 将接收到的命令反映到执行器上, 比如接收到旋转90度的命令后, 就需要让执行器快速、 稳定地旋转90度。
2 控制器
目前ROS中的ros_controllers功能包提供了以下控制器(见图6-19) 。
effort_controllers
joint_effort_controller
joint_position_controller
joint_velocity_controller
joint_state_controller
joint_state_controller
position_controllers
joint_position_controller
velocity_controllers
joint_velocity_controller
当然, 我们也可以根据自己的需求创建需要的控制器, 然后通过控 制器管理器来管理自己创建的控制器。 创建控制器的具体方法可以参考 wiki:controller_interface
3 硬件接口
硬件接口是控制器和RobotHW沟通的接口, 基本与控制器的种类相互对应(见图6-20) , 同样可以自己创建需要的接口, 具体实现方法可以参考wiki: wiki-hardware_interface
4 传动系统
传动系统(Transmission) 可以将机器人的关节指令转换成执行器的控制信号。 机器人每个需要运动的关节都需要配置相应的传动系统。可以在机器人的URDF模型文件中按照以下方法配置:
1 | <transmission name="simple_trans"> |
5 关节约束
关节约束(Joint Limits) 是硬件抽象层中的一部分, 维护一个关节约束的数据结构,
这些约束数据可以从机器人的URDF文件中加载,
也可以在ROS的参数服务器上加载(需要先用YAML配置文件导入ROS参数服务器) ,
不仅包含关节速度、 位置、 加速度、 加加速度、 力矩等方面的约束,
还包含起安全作用的位置软限位、 速度边界(k_v) 和位置边界(k_p) 等
URDF
1 | <joint name="$foo_joint" type="revolute"> |
YAML参数服务器
1 | joint_limits: |
6 控制器管理器
controller_manager提供了一种多控制器控制的机制, 可以实现控制器的加载、 开始运行、 停止运行、 卸载等多种操作。
6.1 命令行工具
管理
1 | rosrun controller_manager controller_manager <command> <controller_name> |
查看命令
1 | rosrun controller_manager controller_manager <command> |
spawner命令一次控制多个控制器:
1 | rosrun controller_manager spawner [--stopped] name1 name2 name3 |
6.2 launch工具
在launch文件中, 同样可以通过运行controller_manager命令, 加载 和启动一系列控制器:
1 | <launch> |
以上launch文件会加载并启动controller, 如果只需加载不必启动,可以使用以下配置:
1 | <launch> |
6.3.可视化工具rqt_controller_manager
controller_manager还提供了可视化工具rqt_controller_manager, 安装成功后, 直接使用以下命令即可打开界面:
1 | rosrun rqt_controller_manager rqt_controller_manager |
6.7 Gazebo仿真
6.7.1 添加Gazebo属性
link ADD
1 | <gazebo reference="wheel_${lr}_link"> |
传动装置添加
为了使用ROS控制器驱动机器人, 需要在模型中加入
1 | <transmission name="wheel_${lr}_joint_trans"> |
控制器插件-(使静态模型,动起来)
1 | <!-- ( 1) 为<robot>元素添加插件 --> |
使用xacro设计的机器人URDF模型已经描述了机器人的外观特征和物理特性, 虽然已经具备在Gazebo中仿真的基本条件, 但是, 由于没有 在模型中加入Gazebo的相关属性, 还是无法让模型在Gazebo仿真环境中动起来。 那么如何开始仿真呢?
首先我们需要确保每个link的
6.7.2 在Gazebo中显示机器人模型
1 | <launch> |
launch文件的2个作用:
1) 启动机器人的状态发布节点, 同时加载带有Gazebo属性的机器人URDF模型。
2) 启动Gazebo, 并且将机器人模型加载到Gazebo仿真环境中。
1 | cd src |
6.7.3 control Gazebo
1 | catkin_create_pkg mrobot_teleop geometry_msgs roscpp rospy |
1 | ERR: /usr/bin/env: ‘python’: No such file or directory |
6.7.4 摄像头仿真
1 | roslaunch mrobot_gazebo view_mrobot_with_camera_gazebo.launch |
6.7.5 Kinect 方法
1 | roslaunch mrobot_gazebo view_mrobot_with_kinect_gazebo.launch |
6.7.6 激光雷达仿真
1 | roslaunch mrobot_gazebo view_mrobot_with_laser_gazebo.launch |
6.8 小结
URDF文件创建机器人模型
xacro优化模型
riviz+arbotiX或Gazebo仿真环境
7-机器视觉
ROS中的功能包实现以下常用的机器视觉应用。
摄像机标定:camera_calibrationg功能包实现单目和双目摄像头标定。
基于opencv的人脸识别和物体跟踪:ROS的cv_bridge功能包为两者提供了接口,赋予ROS应用强大的图形处理能力
二维码识别:ar_track_alvar功能包允许我们创建许多二维码标签,可以使用摄像头或kinect实现二维码的识别与定位。
物体识别 ORK是ROS的物体识别框架,提供了多种物体识别的方法, 需要将已知的物体模型进行训练,通过模式匹配的方式识别三维物体的位置
7.1 图像数据
二维图像数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18roslaunch usb_cam usb_camera-test.launch
rostopic info /usb_cam/image_raw
rosmsg shwo sensor_msgs/Image
- header
- height
- width
- encoding
- is_bigendian
- step 一行图像数据的字节数量, 作为数据的步长参数, 这里使
用的摄像头为width×3=1280×3=3840字节。
- data 存储图像数据的数组, 大小为step×height字节,
根据该公式可以算出这里使用的摄像头产生一帧图像的数据大小是:
3840×720=2764800字节, 即2.7648MB
一帧720×1280分辨率的图像数据量就是2.76MB, 如果按照30帧/秒的帧率计算,
那么一秒钟摄像头产生的数据量就高达82.944MB压缩后的数据:
1
2
3
4ROS也设计了压缩图像的消息类型——sensor_msgs/CompressedImage
- header
- data
- format三维点云数据
kinect数据显示中,rviz订阅camera/depth_registered/points话题后,显示的三维点云数据,查看命令:
$rostopic info /camera/depth_registered/points $rosmsg show sensor_msgs/PointClound2
1
2
3
4
5
6
7
8
9
10
11
- <img src="ROS_dev/2024-07-15-19-24-48-image.png" title="" alt="" width="209">
### 7.2 摄像机标定
ROS官方提供了用于双目和 单目摄像头标定的功能包——camera_calibration。
```shell
apt install ros-xxx-camera-calibration
# 标定靶 robot_vision/doc/checkerboard.pdf

2.2 启动标定程序
1 | usb摄像头启动 |
2.3 标定Camera
不断在视野中移动标定靶, 直到“CALIBRATE”按钮变色, 表示标定程序的参数采集完成。 点击“CALIBRATE”按钮, 标定程序开始自动计算摄像头的标定参数,
这个过程需要等待一段时间, 界面可能会变成灰色无响应状态, 注意千万不要关闭。
点击界面中的“SAVE”按钮, 标定参数将被保存到默认的文件夹下, 并在终端中看到该路径,
commit 按钮:提交数据并退出程序。 然后打开/tmp文件 夹, 就可以看到标定结果的压缩文件calibrationdata.tar.gz; 解压该文件 后的内容如图7-10所示, 从中可以找到ost.yaml命名的标定结果文件, 将该文件复制出来, 重新命名就可以使用了
2.4 标定Kinect
1 | roslaunch robot_vision freenect.launch |
2.5 加载标定参数配置文件
标定摄像头生成的配置文件是YAML格式的, 可以在启动摄像头的 launch文件中进行加载, 例如加载摄像头标定文件的robot_vision/launch/usb_cam_with_calibration.launch:
1 | <launch> |
Kinect标定文件的加载方法相同, 分别设置RGB摄像头和红外深度 摄像头的标定文件即可, 详见
robot_vision/launch/freenect_with_calibration.launch:
1 | <launch> |
比如运行的警告,分别将两个标定文件中的camera_name参数修改 为“rgb_A70774707163327A”、 “depth_A70774707163327A”即可。
7.3 opencv库
1 | sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv |
7.4 人脸识别
1 | roslaunch robot_vision usb_cam.launch |
7.5 物体跟踪
1 | roslaunch robot_vision usb_cam.launch |
7.6 二维码识别
在ROS Noetic中安装ar_track_alvar
包并不是像其他一些ROS版本那样直接通过包管理器简单安装,因为Noetic版本中并没有预编译好的ar_track_alvar
包。但是,你仍然可以通过从源代码编译的方式来安装它。
1 | sudo apt-get install ros-kinetic-ar-track-alvar |
识别
1 | roslaunch robot_vision usb_cam_with_calibration.launch |
7.7 物体识别 ORK
ROS中集成了一个强大的物体识别框架——Object Recognition Kitchen(ORK) , 其中包含了多种三维物体识别的方法。
1 | sudo apt-get install ros-indigo-object-recognition-kitchen-* |
7.8 小节
8-机器语音
英文语音识别: 基于创建的语音库, ROS中的pocketsphinx功能包可以实现机器人的语音识别功能。
英文语音播放: ROS中的元功能包audio-common提供了文本转语音的功能包sound_play, 可以实现机器人的英文语音播放功能。
智能语音应答: 结合人工智能标记语言AIML, 机器人可以从语料库中智能匹配交流的输出语句, 从而实现智能化交流应用。
中文语音的识别与合成: 在ROS中集成科大讯飞的语音处理SDK, 让机器人更懂中文
8.1.1 pocketsphinx 功能包
9 SLAM与自主导航
使用ROS实现机器人的SLAM和自主导航等功能是非常方便的, 因为有较多现成的功能包可供开发者使用, 如gmapping、 hector_slam、 cartographer、 rgbdslam、 ORB_SLAM、 move_base、 amcl等。
9.2 准备工作
1) 导航功能包对差分、 轮式机器人的效果好, 并且假设机器人可直接使用速度指令进行控制, 速度指令的定义如图9-5所示。
linear: 机器人在xyz三轴方向上的线速度, 单位是m/s。
angular: 机器人在xyz三轴方向上的角速度, 单位是rad/s。
2) 导航功能包要求机器人必须安装激光雷达等测距设备, 可以获取环境深度信息。
3) 导航功能包以正方形和圆形的机器人为模板进行开发, 对于其他外形的机器人, 虽然可以正常使用, 但是效果可能不佳。
9.2.1 传感器信息,
1 深度信息
ROS在sensor_msgs包中定义了专用数据结构——
LaserScan, 用于存储激光消息。
1 | root@cdce9f3334ed:/data/mrobot_ws# rosmsg show sensor_msgs/LaserScan |
Kinect等RGB-D摄像头,(三维点云数据)
那么将三维数据降维到二维数据 的方法也很简单, 即把大量数据拦腰斩断, 只抽取其中的一行数据, 重新封装为LaserScan消息, 就可以获取到需要的二维激光雷达信息。 这么做虽然损失了大量有效数据, 但是刚好可以满足2D SLAM的需求。
ROS中也提供了相应的功能包——
depthimage_to_laserscan, 可以在launch文件中使用如下方法调用:
1 | <!-- 运行depthimage_to_laserscan节点, 将点云深度数据转换成激光数据 --> |
- 里程计信息
导航功能包要求机器人能够发布里程计nav_msgs/Odometry消息。包含机器人在自由空间中的位置和速度估算值。
pose: 机器人当前位置坐标, 包括机器人的x、 y、 z三轴位置与方向参数, 以及用于校正误差的协方差矩阵。
twist: 机器人当前的运动状态, 包括x、 y、 z三轴的线速度与角速度, 以及用于校正误差的协方差矩阵
上述数据结构中, 除速度与位置的关键信息外, 还包含用于滤波算法的协方差矩阵。 在精度要求不高的机器人系统中, 可以使用默认的协 方差矩阵; 而在精度要求较高的系统中, 需要先对机器人精确建模后, 再通过仿真、 实验等方法确定该矩阵的具体数值。
1 | root@cdce9f3334ed:/data/mrobot_ws# rosmsg show nav_msgs/Odometry |
9.2.2 仿真平台
1、创建仿真环境
自定义环境,Fail,todo
教材资料worlds OK
2、加载机器人
1 | rostopic list |
9.2.3 真实Robot
todo
9.3 gamapping
gmapping功能包集成了Rao-Blackwellized粒子滤波算法, 为开发者隐去了复杂的内部实现。 图9-14所示的是gmapping功能包的总体框架。

1 | $ sudo apt-get install ros-kinetic-gmapping |
发布的话题
/map
:
这个话题发布的是地图消息,类型为nav_msgs/OccupancyGrid
。它包含了环境的地图信息,包括栅格的大小、分辨率、位置、方向以及每个栅格的占用概率。/map_metadata
(在早期版本中):
有时gmapping
会单独发布地图元数据,如地图的原点和分辨率,但这些信息现在通常包含在/map
消息中。/map_update
:
当地图发生更新时,gmapping
会发布nav_msgs/OccupancyGrid
类型的消息到/map_update
话题,只包含地图改变的部分,而不是整个地图。/pose
:
发布机器人在地图中的估计位置,类型为geometry_msgs/PoseWithCovarianceStamped
。/initialpose
:
这个话题虽然不是由gmapping
发布,但通常与gmapping
配合使用。它允许用户手动设置机器人在地图中的初始位置和姿态,类型为geometry_msgs/PoseWithCovarianceStamped
。
订阅的话题
/scan
:gmapping
订阅激光雷达传感器的扫描数据,类型为sensor_msgs/LaserScan
,用于构建和更新地图。/odom
:
订阅来自里程计或者其他定位系统的位姿数据,类型为nav_msgs/Odometry
,用于辅助定位和地图构建。/tf
:
订阅TF(Transform)树,类型为tf/tfMessage
,用于处理坐标系变换,尤其是在多机器人或多传感器系统中。
提供的服务
/global_map
:gmapping
提供了一个名为/global_map
的服务,类型为nav_msgs/GetMap
,用于请求当前的地图信息。客户端可以通过调用此服务获取完整的地图数据。/set_initial_pose
:
有时候gmapping
也提供一个服务来设置初始位姿,尽管这通常通过发布到/initialpose
话题来完成。
1 | 模拟环境 |
1 | roslaunch mrobot_gazebo mrobot_kinect_nav_gazebo.launch |
9.4 hector-slam
hector_slam功能包使用高斯牛顿方法, 不需要里程计数据, 只根据 激光信息便可构建地图。 因此, 该功能包可以很好地在空中机器人、 手持构图设备及特种机器人中运行。
1 | apt install ros-noetic-hector-slam |
hector_slam的核心节点是hector_mapping, 它订阅“/scan”话题以获取SLAM所需的激光数据。 与gmapping相同的是, hector_mapping节点也会发布map话题, 提供构建完成的地图信息; 不同的是,hector_mapping节点还会发布slam_out_pose和poseupdate这两个话题, 提供当前估计的机器人位姿。
name | Type | 描述 | |
---|---|---|---|
订阅 | scan | sensor_msgs/LaserScan | 雷达数据 |
syscommand | std_msgs/String | ||
发布 | map_metadata | nav_msgs/MapMetaData | |
map | nav_msgs/OccupancyGrid | 发布地图栅格数据 | |
slam_out_pose | geometry_msgs/PoseStamped | ||
poseupdate | geometry_msgs/PoseWithCovarianceStamped | ||
服务 | dynamic_map | nav_msgs/GetMap |
9.4.2 配置
1 | mrobot_navigation/launch/hector.launch |
9.4.3 Gazebo仿真SLAM
1 | roslaunch mrobot_gazebo mrobot_laser_nav_gazebo.launch |
hector_slam建图的效果也非常不错, 但由于要基于深度数据估算里程计信息, 因此对深度传感器的数据精度有较高要求, 建图的稳定性不如gmapping。 如果使用Kinect在该仿真环境中进行 hector_slam建图, 特征点过少, 估算的里程计信息不佳, 建图的效果会大打折扣
9.4.4 真实SLAM
9.5 cartographer[todo]
谷歌宣布开放一个名为cartographer的即时定位与地图建模库, 开发人员可以使用该库实现机器人在二维或三维条件下的定位及建图功能。
cartograhper的设计目的是在计算资源有限的情况下, 实时获取相对较高精度的2D地图。 考虑到基于模拟策略的粒子滤波方法在较大环境下对内存和计算资源的需求较高, cartographer采用基于图网络的优化方法。
目前cartographer主要基于激光雷达来实现SLAM,
1 | apt-get install -y python3-wstool python3-rosdep ninja-build |
1 | git |
测试
1 | wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag |
9.6 rgbslam
https://github.com/felixendres/rgbdslam_v2
1 | 依赖安装 |
数据包实现(测试)SLAM
1 | 数据包: |
9.6.3 使用Kinect实现SLAM
运行之前修改rgbdslam.launch中的图像话题名, 必须与Kinect发布的话题一致。
1 | $ roslaunch robot_vision freenect.launch |
9.7 ORB-SLAM
1 | git clone https://github.com/raulmur/ORB_SLAM2.git |
eigen 3.2 安装
https://eigen.tuxfamily.org/index.php?title=Main_Page
1 | mkdir build |
编译ORB-SLAM2
1 | mkdir build |
编译依赖
1 | ./build.sh |
ORB-SLAM2环境配置及运行_orbslam2环境配置-CSDN博客
【SLAM】Jetson Xvier运行ORB_SLAM2 配置、跑数据集、usb_cam实时轨迹_orb-slam2怎么获得真实轨迹-CSDN博客
编译ORB-SLAM2 的ROS功能包
1 | export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:ORB_SLAM_PATH/ORB_SLAM2/Examples/ROS |
9.7.2 数据包实现单目SLAM
http://vision.in.tum.de/rgbd/dataset/freiburg1/rgbd_dataset_freiburg1_desk.bag
1 | rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/Asus.yaml |
启动成功后就可以看到如图9-48所示的界面, 暂时还没有数据产生, 所以界面中没有任何显示。
现在播放数据包:
1 | rosbag play rgbd_dataset_freiburg1_desk.bag \ |
一会就可以在界面中看到如图9-49所示的SLAM过程
ORB_SLAM2构建的地图是一种三维稀疏点云的形式, 与其他方法构建的地图格式有所不同。
ORB_SLAM2包中还提供了AR功能,
1 | roscore |
9.7.3 摄像头实现单目SLAM
1 | roslaunch robot_vision usb_cam_remap.launch |
AR
1 | roslaunch robot_vision usb_cam_remap.launch |
9.8 导航功能包
定位+导航
ROS提供两个功能包:
1) move_base: 实现机器人导航中的最优路径规划。
2) amcl: 实现二维地图中的机器人定位。
在此基础上,提供一套完整的导航功能框架

采集传感器信息
robot发布nav_msgs/Odometry里程计信息,TF变换
输出geometry_msgs/Twist控制指令
1 | apt install ros-noetic-navigation |
9.8.2 move_base功能包
move_base是ROS中完成路径规划的功能包, 主要由以下两大规划器组成。
全局路径规划(global_planner) 。 全局路径规划是根据给定的目标位置和全局地图进行总体路径的规划。 在导航中, 使用Dijkstra或A* 算法进行全局路径的规划, 计算出机器人到目标位置的最优路线, 作为机器人的全局路线。
本地实时规划(local_planner) 。 在实际情况中, 机器人往往无法严格按照全局路线行驶, 所以需要针对地图信息和机器人附近随时可能出现的障碍物规划机器人每个周期内应该行驶的路线, 使之尽量符合全局最优路径。 本地实时规划由local_planner模块实现, 使用Dynamic Window Approaches算法搜索躲避和行进的多条路经, 综合各评价标准 (是否会撞击障碍物, 所需要的时间等) 选取最优路径, 并且计算行驶周期内的线速度和角速度, 避免与动态出现的障碍物发生碰撞。
话题&服务
Name | Type | Info | |
---|---|---|---|
Act Sub | move_base/goal | ||
move_base/cancel | |||
Act Pub | move_base/feedback | ||
move_base/status | |||
move_base/result | |||
Topic Reg | move_base_simple/goal | ||
Topic Send | cmd_vel | ||
Server | ~make_plan | ||
~clear_unknown_space | |||
~clear_costmaps | |||
参数
todo
9.8.3 amcl功能包
自适应(或kld采样) 的蒙特卡罗定位方法(amcl)
Topic Reg | Scan | 激光雷达数据 | |
Tf | 坐标变换信息 | ||
initialpose | |||
map | |||
Topic Send | amcl_pose | 机器人在地图中的位姿估计,带协方差信息 | |
particlecloud | 粒子滤波器维护的位姿估计集合 | ||
Tf | |||
Servers | global_localization | 初始化全局定位 | |
request_nomotion_update | 手动执行更新发布更新粒子 | ||
Server call | static_map | amcl调用该服务获取地图数据 | |
坐标变换
里程计 VS amcl 实现机器人定位的区别?
里程计: 只通过里程计的数据处理/base和odom之间的TF变换
amcl定位:可以估算robot在地图坐标系的位姿,提供base odom ,map之间的TF变换
9.8.4 代价地图配置
通用配置文件(Common Configuration,local_costmap&global_costmap)
costmap_common_params.yaml的配置文件, 具体代
码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17obstacle_range: 2.5 # 检测障碍物的最大范围 2.5m
raytrace_range: 3.0 # 检测自由空间的最大范围
# 机器人在二维地图上的占用面积,
# footprint: [[0.165, 0.165], [0.165, -0.165], [-0.165, -0.165], [-0.165, 0.165]]
robot_radius: 0.165
inflation_radius: 0.1 # 障碍物保持的最小安全距离
# 障碍物的最大高度和最小高度
max_obstacle_height: 0.6
min_obstacle_height: 0.0
observation_sources: scan
scan: { data_type: LaserScan,
topic: /scan,
marking: true,
clearing: true,
expected_update_rate: 0}
# marking和clearing参数用来表示是否需要使用传感器的实时信息来
# 添加或清除代价地图中的障碍物信息。全局规划配置文件(Global Configuration, global_costmap)
global_costmap_params.yaml, 代码如下:
1 | global_costmap: |
- 本地规划配置文件(Local Configuration, local_costmap)
local_costmap_params.yaml, 代码如下:
1 | local_costmap: |
9.8.5 本地规划器配置
base_local_planner_params.yaml
本地规划采用Trajectory Rollout算法, 并且设置算法中需要用到的机器人速度、 加速度阈值等参数。
9.9 rviz仿真导航
1 | mrobot_navigation/launch/fake_move_base.launch |
1. 开始导航
1 | roslaunch mrobot_bringup fake_mrobot_with_laser.launch |
checkfile:
- mrobot_navigation\rviz\nav.rviz
运行结果:
用鼠标点击菜单栏中的“2D Nav Goal”按钮, 这个按钮的功能是帮 助我们设置导航的目标点。 将鼠标移动到地图上导航的目标位置, 点击 鼠标左键(注意不要放开) 。 这时, 可以在目标位置看到一个绿色的箭 头, 因为导航目标点不仅包含机器人的位置信息, 还包含机器人的姿态 信息, 通过拖动鼠标可以设置导航目标的姿态
2. 自动导航(todo)
1 | roslaunch mrobot_bringup fake_mrobot_with_laser.launch |
9.10 gazebo仿真导航
首先启动Gazebo仿真环境, 然后启动move_base导航功能节点。
1 | 1 |
1.运行效果
2.实时避障
9.11 真实导航
9.12 自主探索slam
为什么机器人在SLAM过程中需要远程遥控机器人运动?
能不能让机器人自主移动并且实现SLAM呢?
将前面学到的SLAM和导航功能结合到一起, 在导航避障过程中建立环境地图。
下面以gmapping为例(其他SLAM功能包类似) , 实现机器人自主探索式的SLAM, 不再需要人工 控制。
1 launch
gmapping_demo.launch文件基础上,添加move_base节点加入到SLAM系统中。
mrobot_navigation/launch/exploring_slam_demo.launch
1 | <launch> |
2 rviz设置探索目标
1 | gazebo环境模拟 |
3 实现自主探索
修改target PT: mrobot_navigation/scripts/exploring_slam.py
1 | locations['1'] = Pose(Point(4.589, -0.376, 0.000), Quaternion(0.000, 0.000, -0.447, 0.89 |
1 | 自主探索 |
总结
SLAM建图
自主导航(框架使用)
自主探索SLAM (SLAM+自主导航)
10-Movelt机械臂
MoveIt
创建配置机械臂
启动moveIt
配置文件
ArbotiX 关节配置
pick and place
Gazebo仿真
控制Gazebo机器臂
11-ROS与机器学习
Alpha GO
TF基础
线性回归
手写数字识别
物体识别
12-ROS进阶
action
plugin
rviz plugin
动态参数配置
SMACH
ROS-MATLAB
Web GUI
13-ROS机器人实例
PR2
TurtleBot
Universal Robots
catvehicle
HRMRP
Kungfu Arm