前言
在RISC-V架构的米联客进迭K1开发板上搭建ROS2环境,相比x86平台会遇到更多兼容性问题。本文基于官方教程,记录了从源码编译到镜像制作的完整流程,帮助开发者少走弯路。
1文件部署
将以下两个文件(可自行下载)部署到开发板的 `/root/ros2/ros2_iron` 目录:
ros2_iron_ready.tar.gz:包含ROS2源码及rosdep缓存,含全部vendor源码包
ros2_deps.tar.gz:21个vendor依赖的离线压缩包
cd ~
tar -xzvf ros2_iron_ready.tar.gz
mkdir -p ~/ros2_deps
tar -xzf ros2_deps.tar.gz -C ~/ros2_deps --strip-components=3
ls ~/ros2_deps/ | wc -l # 验证应为21
2环境配置
2.1 安装系统依赖
sudo apt update && sudo apt install -y \
build-essential cmake git python3-pip \
libasio-dev libbullet-dev libconsole-bridge-dev \
libtinyxml2-dev libeigen3-dev \
python3-dev python3-numpy python3-yaml python3-empy
sudo pip install --break-system-packages -i https://pypi.tuna.tsinghua.edu.cn/simple \
vcstool rosdep colcon-common-extensions
2.2 配置rosdep(离线模式)
rosdep缓存已随tar包内置在 `~/rosdep_cache/` 目录下:
sudo mkdir -p /etc/ros/rosdep/sources.list.d
sudo tee /etc/ros/rosdep/sources.list.d/20-default.list << 'EOF'
yaml file:///root/rosdep_cache/base.yaml
yaml file:///root/rosdep_cache/python.yaml
yaml file:///root/rosdep_cache/ruby.yaml
yaml file:///root/rosdep_cache/osx-homebrew.yaml
yaml file:///root/rosdep_cache/iron.yaml
EOF
export ROS_OS_OVERRIDE=ubuntu:jammy
rosdep update # 离线环境会超时失败,可跳过
cd ~/ros2/ros2_iron
rosdep install -r --from-paths src --ignore-src -y \
--skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
2.3 修复Mimick RISC-V兼容问题
修改 `mimick_vendor/CMakeLists.txt`,将Mimick仓库替换为RISC-V兼容的fork:
# 第61行
set(mimick_version "90d02296025f38da2e33c67b02b7fa0c7c7d460c")
# 第63行
GIT_REPOSITORY https://github.com/ziyao233/Mimick.git
2.4 替换vendor包下载源为本地文件(关键步骤)
这一步是离线编译的核心——将各vendor的 `GIT_REPOSITORY`/`URL`/`FetchContent` 替换为本地源目录。涉及的包括:
注意事项:
`SOURCE_DIR` 必须每个文件只出现一次,重复会导致CMake报错。
`shared_queues_vendor` 比较特殊,需要预置压缩包到 `build/shared_queues_vendor/download/` 目录。
替换完成后用 `grep` 检查是否还有残留的远程下载URL。
2.5 删除PATCH_COMMAND
部分vendor的CMakeLists中有基于git的PATCH_COMMAND,由于本地源码不是git仓库,`git apply` 会失败,需要删除这些补丁命令段:
orocos_kdl_vendor:删除PATCH_COMMAND段
pybind11_vendor:删除两段PATCH_COMMAND
2.6 安装额外系统依赖
apt install -y liblttng-ust-dev
apt install -y qtbase5-dev shiboken2 libshiboken2-dev \
python3-pyside2.qtcore python3-pyside2.qtwidgets libpyside2-dev
pip install --break-system-packages lark
apt install -y libopencv-dev # 可选,避免图像相关包编译失败
3编译ROS2核心
3.1 编译前内存优化
K1板子仅3.7G内存,必须做内存优化:
# 禁用桌面音频服务防止OOM
sudo systemctl stop pipewire wireplumber pipewire-pulse 2>/dev/null
sudo systemctl mask pipewire wireplumber pipewire-pulse 2>/dev/null
# 添加2G swap
fallocate -l 2G /swapfile && chmod 600 /swapfile \
&& mkswap /swapfile && swapon /swapfile
3.2 启动编译
cd ~/ros2/ros2_iron
nohup colcon build --symlink-install \
--parallel-workers 2 \
--cmake-args -DBUILD_TESTING=OFF \
--packages-skip rviz_ogre_vendor rviz_rendering rviz_rendering_tests \
rviz rviz2 rviz_default_plugins rviz_common rviz_visual_testing_framework \
> ~/build1.log 2>&1 &
提示:`--parallel-workers` 建议设为2,设为3及以上容易触发OOM。编译过程可能需要数小时。
查看编译进度:
tail -n 15 ~/build1.log
grep -E '^Failed' ~/build1.log # 检查是否有失败
grep -cE '^Finished' ~/build1.log # 已完成数量
编译完成后再次执行同一命令,会自动跳过已成功的包,多轮收敛直到全部完成。
4设置环境变量
echo "source ~/ros2/ros2_iron/install/local_setup.bash" >> ~/.bashrc
source ~/ros2/ros2_iron/install/local_setup.bash
5验证安装
1、测试Talker/Listener通信
ros2 run demo_nodes_cpp talker > /tmp/talker.log 2>&1 &
sleep 8
ros2 run demo_nodes_py listener 2>&1 | head -20 &
sleep 5
cat /tmp/talker.log | tail -5
看到 `Publishing: 'Hello World: N'` 和 `I heard: [Hello World: N]` 即表示成功。
ros2 pkg list | wc -l # 应输出 ~330+
- 验证 TurtleSim
6制作可烧录镜像(可选)
编译好的ROS2可以打包进Bianbu系统镜像,方便批量部署:
1. 挂载原版Bianbu rootfs(从16G扩容到30G)
2. 将ROS2文件和系统库提取到rootfs中
3. 缩小rootfs到最小可用大小(约19G)
4. 打包为 `bianbu-custom.zip`(约5.7G)
5. 使用titanflasher工具烧录
烧录后验证:
source /root/ros2/ros2_iron/install/local_setup.bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
ros2 run demo_nodes_cpp talker &
ros2 run demo_nodes_py listener
如提示磁盘空间不足,需要在板子上执行 `resize2fs /dev/mmcblk2p6` 扩大分区。