Ubuntu 20.04下源碼編譯安裝ROS 2 Foxy Fitzroy


 
 
ROS 2 Foxy Fitzroy(以下簡稱Foxy)於2020年6月5日正式發布了,是LTS版本,支持到2023年5月。本文主要根據官方的編譯安裝教程[1] 完成,並記錄編譯過程中遇到的問題。

1. 系統要求

在官方給出的Foxy目標系統中,Ubuntu Linux - Focal Fossa (20.04) 64位是首選,本文也選擇Ubuntu 20.04 64位,其他還包括Debian Linux - Buster (10)、Fedora 32、Arch Linux、OpenEmbedded / webOS OSE,但Foxy還沒有充分測試,不推薦使用。

 

2. 系統設置

(1) 設置locale

確保系統locale支持UTF-8,在終端運行locale查看。
如果不支持UTF-8,運行以下代碼
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

(2) 添加ROS 2 apt倉庫

1) 用apt命令認證GPG key
sudo apt update && sudo apt install curl gnupg2 lsb-release curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
此時可能會遇到ros.asc無法下載的問題。
問題1:ERROR: unable to process source https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc 之類的錯誤,可能是因為raw.githubusercontent.com網站被牆了。
解決方法:修改hosts文件,添加這個網站的ip地址[2]
#打開hosts文件
sudo gedit /etc/hosts
#在文件末尾添加
151.101.84.133 raw.githubusercontent.com
2) 添加倉庫到源列表中
推薦使用國內清華ROS 2鏡像:
sudo sh -c 'echo "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
也可以使用官方ROS 2倉庫,速度可能會慢。
sudo sh -c 'echo "deb http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'

(3) 安裝開發工具和ROS工具

sudo apt update && sudo apt install -y \
  build-essential \
  cmake \
  git \
  libbullet-dev \
  python3-colcon-common-extensions \
  python3-flake8 \
  python3-pip \
  python3-pytest-cov \
  python3-rosdep \
  python3-setuptools \
  python3-vcstool \
  wget
# install some pip packages needed for testing
python3 -m pip install -U \
  argcomplete \
  flake8-blind-except \
  flake8-builtins \
  flake8-class-newline \
  flake8-comprehensions \
  flake8-deprecated \
  flake8-docstrings \
  flake8-import-order \
  flake8-quotes \
  pytest-repeat \
  pytest-rerunfailures \
  pytest
# install Fast-RTPS dependencies
sudo apt install --no-install-recommends -y \
  libasio-dev \
  libtinyxml2-dev
# install Cyclone DDS dependencies
sudo apt install --no-install-recommends -y \
  libcunit1-dev

3. 獲取ROS 2代碼

創建工作空間,並獲取ROS 2代碼。
mkdir -p ~/ros2_foxy/src
cd ~/ros2_foxy
wget https://raw.githubusercontent.com/ros2/ros2/foxy/ros2.repos
vcs import src < ros2.repos

如果Fast-DDS無法正常下載,自行下載解壓到~/ros2_foxy/src/eProsima/Fast-DDS。

https://github.com/eProsima/Fast-DDS​github.com

4. 使用rosdep安裝依賴

sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro foxy -y --skip-keys "console_bridge fastcdr fastrtps rti-connext-dds-5.3.1 urdfdom_headers"

5. 編譯ROS 2

