如果你正在Ubuntu系统上尝试安装ROS2 Dashing,却频繁遭遇colcon not found、编码报错或各种CMake警告,这篇文章将带你一步步解决这些典型问题。不同于常规安装教程,我们将聚焦于那些官方文档没细说、但新手一定会踩的坑。
在Ubuntu上安装ROS2 Dashing前,系统语言环境设置是第一个隐形陷阱。许多中文用户会遇到如下错误:
code复制locale::facet::_S_create_c_locale name not valid
根本原因在于ROS2的工具链对UTF-8编码有强依赖,而部分Ubuntu安装时默认使用了非UTF-8的中文环境。解决方法不是简单切换为英文,而是确保UTF-8支持:
bash复制# 先安装语言包(如果缺少)
sudo apt install language-pack-zh-hans
# 然后配置UTF-8环境
sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
验证是否生效:
bash复制locale | grep -E 'LANG|LC_ALL'
预期输出应包含en_US.UTF-8。如果仍有问题,尝试:
bash复制echo "export LC_ALL=en_US.UTF-8" >> ~/.bashrc
source ~/.bashrc
注意:不要完全移除中文支持,只需确保命令行环境使用UTF-8编码。图形界面仍可保持中文显示。
官方源对国内用户可能极慢,建议替换为国内镜像。但需注意ROS2的源和Ubuntu系统源需保持一致:
bash复制# 备份原文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换系统源(以阿里云为例)
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 设置ROS2源(同样使用国内镜像)
sudo sh -c 'echo "deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2.list'
导入密钥时如果卡住,可手动下载:
bash复制curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key | sudo apt-key add -
常见问题排查表:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
GPG error: NO_PUBKEY |
密钥服务器连接超时 | 换用hkp://pgp.mit.edu:80 |
404 Not Found |
系统版本与源不匹配 | 检查lsb_release -cs输出 |
Hash Sum mismatch |
网络波动导致下载不全 | 清理缓存:sudo apt clean |
当看到colcon: command not found时,说明你遇到了ROS2与ROS1的最大区别之一。colcon取代了传统的catkin和ament,成为ROS2的官方构建工具。
安装colcon全家桶:
bash复制sudo apt install python3-colcon-common-extensions python3-rosdep2
安装后验证:
bash复制colcon --help | grep "ROS 2"
如果仍报错,检查Python路径:
bash复制which python3 # 需指向/usr/bin/python3
典型编译问题解决:
CMake警告:
code复制CMake Warning: Manually-specified variables were not used by the project: CATKIN_INSTALL_INTO_PREFIX_ROOT
这是正常现象,说明你在编译ROS1遗留包。如需消除警告,在colcon build时添加:
bash复制colcon build --cmake-args -DCATKIN_INSTALL_INTO_PREFIX_ROOT=OFF
依赖缺失:
先初始化rosdep:
bash复制sudo rosdep init
rosdep update
然后在工作空间根目录运行:
bash复制rosdep install --from-paths src --ignore-src -y
编译加速技巧:
bash复制colcon build --parallel-workers 4 # 根据CPU核心数调整
很多开发者需要同时使用ROS1和ROS2,以下是安全共存的配置方案:
修改~/.bashrc,不要直接source两个环境,而是添加智能切换:
bash复制function set_ros_version() {
if [ "$1" = "1" ]; then
source /opt/ros/melodic/setup.bash
echo "ROS melodic activated"
elif [ "$1" = "2" ]; then
source /opt/ros/dashing/setup.bash
echo "ROS2 dashing activated"
else
echo "Invalid ROS version"
fi
}
alias ros1='set_ros_version 1'
alias ros2='set_ros_version 2'
使用方式:
bash复制ros1 # 切换到ROS1
ros2 # 切换到ROS2
重要:每次切换终端都需要重新选择版本,避免环境变量污染
完成安装后,建议按以下顺序验证:
基础通信测试:
bash复制# 终端1
ros2 run demo_nodes_cpp talker
# 终端2
ros2 run demo_nodes_cpp listener
可视化工具检查:
bash复制ros2 run rviz2 rviz2
创建自定义包:
bash复制cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake my_pkg
编译与加载:
bash复制cd ~/ros2_ws
colcon build --packages-select my_pkg
source install/local_setup.bash
遇到Package 'my_pkg' not found时,检查:
colcon buildlocal_setup.bash而非setup.bash网络问题诊断:
bash复制# 检查DDS通信
ros2 topic list
# 查看节点发现状态
ros2 daemon status
性能优化配置:
bash复制# 使用FastRTPS替代默认DDS
sudo apt install ros-dashing-rmw-fastrtps-cpp
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
编码问题终极解决方案:
如果仍遇到编码错误,强制设置全部locale:
bash复制sudo apt install locales-all
sudo update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
在Dashing的实际使用中,我发现最易被忽视的是工作空间的层级关系。建议每个项目独立创建workspace,避免包之间的隐式依赖。当需要复用其他包时,通过--symlink-install参数创建符号链接:
bash复制colcon build --symlink-install