# ROS2基础课程
## 1. ROS2简介和ROS1的对比
### 1.1 ROS2概述
ROS2是第二代的Robot Operating System,是ROS1的升级版本,解决了ROS1存在的一些问题。ROS2最早出现的版本Arden是在2017年,随着版本的迭代,不断地更新优化,现如今已经有了稳定的版本。与ROS1相同,Linux版本与ROS2版本的选择也是有关系的,两者对应的版本如下:
| ROS2版本 | Ubuntu版本 |
|:--------:|:-----------:|
| Foxy | Ubuntu20.04 |
| Galactic | Ubuntu20.04 |
| Humble | Ubuntu22.04 |
### 1.2 ROS2的特点
(1) 分布式架构:ROS 2采用分布式架构,允许在多个计算机上运行不同的节点。这使得ROS 2系统可以在更大规模的机器人系统中运行,并支持更高级别的并行处理和通信。
(2) 支持多语言:ROS 2支持多种编程语言,包括C++、Python、Java等。这使得开发人员可以使用自己熟悉的语言编写ROS 2应用程序,提高了开发效率和灵活性。
(3) 强化的通信机制:ROS 2引入了一种新的通信机制,称为Data Distribution Service(DDS)。DDS是一种高性能、实时的消息传递协议,可以在ROS 2系统中实现可靠的数据通信。
(4) 系统级别的工具:ROS 2提供了一套系统级别的工具,用于管理和监控ROS 2系统。这些工具包括包管理工具(如Colcon)、日志记录工具(如Rosout)和诊断工具(如Rqt)等,可以帮助开发人员更好地调试和管理机器人应用程序。
(5) 实时性能:ROS 2在设计上考虑了实时性能,并提供了一些实时性能工具和库,如Real-Time Executor(RTE)、Real-Time Publisher(RTPS)等。这使得ROS 2可以在对实时性能要求较高的应用场景中使用。
(6) 易于扩展和集成:ROS 2支持模块化的架构,允许开发人员方便地添加新的功能和扩展ROS 2系统。此外,ROS 2还与其他常用的机器人软件和库集成,例如Gazebo仿真器和MoveIt机器人运动规划库。
### 1.3 ROS2与ROS1的区别
(1) 平台
ROS1目前来说仅支持在Linux系统中运行使用,常见的是在Ubuntu中搭建使用。而ROS2目前在Ubuntu、Windows甚至嵌入式开发板上都可以搭建使用,平台更加广泛。
(2) 语言
① C++
ROS1的核心是C++03,而ROS2广泛使用C++11.
② Python
ROS1的Python使用版本是Python2,而ROS2使用的Python版本至少是3.5以上,Humble使用的Python版本是3.6。
(3) 中间件
ROS1启动前需要开启roscore,这个master掌握所有的节点之间的通讯,而ROS2则没有,只有一个抽象的中间件接口,通过该接口进行传输数据。目前,此接口的所有实现都基于DDS标准。这使得ROS2能够提供各种优质的Qos服务策略,从而改善不同网络的通信。
(4) 编译命令
ROS1的编译命令是catkin_make,而ROS2的编译命令使用colcon build命令。
如需要进一步开发学习,可以参考官方(https://docs.ros.org/en/rolling/index.html) 的教程。
## 2. ROS2安装方法
:::{Note}
我们的树莓派镜像出厂时已经安装好ROS2环境,这里是测试ROS2是否可以正常使用。
:::
### 2.1 测试步骤(测试已安装的ROS2环境)
(1) 按下“**Ctrl+Alt+T**”,打开命令行终端,在终端输入docker version。如果报错提示docker未找到命令,输入sudo snap install docker安装docker后再输入docker version,就会显示docker版本。
(2) 输入“**ros2 run turtlesim turtlesim_node**”,启动小海龟GUI界面,启动成功即说明ROS2能正常使用。
```bash
ros2 run turtlesim turtlesim_node
```
### 2.2 安装步骤
**如果想自己学习安装配置ROS2的环境,可以参考下方步骤,这里以humble版本为例(需要联网。请到第2章 树莓派5基础操作和配置 第7课 配置网络方法)。**
(1) 按下“**Ctrl+Alt+T**”,打开命令行终端,在终端输入“**docker pull ros:humble**”,下载ROS2镜像,镜像下载需要一些时间,请耐心等待一会。
```bash
docker pull ros:humble
```
(2) 镜像下载完成后,在终端输入“**docker run -it --network=host -d -v=/dev:/dev -v /tmp/.X11-unix:/tmp/.X11-unix --name humble -e DISPLAY=\${DISPLAY} --restart=always ros:humble /bin/bash**”,运行容器并指定名称为 humble。
```bash
docker run -it --network=host -d -v=/dev:/dev -v /tmp/.X11-unix:/tmp/.X11-unix --name humble -e DISPLAY=\${DISPLAY} --restart=always ros:humble /bin/bash
```
(3) 在终端输入“**xhost +**”,开启 X Server 的访问控制。
```bash
xhost +
```
(4) 在终端输入“**docker ps**”查看新创建容器的ID。
```bash
docker ps
```
(5) 在终端输入“**docker exec -it 55ce /bin/bash**”进入容器(容器的ID可以简写,只要是该容器唯一标识即可)。
```bash
docker exec -it 55ce /bin/bash
```
(6) 在终端输入“**useradd -m -s /bin/bash ubuntu**”,创建一个新用户。
```bash
useradd -m -s /bin/bash ubuntu
```
(7) 在终端输入“**passwd ubuntu**”,设置“**ubuntu**”的密码,这里我们设置为“**ubuntu**”输入密码按下之后,需要重新输入一遍密码。
```bash
passwd ubuntu
```
(8) 在终端输入“**usermod -aG sudo ubuntu**”,将新用户 ubuntu 添加sudo ,使其具有超级用户权限。
```bash
usermod -aG sudo ubuntu
```
(9) 在终端输入“**sudo apt-get update -y && sudo apt-get upgrade -y”**,更新可用软件包列表并升级系统上已安装的软件包。
```bash
sudo apt-get update -y && sudo apt-get upgrade -y
```
(10) 在终端输入“**sudo apt-get install vim -y”**,安装 Vim 文本编辑器。
```bash
sudo apt-get install vim -y
```
(11) 在终端输入“**sudo apt-get install ros-humble-desktop-full -y**”,安装 ROS Humble 版本的完整桌面环境。
```bash
sudo apt-get install ros-humble-desktop-full -y
```
(12) 输入“**docker exec -it -u ubuntu -w /home/ubuntu 55ce /bin/bash**”指令,进入容器。(注意:55ce是装有ROS2环境的容器ID)
```bash
docker exec -it -u ubuntu -w /home/ubuntu 55ce /bin/bash
```
(13) 输入“**source /opt/ros/humble/setup.bash**”指令,手动配置ROS2环境。
```bash
source /opt/ros/humble/setup.bash
```
(14) 每一次打开终端都执行(3)步骤加载工作空间,可以在终端输入“**echo “source /opt/ros/humble/setup.bash” \>\> ~/.bashrc**”指令,将该指令写入.bashrc文件中。
```bash
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
```
(15) 然后输入“**source ~/.bashrc**”指令,让 **.bashrc** 文件生效。这样就不需要每一次加载工作空间环境。
```bash
source ~/.bashrc
```
(16) 输入“**ros2 run turtlesim turtlesim_node**”,启动小海龟GUI界面,启动成功即说明ROS2安装成功。
```bash
ros2 run turtlesim turtlesim_node
```
## 3. ROS2命令行操作
### 3.1 ROS2文件系统的组成
ROS2文件是由Packages和Manifests(package.xml)组成。
Packages(功能包)是ROS 2软件中的基本单元,它是一组相关的文件和目录的集合,用于组织和管理ROS 2的节点、库和资源等。功能包中包含了节点的源代码、配置文件、消息和服务定义等。
Manifests(package.xml)是功能包的描述文件,用于定义功能包的相关元信息和依赖关系。在ROS 2中,功能包通常包含一个名为package.xml的文件,其中包含有关功能包的元数据信息,如名称、版本、维护者、许可协议和依赖关系等。
Manifest文件(package.xml)在ROS 2中具有重要的作用,它提供了对功能包的描述和管理,使得ROS 2系统能够正确地处理功能包之间的依赖关系,并进行合适的构建和运行。
### 3.2 了解ROS2的基本术语
下表是对ROS2的部分基本术语的解释说明:
| 术语名称 |
说明 |
| 底层通讯层(DDS) |
提供了高性能、可靠、实时的数据通信和集成能力,为ROS 2的节点之间的消息传递和服务调用提供了基础支持 |
| 节点(Node) |
在ROS中运行的最小处理单元,通常是一个可执行文件。每个节点可使用话题或服务与其它节点进行通信。 |
| 消息(Message) |
是int、float和boolean等数据类型的变量。 |
| 话题(Topic) |
一种单向异步通信机制。通过发布消息到话题或订阅话题的形式,可以在节点之间实现数据的传输。话题的类型由对应消息的类型决定。 |
| 发布(Publishing) |
以与话题内容对应的消息类型发送数据。 |
| 发布者(Publishs) |
为执行发布,发布者节点在主节点上注册自己的话题等多种信息,并向希望订阅的订阅者节点发送消息。 |
| 订阅(Subscribing) |
以与话题内容对应的消息类型接收数据。 |
| 订阅者(Subscribers) |
为执行订阅,订阅者节点在主节点上注册自己的话题等多种信息,并从主节点接收所有发布了此节点需订阅话题的发布者节点的信息。 |
| 服务(Services) |
一种双向同步通信机制。服务客户端请求对应于特定目的任务的服务,服务服务端进行服务响应。 |
服务服务器
(Service Servers) |
以请求作为输入,响应作为输出的节点。 |
服务客户端
(Service Clients) |
以响应作为输入,请求作为输出的节点。 |
### 3.3 了解ROS2的常用文件
下表是对ROS2中部分常用文件的介绍说明:
| **术语名称** | **说明** |
|:--:|:--:|
| urdf文件 | 描述机器人所有元素的模型文件,包含连杆(link)、关节(joint)、运动学参数(axis)、动力学参数(dynamics)、可视化模型(visual)和碰撞检测模型(collision)。 |
| srv文件 | 存放在srv文件夹下,用于定义ROS服务消息,包含请求和响应两个部分,请求与响应之间使用符号“---”进行分隔。 |
| msg文件 | 存放在msg文件夹下,用于定义ROS话题消息。 |
| package.xml | 描述功能包的属性,包含功能包的名字、版本号、作者等。 |
| CmakeLists.txt | 编译配置文件,使用Cmake编译。 |
| launch文件 | 启动文件,包含系统性启动机器人所需的node和services。 |
### 3.4 了解常用命令
(1) 包管理工具
ros2 pkg有create、executables、list、prefix、xml共5个命令。
| **命令** | **详细说明** |
|:--------------------:|:------------------------------------------------:|
| ros2 pkg create | 创建功能包,指定包名、编译方式、依赖项、节点名等 |
| ros2 pkg list | 查看系统中功能包列表 |
| ros2 pkg executables | 查看包内可执行文件列表 |
| ros2 pkg prefix | 查看指定功能包的安装路径前缀 |
| ros2 pkg xml | 查看指定功能包的 package.xml 文件内容 |
(2) 节点运行工具
ros2 run的功能是运行包内节点,格式为:“**ros2 run \ \**”,如:
(3) 节点查看工具
ros2 node命令用于查看节点消息。
| **命令** | **详细说明** |
|:--------------:|:----------------------------------------------------------:|
| ros2 node list | 查看当前域内(ROS_DOMAIN_ID相同的节点组)活动的节点列表 |
| ros2 node info | 查看节点详细信息,包括订阅、发布的消息,开启的服务和动作等 |
(4) 主题操作工具
ros2 topic命令是用于对ROS2中的话题进行操作。
| **命令** | **详细说明** |
|:----------------:|:------------------------------------------:|
| ros2 topic list | 列出域内可使用的主题列表 |
| ros2 topic info | 显示主题消息类型、订阅者数量、发布者数量等 |
| ros2 topic type | 查看主题消息类型 |
| ros2 topic find | 按消息类型查找相关主题 |
| ros2 topic hz | 显示主题平均发布频率 |
| ros2 topic bw | 显示所查阅主题的带宽 |
| ros2 topic delay | 通过header中的时间戳计算消息延迟 |
| ros2 topic echo | 在控制台显示主题消息 |
| ros2 topic pub | 通过命令行发布指定主题消息 |
(5) 接口操作工具
ros2 interface指令是用于对ROS2中的接口进行操作。
| **命令** | **详细说明** |
|:--:|:--:|
| ros2 interface list | 显示系统内所有的接口,包括消息(Messages)、服务(Services)、动作(Actions) |
| ros2 interface package | 显示指定接口包内的子接口 |
| ros2 interface packages | 显示指定接口包 |
| ros2 interface show | 显示指定接口的详细内容 |
| ros2 interface proto | 显示消息模板 |
## 4. ROS2开发环境配置
:::{Note}
我们的树莓派镜像出厂时已经安装好配置好开发环境,这里只供学习参考。
:::
在后续学习和开发程序时,我们可以通过优化开发环境和安装插件来提高效率。
### 4.1 调整分辨率
(1) 按下“**Ctrl+Alt+T**”,打开命令行终端,输入“**sudo raspi-config**”命令,然后按下回车。
```bash
sudo raspi-config
```
(2) 在该界面使用“↑↓”箭头选择,“**Enter**”回车键用于确定,“**Esc**”键用于返回上一级。
(3) 选择“**2 Display Options**”,然后按下“Enter”回车键确定。
(4) 选择“**D3 VNC Resolution**”,然后按下“Enter”回车键确定。
(5) 选择“**1920\*1080**”,然后选择“**\