Skip to content

Wiki

ROS2介绍

About 31 min read

An English translation is not available yet. The latest Simplified Chinese source is shown without triggering paid translation.

1.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为您的下一个机器人项目提供了所需的东西。而且都是开源的。

2.ROS2框架

3.ROS2参考资料

3.1.官方资料

由于ROS2参考文档太少,所以很多教程还是需要看ROS2官网:

https://www.ros.org/

3.2.推荐的视频资料与配套文档

非常推荐以下资料与视频

https://www.bilibili.com/video/BV1VB4y137ys

赵虚左原版配套资料:

4.学习ROS2需要用到的知识储备

  1. 需要用哪些知识?

    1. Linux基本操作与Shell脚本语言

      Linux基本教程

    https://www.runoob.com/linux/linux-tutorial.html

    1. Cmake基本使用

      Linux C++编译环境配置

    1. Git基本操作

      Vinci机器人队Git入门教程

    1. C/C++语言

      Vinci机器人队电控组入门指导

      Vinci机器人队C/C++资料

    1. Python3语言

      Vinci机器人队Python3教程

    https://www.runoob.com/python3/python3-tutorial.html

    1. XML语言

    https://www.runoob.com/xml/xml-tutorial.html

    1. YAML语言

    http://www.noobyard.com/article/p-saghdsms-mn.html

5.安装ROS2

ROS1安装请看ROS机器人操作系统教程

** 建议使用Kubuntu 24.04 LTS ** ** 建议学习 ROS2 Jazzy 版本,本教程将基于ROS2 Jazzy **

5.1.二进制包安装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

5.1.1.进入ROS官网

一定要安装LTS版本的ROS2

5.1.2.安装ROS2前期准备工作

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

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

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

5.1.3.换源(国内源)

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

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

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

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

sudo passwd

su -

然后进入管理员权限下

挨行复制输入运行

上面下载key的时候如果卡住了,那就是github又抽风了,很正常的问题,可以选择科学*上网(科学机场教程)解决,如果还解决不了,可以通过下方教程修改hosts。

https://blog.csdn.net/qq_40584960/article/details/117963644?sharetype=blog&shareId=117963644&sharerefer=APP&sharesource=qq_33274985&sharefrom=link

成功下载key之后,继续往下弄。

输入exit退出root模式

exit

5.1.4.通过apt安装ROS2

把以下红色框框的全部在终端里敲一遍

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

5.1.5.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

5.1.6.测试ROS2

请往下翻到**测试ROS2**章节

5.2.从源码安装ROS2(难度较高,Ubuntu用上面那个简单方法即可。)

5.2.1.Fedora或者Rocky

https://www.ros.org/

先进官网,选择对应的版本,比如我这里选择ROS Jazzy.

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

然后根据官网教程来就行

  1. 设置区域

确保你的 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
  1. 启用必须的仓库

Fedora无需额外启用仓库,RHEL需要.

  1. 安装开发工具
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
  1. 构建ROS2

    1. 获取ROS2源码

      找一个要存放ROS2的文件夹,建议在/home分区找,然后在这个文件夹下打开终端.

    mkdir -p ./ros2_jazzy/src
    cd ./ros2_jazzy
    vcs import --input https://raw.githubusercontent.com/ros2/ros2/jazzy/ros2.repos src

    1. 更新系统

      ROS 2 软件包构建在经常更新的 红帽系 系统上。始终建议您在安装新软件包之前确保您的系统是最新的。

    sudo dnf upgrade
    1. 初始化并更换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

    1. 通过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"

      显示成功即可

    1. 配置环境(不是红帽系的发行版不用弄)

      如果你是红帽系系统需要下面配置

      可以用下面这些命令暂时定义这些宏。

    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 定义目标系统架构

    1. 使用colcon构建源码
    colcon build --symlink-install

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

  2. 配置基础环境

找到下方文件夹,并复制路径,比如我的是~/UserFloder/Applications/ros2_jazzy

使用vim修改bash的环境

vim ~/.bashrc

使用Insert按键进行输入

添加完这两行后,按ESC,然后:wq保存并退出.


