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]