ROS2介绍
ROS2简介
The Robot Operating System (ROS) is a set of software libraries and tools that help you build robot applications. From drivers to state-of-the-art algorithms, and with powerful developer tools, ROS has what you need for your next robotics project. And it's all open source.
机器人操作系统(ROS)是一组软件库和工具,可帮助您构建机器人应用程序。从驱动程序到最先进的算法,再加上强大的开发工具,ROS为您的下一个机器人项目提供了所需的东西。而且都是开源的。
ROS2框架


ROS2参考资料
官方资料
由于ROS2参考文档太少,所以很多教程还是需要看ROS2官网:
推荐的视频资料与配套文档
非常推荐以下资料与视频
https://www.bilibili.com/video/BV1VB4y137ys
赵虚左原版配套资料:ROS2理论与实践-赵虚左<密码:qinghuamengshi>.pdf
暂时无法在飞书文档外展示此内容
学习ROS2需要用到的知识储备
- 需要用哪些知识?
- Linux基本操作与Shell脚本语言
Linux基本教程
https://www.runoob.com/linux/linux-tutorial.html- Cmake基本使用
Linux C++编译环境配置- Git基本操作
Vinci机器人队Git入门教程- C/C++语言
Vinci机器人队电控组入门指导
Vinci机器人队C/C++资料- Python3语言
Vinci机器人队Python3教程
https://www.runoob.com/python3/python3-tutorial.html- XML语言
https://www.runoob.com/xml/xml-tutorial.html- YAML语言
http://www.noobyard.com/article/p-saghdsms-mn.html
安装ROS2
ROS1安装请看ROS机器人操作系统教程
** 建议使用Kubuntu 24.04 LTS ** ** 建议学习 ROS2 Jazzy 版本,本教程将基于ROS2 Jazzy **
二进制包安装ROS2(以Kubuntu Jammy 22.04安装 ROS Humble 为例)
注意:
截至2024年12月,强烈建议如果要用ROS2的话,一定要用ROS Humble,别用ROS Jazzy,这玩意有些区别,特别是Gazebo,几乎没啥教程的。
Ubuntu Jammy 22.04(LTS)请安装ROS Humble(LTS)。安装向导网站:https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html
Ubuntu Noble 24.04(LTS)请安装ROS Jazzy(LTS)。安装向导网站:https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debians.html
各个ROS1、ROS2版本所支持的发行版:https://www.ros.org/reps/rep-2000.html
进入ROS官网


一定要安装LTS版本的ROS2

安装ROS2前期准备工作
装LTS版本的ROS2点击使用debian包管理工具安装ROS2二进制文件

按照ROS2官网教程在终端里输入如下命令


依旧输入以下命令启动Ubuntu Universe Repo


换源(国内源)
这个是官网的源,是从国外服务器下载ROS2二进制文件的,对网络有要求,所以我们要给改为国内源。

百度搜索北京外国语大学镜像源(亲测,北方最快的源)


找到ROS2,然后勾上sudo和https,选择正确的Linux发行版。在使用该命令前有可能会遇到权限不够的问题,可以先往下看,如何以root权限运行所有命令。


先输入sudo passwd设置root密码(Ubuntu系发行版要干的事)(debian,Fedora等发行版在装机时就已经设置过了,无需运行)

sudo passwd
su -
然后进入管理员权限下

挨行复制输入运行



上面下载key的时候如果卡住了,那就是github又抽风了,很正常的问题,可以选择科学*上网(科学机场教程)解决,如果还解决不了,可以通过下方教程修改hosts。
成功下载key之后,继续往下弄。
输入exit退出root模式
exit

通过apt安装ROS2
把以下红色框框的全部在终端里敲一遍

国内的镜像下载还是非常快的。

ROS2基础环境变量配置
复制该行

输入以下命令
sudo apt-get install vim
sudo vim ~/.bashrc
在最底部把这行加上(vim不会使用的,请自行百度)

刷新以下当前终端的环境变量
echo 'export ROSDISTRO_INDEX_URL=https://mirrors.bfsu.edu.cn/rosdistro/index-v4.yaml' >> ~/.bashrc
source ~/.bashrc

测试ROS2
请往下翻到**测试ROS2**章节
从源码安装ROS2(难度较高,Ubuntu用上面那个简单方法即可。)
Fedora或者Rocky
先进官网,选择对应的版本,比如我这里选择ROS Jazzy.

然后选择用源码进行编译,找到对应的发行版,比如我这里是Feodra.

然后根据官网教程来就行

- 设置区域
确保你的 locale 支持 UTF-8。如果你在一个最小的环境(比如 docker 容器)中,locale 可能是 C 等最小的东西。我们使用以下设置进行测试。但是,如果您使用的是其他支持 UTF-8 的区域设置,应该没问题。
locale # check for UTF-8
sudo dnf install langpacks-en glibc-langpack-en
export LANG=en_US.UTF-8
locale # verify settings
- 启用必须的仓库
Fedora无需额外启用仓库,RHEL需要.
- 安装开发工具
sudo dnf install -y \
cmake \
gcc-c++ \
git \
make \
patch \
python3-colcon-common-extensions \
python3-mypy \
python3-pip \
python3-pydocstyle \
python3-pytest \
python3-pytest-cov \
python3-pytest-mock \
python3-pytest-repeat \
python3-pytest-rerunfailures \
python3-pytest-runner \
python3-rosdep \
python3-setuptools \
python3-vcstool \
wget
# install some pip packages needed for testing and
# not available as RPMs
python3 -m pip install -U --user \
flake8-blind-except==0.1.1 \
flake8-class-newline \
flake8-deprecated
- 构建ROS2
- 获取ROS2源码
找一个要存放ROS2的文件夹,建议在/home分区找,然后在这个文件夹下打开终端.mkdir -p ./ros2_jazzy/src cd ./ros2_jazzy vcs import --input https://raw.githubusercontent.com/ros2/ros2/jazzy/ros2.repos src
- 更新系统
ROS 2 软件包构建在经常更新的 红帽系 系统上。始终建议您在安装新软件包之前确保您的系统是最新的。sudo dnf upgrade- 初始化并更换rosdep源
https://mirrors.bfsu.edu.cn/help/rosdistro/

# 手动模拟 rosdep init sudo mkdir -p /etc/ros/rosdep/sources.list.d/ sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list -L https://mirrors.bfsu.edu.cn/github-raw/ros/rosdistro/master/rosdep/sources.list.d/20-default.list # 加入环境 echo 'export ROSDISTRO_INDEX_URL=https://mirrors.bfsu.edu.cn/rosdistro/index-v4.yaml' >> ~/.bashrc # 加载.bashrc source ~/.bashrc # 更新rosdep rosdep update

- 通过rosdep安装依赖
export ROS_PYTHON_VERSION=3 rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
如果出现上面这种错误,使用pip3安装包.sudo pip3 install flake8-docstrings
然后,使用下面命令忽略掉flake8-docstrings.rosdep install --from-paths src --ignore-src -y \ --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers python3-flake8-docstrings"
显示成功即可
- 配置环境(不是红帽系的发行版不用弄)
如果你是红帽系系统需要下面配置
可以用下面这些命令暂时定义这些宏。export RPM_PACKAGE_NAME=qt_gui_cpp # 根据包名调整(如 ros_<package>) export RPM_PACKAGE_VERSION=1.0.0 export RPM_PACKAGE_RELEASE=1 export RPM_ARCH=$(uname -m)变量名 示例值 用途 RPM_PACKAGE_NAME qt_gui_cpp 定义 RPM 包名 RPM_PACKAGE_VERSION 1.0.0 定义 RPM 包版本 RPM_PACKAGE_RELEASE 1 定义 RPM 包发行号 RPM_ARCH x86_64 或 arm64 定义目标系统架构 
- 使用colcon构建源码
colcon build --symlink-install
等待构建完毕,下方就是构建完毕且没错误的样子
- 配置基础环境
找到下方文件夹,并复制路径,比如我的是~/UserFloder/Applications/ros2_jazzy

使用vim修改bash的环境
vim ~/.bashrc
使用Insert按键进行输入

添加完这两行后,按ESC,然后:wq保存并退出.
# 刷新当前环境变量
source ~/.bashrc
- 测试ROS2
请往下翻到**测试ROS2**章节
Debian
先进官网,选择对应的版本,比如我这里选择ROS Jazzy.

然后选择用源码进行编译,找到对应的发行版,比如我这里是Debian.

接下来,从下图这里开始,跟着官方教程一路敲,但是有几个需要注意的点,我这里都会写出来:

- 设置区域
locale # check for UTF-8
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
locale # verify settings
- 换源

红色部分是Ubuntu要做的,我们是debian,不需要做。
蓝色部分我们不要用官方的,官方是国外源,我们替换成国内源。
先去镜像源换源:
https://mirrors.bfsu.edu.cn/help/ros2/

比如我是debian12:
sudo apt install curl gnupg2
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.bfsu.edu.cn/ros2/ubuntu bookworm main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update

- 上图成功换源后,再安装ros的工具:

sudo apt update && sudo apt install -y \
python3-flake8-blind-except \
python3-flake8-class-newline \
python3-flake8-deprecated \
python3-mypy \
python3-pip \
python3-pytest \
python3-pytest-cov \
python3-pytest-mock \
python3-pytest-repeat \
python3-pytest-rerunfailures \
python3-pytest-runner \
python3-pytest-timeout \
ros-dev-tools
- 下载ROS2源码

找一个要存放ROS2的文件夹,建议在/home分区找,然后在这个文件夹下打开终端.
mkdir -p ./ros2_jazzy/src
cd ./ros2_jazzy
vcs import --input https://raw.githubusercontent.com/ros2/ros2/jazzy/ros2.repos src

- 补依赖之前,我们需要先初始化rosdep并给rosdep换源:

图中红色部分,不要跟着这个来,这个是官方源,会很慢很慢,建议用bfsu的仓库。
https://mirrors.bfsu.edu.cn/help/rosdistro/


# 手动模拟 rosdep init
sudo mkdir -p /etc/ros/rosdep/sources.list.d/
sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list -L https://mirrors.bfsu.edu.cn/github-raw/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
# 加入环境
echo 'export ROSDISTRO_INDEX_URL=https://mirrors.bfsu.edu.cn/rosdistro/index-v4.yaml' >> ~/.bashrc
# 加载.bashrc
source ~/.bashrc
# 更新rosdep
rosdep update


出现以上红框部分,就是成功换源了。如果你不换源,下面补依赖的过程可能会巨慢(我具体没试过,猜测),除非你科学了。
sudo apt upgrade
export ROS_PYTHON_VERSION=3
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"

- 编译ROS2
在ros_jazzy目录下,打开终端,跑下面命令。
colcon build --symlink-install
colcon build还有以下命令,如--packages-skip和--packages-select用来跳过和单个功能包编译。

等待构建完毕,下方就是构建完毕且没错误的样子

- 配置基础环境
找到下方文件夹,并复制路径,比如我的是~/UserFloder/Applications/ros2_jazzy

使用vim修改bash的环境
vim ~/.bashrc
使用Insert按键进行输入

# 配置ROS2环境
export ROSDISTRO_INDEX_URL=https://mirrors.bfsu.edu.cn/rosdistro/index-v4.yaml
source ~/UserFloder/Applcations/ros2_jazzy/install/setup.bash
添加完这两行后,按ESC,然后:wq保存并退出.
# 刷新当前环境变量
source ~/.bashrc
- 测试ROS2
请往下翻到**测试ROS2**章节
Docker安装ROS2
ROS2安装进阶(可选)
上面只是安装了最基本的ROS2包和配置了最基本的ROS2环境。
你安装完上面的内容后,可以选择接着进行下面的进阶配置ROS2环境。
也可以不安装进阶得东西,学到啥再安装啥就可以,当然也有想一劳永逸的同学,所以下面也会列出来最常用的ros2包和环境配置供大家一次性安装。
https://index.ros.org/?search\_packages=true
安装进阶的包
以下是一些ROS2自带的导航算法和仿真环境等等的包,下方将列出这些包。
如果你是Ubuntu的话:
下面的包你全都可以用apt安装,不用手动编译!!!
如果你不是Ubuntu的话:
灰色的是上面基础教程安装过的包,
黄色是需要手动编译的包,
蓝色是不仅要手动编译,还要手动修改一些源码的包。
| ROS的包(非Ubuntu的发行版基本都需要手动编译) |
|---|
| 软件包/库名称 |
| ros-humble-desktop |
| ros-humble-xacro |
| ros-humble-joint-state-publisher |
| ros-humble-joint-state-publisher-gui |
| ros-humble-gazebo-ros |
| ros-humble-gazebo-ros-pkgs |
| ros-humble-ros-gz |
| ros-humble-diagnostic-updater |
| ros-humble-teleop-twist-keyboard |
| ros-humble-navigation2 |
| ros-humble-nav2-bringup |
| ros-humble-slam-toolbox |
| ros-humble-cartographer |
| ros-humble-cartographer-ros |
| ros-humble-asio-cmake-module |
| ros-humble-serial-driver |
| ros-humble-pcl-ros |
| ros-humble-pointcloud-to-laserscan |
| ros-humble-vision-opencv |
| 非ROS包(基本都可以apt,dnf安装) |
|---|
| 软件包/库名称 |
| libpcl-dev |
| libeigen3-dev |
| libpcap-dev |
| libboost-dev |
| libogre-1.12-dev |
但是上面这些包可以依赖于其他的包,下面这个仓库里有全部的包的仓库链接:(往后看就知道怎么用了)
https://github.com/ros/rosdistro/tree/master

apt安装方式(Ubuntu强烈建议)
sudo apt update && sudo apt install \
ros-humble-desktop \
ros-dev-tools \
ros-humble-xacro \
ros-humble-joint-state-publisher \
ros-humble-joint-state-publisher-gui \
ros-humble-ros-gz \
ros-humble-gazebo-ros \
ros-humble-gazebo-ros-pkgs \
ros-humble-imu-tools \
ros-humble-diagnostic-updater \
ros-humble-teleop-twist-keyboard \
ros-humble-navigation2 \
ros-humble-nav2-bringup \
ros-humble-slam-toolbox \
ros-humble-cartographer \
ros-humble-cartographer-ros \
ros-humble-asio-cmake-module \
ros-humble-serial-driver \
ros-humble-pcl-ros \
ros-humble-vision-opencv \
ros-humble-pointcloud-to-laserscan \
libpcl-dev \
libeigen3-dev \
libpcap-dev \
python3-colcon-common-extensions
源码方式(非Ubuntu)
以debian12为例。
黄色的包
以安装ros-jazzy-xacro,ros-jazzy-joint-state-publisher,ros-jazzy-joint-state-publisher-gui这三个包为例,其他的包一样操作。
https://index.ros.org/?search\_packages=true
进入上面的网站,在下图中选择对应版本,比如我是JAZZY,然后在搜索框中搜索xacro,joint_state_publisher,joint_state_publisher_gui

比如xacro


找到对应版本的xacro,然后仓库地址是checkout URI,分支是vcs version,你可以使用git clone一个一个克隆下来,但这是巨麻烦的一件事,所以我们选择ROS2提供给我们的vcs命令进行下载包的源码。
首先,进入自己的ros2_jazzy文件并打开一个终端

并创建一个.repos文件,文件名随便起,比如我的叫my_ros2_jazzy_packages.repos

然后用vscode编辑,因为.repos使用的是yaml语言,vscode可以识别语法正确性:

将刚才查询的信息写上去:
repositories:
xacro:
type: git
url: https://github.com/ros/xacro.git
version: ros2
用同样的方式找到其他包:

上图说明joint_state_publisher和joint_state_publisher_gui其实是一个仓库,所以我们只需要克隆一个仓库。
然后vcs version也就是git的分支是ros2。
repositories:
xacro:
type: git
url: https://github.com/ros/xacro.git
version: ros2
joint_state_publisher:
type: git
url: https://github.com/ros/joint_state_publisher.git
version: ros2
其他的包如法炮制。
但我先以这俩包做个例子。
在ros2_jazzy目录下的终端:
vcs import src < my_ros2_jazzy_packages.repos

可以看到下图,克隆成功了