cd ~/ros2_foxy/
colcon build --symlink-install
編譯過程中遇到的問題如下:
問題2: ImportError: "from catkin_pkg.package import parse_package" failed: No module named catkin_pkg.package
解決方法[3]pip install catkin_pkg
問題3: importError: No module named em
解決方法[4]python -m pip install empy
問題4: importError: No module named lark
解決方法[5]python -m pip install lark-parser
問題5: can not locate Clang's built-in include directory
解決方法[6]重裝shiboken2 sudo apt remove shiboken2 libshiboken2-dev libshiboken2-py3-5.14 pip3 install --user shiboken2
問題6: 幾處因為ExternalProject_Add下載卡住的地方,修改對應的CMakeLists.txt。
解決方法: (1) ~/ros2_foxy/src/ros2/rosbag2/shared_queues_vendor/CMakeLists.txt, 8-33行
ExternalProject_Add(ext-singleproducerconsumer
  PREFIX singleproducerconsumer
  #DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download
  #URL https://github.com/cameron314/readerwriterqueue/archive/ef7dfbf553288064347d51b8ac335f1ca489032a.zip
  #自行修改 `path-to-file', zip文件見附件readerwriterqueue-ef7dfbf553288064347d51b8ac335f1ca489032a.zip
  URL /path-to-file/readerwriterqueue-ef7dfbf553288064347d51b8ac335f1ca489032a.zip
  URL_MD5 64c673dd381b8fae9254053ad7b2be4d
  #TIMEOUT 60
  INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
  INSTALL_COMMAND ""
  )

# Concurrent and blocking concurrent queue by moodycamel - header only, don't build, install
ExternalProject_Add(ext-concurrentqueue
  PREFIX concurrentqueue
  #DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download
  #URL https://github.com/cameron314/concurrentqueue/archive/8f65a8734d77c3cc00d74c0532efca872931d3ce.zip
  # 自行修改 `path-to-file', zip文件見附件concurrentqueue-8f65a8734d77c3cc00d74c0532efca872931d3ce.zip
  URL /path-to-file/concurrentqueue-8f65a8734d77c3cc00d74c0532efca872931d3ce.zip
  URL_MD5 71a0d932cc89150c2ade85f0d9cac9dc
  #TIMEOUT 60
  INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
  INSTALL_COMMAND ""
  )  
(2) ~/ros2_foxy/src/ros2/rviz/rviz_ogre_vendor/CMakeLists.txt 83-94行
 ExternalProject_Add(zlib-1.2.11
    #URL https://www.zlib.net/fossils/zlib-1.2.11.tar.gz
    #自行修改 `path-to-file', zip文件見附件zlib-1.2.11.tar.gz
    URL /path-to-file/zlib-1.2.11.tar.gz
    URL_MD5 1c9f62f0778697a09d36121ead88e08e
    #TIMEOUT 600
    LOG_CONFIGURE ${should_log}
    LOG_BUILD ${should_log}
    CMAKE_ARGS
      -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/zlib-install
      ${extra_cmake_args}
      -Wno-dev
  )
156-186行
ExternalProject_Add(ogre-v1.12.1
#    URL https://github.com/OGRECave/ogre/archive/v1.12.1.zip
    #自行修改 `path-to-file', zip文件見附件external_projects/ogre-1.12.1.zip
    URL /path-to-file/ogre-1.12.1.zip
    URL_MD5 cdbea4006d223c173e0a93864111b936
#    TIMEOUT 1200
    LOG_CONFIGURE ${should_log}
    LOG_BUILD ${should_log}
    CMAKE_ARGS
      -DOGRE_STATIC:BOOL=OFF
      -DOGRE_DEPENDENCIES_DIR=${CMAKE_CURRENT_BINARY_DIR}/ogredeps
      -DOGRE_INSTALL_PDB:BOOL=OFF
      -DOGRE_BUILD_DEPENDENCIES:BOOL=OFF
      -DOGRE_BUILD_TESTS:BOOL=OFF
      -DOGRE_BUILD_SAMPLES:BOOL=FALSE
      -DOGRE_INSTALL_SAMPLES:BOOL=FALSE
      -DOGRE_INSTALL_SAMPLES_SOURCE:BOOL=FALSE
      -DOGRE_CONFIG_THREADS:STRING=0
      -DOGRE_RESOURCEMANAGER_STRICT:STRING=2
      -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/ogre_install
      -DOGRE_BUILD_LIBS_AS_FRAMEWORKS:BOOL=OFF
      -DOGRE_BUILD_COMPONENT_PYTHON:BOOL=FALSE
      -DOGRE_BUILD_COMPONENT_JAVA:BOOL=FALSE
      -DOGRE_BUILD_COMPONENT_CSHARP:BOOL=FALSE
      -DOGRE_BUILD_COMPONENT_BITES:BOOL=FALSE
      ${extra_cmake_args}
      -Wno-dev
    PATCH_COMMAND
      ${Patch_EXECUTABLE} -p1 -N < ${CMAKE_CURRENT_SOURCE_DIR}/pragma-patch.diff
    COMMAND
      ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/FindFreetype.cmake ${CMAKE_CURRENT_BINARY_DIR}/ogre-v1.12.1-prefix/src/ogre-v1.12.1/CMake/Packages/FindFreetype.cmake
  )  
