第 1 節

ROS2介紹

0瀏覽次數0訪問次數--跳出率--平均停留

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.ros.org/

推薦的視頻資料與配套文檔

非常推薦以下資料與視頻

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

趙虛左原版配套資料:ROS2理論與實踐-趙虛左<密碼:qinghuamengshi>.pdf

暫時無法在飛書文檔外展示此內容

學習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

安裝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。

https://blog.csdn.net/qq\_40584960/article/details/117963644?sharetype=blog&shareId=117963644&sharerefer=APP&sharesource=qq\_33274985&sharefrom=link

成功下載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

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_NAMEqt_gui_cpp定義 RPM 包名
    RPM_PACKAGE_VERSION1.0.0定義 RPM 包版本
    RPM_PACKAGE_RELEASE1定義 RPM 包發行號
    RPM_ARCHx86_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**章節

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**章節

Docker安裝ROS2

Docker教程

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。

常見問題
  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"

環境進階

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]
音乐页