大家好,我是爱吃鱼香肉丝的小鱼,前两天吃饭点了个鱼香肉丝,发现居然没有胡萝卜,问老板说他这个是最正宗的,小鱼有点懵,不知道你吃过的鱼香肉丝里都有什么?
回归正题,今天要讲的是ROS2的源码和编译安装的方法。
一、ROS2源码通识课
前段时间在公司,同事问小鱼ROS2的仓库里咋没有代码,小鱼解释道:ROS2其实是由多个仓库共同组成的,ros2的主仓库里只写了其所包含的仓库地址和分支等信息,具体长下面这样。
ros2.repos文件就是仓库描述,内容如下
repositories:
ament/ament_cmake:
type: git
url: https://github.com/ament/ament_cmake.git
version: rolling
ament/ament_index:
type: git
url: https://github.com/ament/ament_index.git
version: rolling
ament/ament_lint:
type: git
url: https://github.com/ament/ament_lint.git
version: rolling
....
小鱼数了下,一共有104个仓库组成,这104个可以说就是ROS2的核心仓库了,里面包含了我们常用的各种库,比如rclcpp,rclpy等。
需要注意的是ROS2真正用到的代码远远不止这些,因为这里的每一个仓库都可能有其独立的依赖,比如说其中的spdlog_vendor,其是对spdlog这个开元库的进一步封装。
因此我们可以回答另外一个问题,为什么ROS2的版本发布会一定程度上依赖于ubuntu的版本,原因就是其ROS2有依赖一些需要系统提供的软件库,而不同ubuntu版本其软件库的版本可能不同。
接着我们就来学习下如何克隆和编译ROS2的源码。
二、ROS2源码编译
接着我们来看看如何编译安装ROS2的源码,简单的分为三步,下载源码、安装依赖、编译源码。
1.下载源码
上面说了有一个描述ros2源码的repos文件,这个文件其实是yaml格式的文章,ros2提供了一个小工具,可以读取这个文件并下载其中的代码。这个工具是——vcstool。
PS:小鱼是基于一个只有几十MB的Ubuntu Docker镜像构建的,你也可以直接安装一个Ubuntu系统进行构建。
对于一个新的系统,直接进行换源是第一步,一键安装安排。
echo "chooses:\n" > fish_install.yaml \
&& echo "- {choose: 5, desc: '一键换源'}\n" >> fish_install.yaml \
&& echo "- {choose: 2, desc: 更换系统源}\n" >> fish_install.yaml \
&& echo "- {choose: 1, desc: 添加ROS源}\n" >> fish_install.yaml \
&& apt update && apt install wget python3 python3-distro python3-yaml -y \
&& wget http://fishros.com/install -O fishros && /bin/bash fishros \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
&& apt-get clean && apt autoclean \
&& rm -rf fish_install.yaml
接着更换下系统的终端编码
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
接着安装一些依赖和构建工具,注意这里我们装了 python3-vcstool
就是vcs
sudo apt update && sudo apt install -y \
build-essential \
cmake \
git \
python3-colcon-common-extensions \
python3-flake8 \
python3-flake8-docstrings \
python3-pip \
python3-pytest \
python3-pytest-cov \
python3-rosdep \
python3-setuptools \
python3-vcstool \
wget
sudo apt install -y \
python3-flake8-blind-except \
python3-flake8-builtins \
python3-flake8-class-newline \
python3-flake8-comprehensions \
python3-flake8-deprecated \
python3-flake8-import-order \
python3-flake8-quotes \
python3-pytest-repeat \
python3-pytest-rerunfailures
接着我们就可以下载源码了
mkdir -p ~/ros2_humble/src && \
cd ~/ros2_humble && \
vcs import --input https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos src
2.2 安装依赖-rosdepc
下载好源码,我们就安装依赖,rosdepc安排
sudo apt install python3-pip && \
sudo pip3 install rosdepc && \
sudo rosdepc init && \
rosdepc update && \
cd ~/ros2_humble && \
rosdepc install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
2.3 编译
这一步老慢了,小鱼硬生生的编译了好几个小时才搞定,看看你的电脑要多久。
cd ~/ros2_humble/ && \
colcon build --symlink-install
3.Docker版本指令
最后是Docker版本指令,可以直接用于Docker镜像的构建。
FROM ubuntu:jammy
RUN echo "chooses:\n" > fish_install.yaml \
&& echo "- {choose: 5, desc: '一键安装:ROS(支持ROS和ROS2,树莓派Jetson)'}\n" >> fish_install.yaml \
&& echo "- {choose: 2, desc: 更换源继续安装}\n" >> fish_install.yaml \
&& echo "- {choose: 1, desc: 清理三方源}\n" >> fish_install.yaml \
&& apt update && apt install wget python3 python3-distro python3-yaml -y \
&& wget http://fishros.com/install -O fishros && /bin/bash fishros \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
&& apt-get clean && apt autoclean \
&& rm -rf fish_install.yaml
RUN 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
RUN DEBIAN_FRONTEND=noninteractive apt install -y tzdata
RUN sudo apt update && sudo apt install -y \
build-essential \
cmake \
git \
python3-colcon-common-extensions \
python3-flake8 \
python3-flake8-docstrings \
python3-pip \
python3-pytest \
python3-pytest-cov \
python3-rosdep \
python3-setuptools \
python3-vcstool \
wget
RUN sudo apt install -y \
python3-flake8-blind-except \
python3-flake8-builtins \
python3-flake8-class-newline \
python3-flake8-comprehensions \
python3-flake8-deprecated \
python3-flake8-import-order \
python3-flake8-quotes \
python3-pytest-repeat \
python3-pytest-rerunfailures
ENV https_proxy=http://172.17.0.1:2340
ENV http_proxy=http://172.17.0.1:2340
ENV all_proxy=socks5://172.17.0.1:2341
RUN mkdir -p ~/ros2_humble/src && \
cd ~/ros2_humble && \
vcs import --input https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos src
RUN sudo apt install python3-pip && \
sudo pip3 install rosdepc && \
sudo rosdepc init && \
rosdepc update && \
cd ~/ros2_humble && \
rosdepc install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
RUN cd ~/ros2_humble/ && \
colcon build --symlink-install
# Ref: https://docs.ros.org/en/humble/Installation/Alternatives/Ubuntu-Development-Setup.html