接下来进行补充依赖:
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
提示下图字样,即是成功

再编译安装即可:
colcon build --symlink-install
# 或仅编译特定包
colcon build --packages-select xacro joint_state_publisher joint_state_publisher_gui

其他的包如法炮制。
测试:
# 重新加载环境
source ~/.bashrc
# 敲命令
xacro
如下图xacro提示error即是成功,这样就是安装成功了!

其他的包如法炮制。
我也整了Humble和Jazzy的repos的文件,从官网和distribution.yaml一个个找的,你可以克隆下来直接用我整理的就可以。(但有可能部分仓库分支ROS2官方会做出修改)
https://github.com/tungchiahui/ros-docker/tree/main/repos

蓝色的包
蓝色的包大体的方式是和黄色一样的,只不过蓝色的包在下载完源码后,还需要修改下源码里的文件,再进行编译。
如vision_opencv的cv_bridge:请看下方OpenCV章节的CV_Bridge。
常见问题
- libogre-dev找不到
Gazebo的渲染引擎,在debian12中用libogre-dev搜不到,必须用libogre-1.12-dev才能搜到。
- nav2_mppi_controller里有个被当成空指针了,警告成错误了。
解决在nav2_mppi_controller的cmakelists里添加上add_compile_options(-Wno-error=null-dereference)即可。
- nav2_system_tests里有个内存重叠警告。
解决在nav2_system_tests的cmakelists里添加上下面的几行即可。
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
add_compile_options(-Wno-restrict)
endif()
- 有的库在Fedora最新版没有,在旧版有。

https://src.fedoraproject.org/projects/rpms/%2A

sudo dnf install python3-pykdl --releasever=41
sudo dnf install orocos-kdl-devel --releasever=41
- 有些python库在最新版系统上下不了,因为python版本过高
可以使用pip3安装该库
pip3 install flake8-docstrings
但后续编译的话,需要把该库加入rosdep忽略的依赖。比如python3-flake8-docstrings的话就是下面这行:
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
# 改为
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers python3-flake8-docstrings"

环境进阶
Apt方式
# rosdep换源
export ROSDISTRO_INDEX_URL=https://mirrors.bfsu.edu.cn/rosdistro/index-v4.yaml
# 加载ROS2环境
source /opt/ros/jazzy/setup.bash
# 配置ROS2的分布式
export ROS_DOMAIN_ID=6
# 配置新版Gazebo的资源(这里先注释,等你学到gazebo再打开)
#export GZ_SIM_RESOURCE_PATH=$GZ_SIM_RESOURCE_PATH:/home/tungchiahui/UserFloder/MySource/ROS_WS/gazebo_models:/home/tungchiahui/UserFloder/MySource/ROS_WS/ign_models
注意,Gazebo资源包在不同ROS2版本可能宏的名称不同,如在ROS2Humble里是IGN_GAZEBO_RESOURCE_PATH,在ROS2Jazzy里是GZ_SIM_RESOURCE_PATH。(往后的ROS2版本估计都是GZ_SIM_RESOURCE_PATH)(详见下方Gazebo教程)
源码方式
与apt方式相同,但是需要把加载ROS2环境的那个setup.bash路径设置为你的ros2安装路径。
# 加载ROS2环境
source ~/UserFloder/Applcations/ros2_jazzy/install/setup.bash
测试ROS2
示例1
打开两个终端,并分别输入如下两个红框框里的命令

弹出如下程序,则测试成功。
对着终端按Ctrl+C可以终止程序。

示例2
乌龟作为ROS老测试项目了,必须拉出来溜溜!
同样开两个终端,并分别输入以下命令。
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
鼠标点以下红色部分,然后通过小键盘的方向键可以控制乌龟运行,如果没有小键盘,可以尝试GBVCDERT等按键操控小乌龟。
同样地,对着终端按Ctrl+C可以终止程序。

常见问题
Rviz2闪烁
如果2K+的电脑安装完rviz2有显示问题,可以在.bashrc里加上下面的内容,用来让qt不缩放。
export QT_AUTO_SCREEN_SCALE_FACTOR=0
export QT_SCREEN_SCALE_FACTORS=[1.0]