# 刷新当前环境变量
source ~/.bashrc
  1. 测试ROS2

请往下翻到**测试ROS2**章节

5.2.2.Debian

https://www.ros.org/

先进官网,选择对应的版本,比如我这里选择ROS Jazzy.

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

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

  1. 设置区域
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
  1. 换源

红色部分是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

  1. 上图成功换源后,再安装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
  1. 下载ROS2源码

找一个要存放ROS2的文件夹,建议在/home分区找,然后在这个文件夹下打开终端.

mkdir -p ./ros2_jazzy/src
cd ./ros2_jazzy
vcs import --input https://raw.githubusercontent.com/ros2/ros2/jazzy/ros2.repos src

  1. 补依赖之前,我们需要先初始化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"

  1. 编译ROS2

在ros_jazzy目录下,打开终端,跑下面命令。

colcon build --symlink-install

colcon build还有以下命令,如--packages-skip和--packages-select用来跳过和单个功能包编译。

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

  1. 配置基础环境

找到下方文件夹,并复制路径,比如我的是~/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
  1. 测试ROS2

请往下翻到**测试ROS2**章节

5.3.Docker安装ROS2

Docker教程

6.ROS2安装进阶(可选)

上面只是安装了最基本的ROS2包和配置了最基本的ROS2环境。

你安装完上面的内容后,可以选择接着进行下面的进阶配置ROS2环境。

也可以不安装进阶得东西,学到啥再安装啥就可以,当然也有想一劳永逸的同学,所以下面也会列出来最常用的ros2包和环境配置供大家一次性安装。

https://index.ros.org/?search_packages=true

6.1.安装进阶的包

以下是一些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

6.1.1.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
6.1.2.源码方式(非Ubuntu)

以debian12为例。

6.1.2.1.黄色的包

以安装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

6.1.2.2.蓝色的包

蓝色的包大体的方式是和黄色一样的,只不过蓝色的包在下载完源码后,还需要修改下源码里的文件,再进行编译。

如vision_opencv的cv_bridge:请看下方OpenCV章节的CV_Bridge。

6.1.3.常见问题
  1. libogre-dev找不到

Gazebo的渲染引擎,在debian12中用libogre-dev搜不到,必须用libogre-1.12-dev才能搜到。

  1. nav2_mppi_controller里有个被当成空指针了,警告成错误了。

解决在nav2_mppi_controller的cmakelists里添加上add_compile_options(-Wno-error=null-dereference)即可。

  1. nav2_system_tests里有个内存重叠警告。

解决在nav2_system_tests的cmakelists里添加上下面的几行即可。

if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
    add_compile_options(-Wno-restrict)
endif()
  1. 有的库在Fedora最新版没有,在旧版有。

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

sudo dnf install python3-pykdl --releasever=41
sudo dnf install orocos-kdl-devel --releasever=41
  1. 有些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"

6.2.环境进阶

6.2.1.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教程)

6.2.2.源码方式

与apt方式相同,但是需要把加载ROS2环境的那个setup.bash路径设置为你的ros2安装路径。


# 加载ROS2环境
source ~/UserFloder/Applcations/ros2_jazzy/install/setup.bash

7.测试ROS2

7.1.示例1

打开两个终端,并分别输入如下两个红框框里的命令

弹出如下程序,则测试成功。

对着终端按Ctrl+C可以终止程序。

7.2.示例2

乌龟作为ROS老测试项目了,必须拉出来溜溜!

同样开两个终端,并分别输入以下命令。

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

鼠标点以下红色部分,然后通过小键盘的方向键可以控制乌龟运行,如果没有小键盘,可以尝试GBVCDERT等按键操控小乌龟。

同样地,对着终端按Ctrl+C可以终止程序。

8.常见问题

8.1.Rviz2闪烁

如果2K+的电脑安装完rviz2有显示问题,可以在.bashrc里加上下面的内容,用来让qt不缩放。

export QT_AUTO_SCREEN_SCALE_FACTOR=0
export QT_SCREEN_SCALE_FACTORS=[1.0]