2. ROS2开发环境搭建:Ubuntu系统安装、ROS2 Humble安装、工作空间创建与编译测试
好,咱们正式开始动手。这一章,我会带你从零搭建一套能跑ROS2 Humble的开发环境。别小看这一步,我见过太多人后面编译报错、节点跑不起来,追根溯源都是环境没搞利索。咱们稳扎稳打,把地基打牢。
2.1 Ubuntu 22.04 LTS 系统安装
ROS2 Humble 官方推荐的是 Ubuntu 22.04 LTS。说白了,版本要对上,不然依赖库版本冲突会让你头疼。
2.1.1 系统镜像与启动盘
- 镜像下载:去 Ubuntu 官网下载
ubuntu-22.04.3-desktop-amd64.iso。我个人习惯用 LTS 版本,稳定,社区支持好。 - 制作启动盘:用 Rufus(Windows)或
dd命令(Linux/macOS)把镜像写入 U 盘。注意,制作过程会格式化 U 盘,数据提前备份好。
2.1.2 安装要点与避坑
安装过程其实很傻瓜式,但有几点我建议你留意:
- 分区建议:如果你是双系统,给 Ubuntu 至少留 80GB 空间。我建议分三个区:
/(根目录)50GB、/home(用户数据)剩余空间、swap(交换分区)8GB。这样重装系统时,你的代码和配置都在/home里,不会丢。 - 软件更新:安装时勾选「为图形和 Wi-Fi 安装第三方软件」。嗯,这里要注意,NVIDIA 显卡驱动建议装完系统后再手动安装,避免黑屏。
- 避坑指南:我曾经在一台老笔记本上装 Ubuntu 22.04,结果无线网卡不识别。后来发现是内核版本问题,手动装了驱动才解决。所以,装完系统第一件事,先确认网络和显卡驱动正常。
sudo apt update && sudo apt upgrade -y,把系统包更新到最新。这一步能避免很多因系统库过旧导致的编译问题。
2.2 ROS2 Humble 安装
ROS2 的安装方式有两种:Debian 包(推荐)和源码编译。咱们用 Debian 包,省时省力。
2.2.1 设置软件源
先让系统能识别 ROS2 的仓库。打开终端,逐条执行:
# 设置 locale
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
# 添加 ROS2 源
sudo apt install software-properties-common
sudo add-apt-repository universe
# 添加 ROS2 GPG 密钥
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
# 将仓库添加到 sources.list
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
2.2.2 安装 ROS2 Humble
更新索引后,直接安装桌面版(包含 GUI 工具):
sudo apt update
sudo apt upgrade
sudo apt install ros-humble-desktop
这个过程大概 10-20 分钟,取决于你的网速。安装完成后,记得配置环境变量:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
.bashrc 换成 .zshrc。我刚开始用 zsh 时就忘了这茬,每次打开终端都要手动 source,很烦。
2.2.3 验证安装
运行一个简单的测试,看看 ROS2 能不能正常工作:
# 终端1:启动一个发布者
ros2 run demo_nodes_cpp talker
# 终端2:启动一个订阅者
ros2 run demo_nodes_py listener
如果两个终端都能正常输出,说明安装成功。你想想看,一个节点发 "Hello World",另一个节点收到并打印,这就是最基础的通信模型。
2.3 工作空间创建与编译测试
工作空间(Workspace)是 ROS2 项目的根目录。所有代码、包、配置文件都放在这里。我习惯用 colcon 来编译,它是 ROS2 的官方构建工具。
2.3.1 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
第一次编译会生成 build、install、log 三个目录。其中 install 里是编译好的可执行文件和库文件。
2.3.2 配置环境变量
每次打开新终端,都要 source 工作空间的 setup 文件:
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
为什么要这么做?因为 ROS2 通过环境变量来查找包。不 source,你的节点就找不到自己写的代码。
2.3.3 创建第一个 ROS2 包
咱们创建一个简单的 C++ 发布者节点,测试整个流程:
cd ~/ros2_ws/src
ros2 pkg create my_first_pkg --build-type ament_cmake --dependencies rclcpp std_msgs
这个命令会生成一个包模板。在 src/my_first_pkg/src 下新建一个 publisher.cpp:
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
int main(int argc, char *argv[]) {
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("minimal_publisher");
auto publisher = node->create_publisher<std_msgs::msg::String>("topic", 10);
auto message = std_msgs::msg::String();
message.data = "Hello from my_first_pkg!";
rclcpp::WallRate loop_rate(1);
while (rclcpp::ok()) {
RCLCPP_INFO(node->get_logger(), "Publishing: '%s'", message.data.c_str());
publisher->publish(message);
rclcpp::spin_some(node);
loop_rate.sleep();
}
rclcpp::shutdown();
return 0;
}
别忘了修改 CMakeLists.txt,添加可执行文件:
add_executable(publisher src/publisher.cpp)
ament_target_dependencies(publisher rclcpp std_msgs)
install(TARGETS publisher DESTINATION lib/${PROJECT_NAME})
2.3.4 编译与运行
cd ~/ros2_ws
colcon build --packages-select my_first_pkg
source install/setup.bash
ros2 run my_first_pkg publisher
如果终端每秒打印一条 "Publishing: 'Hello from my_first_pkg!'",恭喜你,环境搭建完成!
这张图很直观:底层是 Ubuntu 系统,往上依次是 ROS2 核心、工作空间、自定义包。每一层都依赖下一层正确配置。我在项目中遇到过有人跳过系统更新直接装 ROS2,结果编译时缺库,折腾了一下午。所以,别偷懒,按顺序来。
src 目录下放一个 .gitignore 文件,把 build、install、log 排除掉。这样代码仓库只存源码,清爽很多。
好了,环境搭好了,代码也能跑了。下一章咱们会深入 ROS2 的通信机制,看看节点之间到底是怎么「聊天」的。嗯,到时候你会觉得,ROS2 的设计其实挺优雅的。