(3) ~/ros2_foxy/src/eProsima/foonathan_memory_vendor/CMakeLists.txt,57-73行
externalproject_add(foo_mem-ext
  #GIT_REPOSITORY foonathan/memory
  #GIT_TAG c619113
  #TIMEOUT 600
  #自行修改 `path-to-file', zip文件見附件memory-master.zip
  URL /path-to-file/memory-master.zip
  URL_MD5 9fcf2cf8c63d9c74bf3d0c58ca98bf71
  # Avoid the update (git pull) and so the recompilation of foonathan_memory library each time.
  UPDATE_COMMAND ""
  CMAKE_ARGS
    -DFOONATHAN_MEMORY_BUILD_EXAMPLES=OFF
    -DFOONATHAN_MEMORY_BUILD_TESTS=OFF
    -DFOONATHAN_MEMORY_BUILD_TOOLS=ON
    -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/foo_mem_ext_prj_install
    ${extra_cmake_args}
    -Wno-dev
    ${PATCH_COMMAND_STR}
  )
(4) ~/ros2_foxy/src/ros2/rosbag2/zstd_vendor/CMakeLists.txt,32-43行
ExternalProject_Add(zstd-1.4.4
    #URL https://github.com/facebook/zstd/archive/v1.4.4.zip
    #自行修改 `path-to-file', zip文件見附件zstd-1.4.4.zip
    URL /path-to-file/zstd-1.4.4.zip
    URL_MD5 3a5c3a535280b7f4dfdbd739fcc7173f
    #TIMEOUT 60
    SOURCE_SUBDIR build/cmake
    CMAKE_ARGS
      -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_install
      -DZSTD_BUILD_STATIC=OFF
      -DZSTD_BUILD_SHARED=ON
      -DZSTD_BUILD_PROGRAMS=OFF
      ${extra_cmake_args})

 6. 環境設置

打開~/.bashrc文件,在文件最后添加,這樣每次打開終端會自動執行source命令。
source ~/ros2_foxy/install/setup.bash

7. 測試

打開一個終端,運行C++編寫的talker:
ros2 run demo_nodes_cpp talker

打開另外一個終端,運行Python編寫的listener:

ros2 run demo_nodes_py listener

運行結果:

說明C++和Python的API可以正常工作。

 8. 附件

提取碼:tdxu

參考

 

[1] Building ROS 2 on Linux, https://index.ros.org/doc/ros2/Installation/Foxy/Linux-Development-Setup/

[2] rosdep init 或者rosdep update 連接錯誤的解決辦法, https://community.bwbot.org/topic/811/rosdep-init-%E6%88%96%E8%80%85rosdep-update-%E8%BF%9E%E6%8E%A5%E9%94%99%E8%AF%AF%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95

[3] No module named catkin_pkg.package, https://www.jianshu.com/p/e964928d6c62

[4] ros自定義消息的時候報錯ImportError:Nomodulenamedem_wawayu_0的專欄-CSDN博客, https://blog.csdn.net/wawayu_0/article/details/79460043

[5] Name conflict in load grammar · Issue #361 · lark-parser/lark, https://github.com/lark-parser/lark/issues/361

[6] rosbag2 build getting fail · Issue #604 · ros2/ros2, https://github.com/ros2/ros2/issues/604

注:同內容可見https://zhuanlan.zhihu.com/p/148242899


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM