2. 环境搭建:Ubuntu + ROS Noetic 安装与工作空间配置
做机器人开发,第一步就是搭环境。说实话,这一步劝退了很多人。
我记得刚入行那会儿,光装ROS就折腾了两天,各种依赖冲突、源不对、版本不匹配。后来带团队时发现,新人几乎都会在这上面卡一下。所以这一章,我带你把环境一次搞定。
2.1 为什么选 Ubuntu 20.04 + ROS Noetic?
ROS Noetic 是 ROS1 的最后一个长期支持版本。它只支持 Ubuntu 20.04。你想想看,如果你装了 Ubuntu 22.04,那 ROS Noetic 就装不上。反过来,如果你非要装 ROS2,那又是另一套体系了。
我个人习惯是:做 ROS1 开发,就用 Ubuntu 20.04 + Noetic。这个组合最稳,社区支持也最全。我在项目中遇到过好几次因为系统版本不对导致包装不上的情况,后来干脆统一用这个组合,省心很多。
- 操作系统:Ubuntu 20.04 LTS(64位)
- ROS 版本:Noetic Ninjemys
- Python 版本:Python 3.8(Noetic 默认)
2.2 安装 Ubuntu 20.04
如果你已经有 Ubuntu 20.04 系统,直接跳到下一节。如果没有,我建议用双系统或者虚拟机。
嗯,这里要注意:千万别用 WSL。WSL 虽然方便,但 ROS 的图形化工具(比如 rviz、gazebo)跑不起来。我见过有人折腾 WSL 三天,最后还是老老实实装了双系统。
2.2.1 下载与制作启动盘
- 去 Ubuntu 官网下载 20.04 LTS 桌面版镜像
- 用 Rufus(Windows)或 balenaEtcher(macOS)制作启动 U 盘
- 重启电脑,从 U 盘启动
2.2.2 安装过程中的关键设置
- 分区建议:/ 分区至少 50GB,swap 分区设为内存大小
- 用户名:不要用中文,避免终端路径乱码
- 软件更新:安装时勾选「为图形和 Wi-Fi 安装第三方软件」
sudo apt update && sudo apt upgrade -y,把系统更新到最新。这一步能避免很多依赖问题。
2.3 安装 ROS Noetic
ROS 的安装流程其实很固定。说白了就是三步:加源、装包、初始化。但每一步都有坑,我一个个说。
2.3.1 添加软件源
打开终端,执行以下命令:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
2.3.2 添加密钥
sudo apt install curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
hkp://keyserver.ubuntu.com:80 替代默认方式。或者换个时间段再试。
2.3.3 安装 ROS Noetic 完整版
sudo apt update
sudo apt install ros-noetic-desktop-full -y
这个包包含了 rviz、gazebo、导航栈等常用工具。如果你硬盘空间紧张,可以只装 ros-noetic-desktop,但我建议一步到位。
2.3.4 初始化 rosdep
sudo rosdep init
rosdep update
rosdep 是用来解决依赖的。你想想看,如果你写了一个包,里面用到了某个第三方库,rosdep 会自动帮你装好。没有它,你后面编译时会遇到一堆「找不到头文件」的错误。
2.3.5 设置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
这一步很关键。如果不加,每次打开终端都要手动 source 一次。我习惯在 .bashrc 里也加上 source ~/catkin_ws/devel/setup.bash,这样工作空间也能自动加载。
2.3.6 验证安装
roscore
如果看到类似 started core service [/rosout] 的输出,说明安装成功。按 Ctrl+C 退出。
2.4 创建工作空间
工作空间是 ROS 项目的根目录。所有代码、配置文件都放在里面。我习惯叫它 catkin_ws,你也可以叫别的名字。
2.4.1 创建并初始化
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
第一次运行 catkin_make 会生成 build 和 devel 两个文件夹。build 是编译中间文件,devel 是编译产物。你平时写代码主要在 src 目录下。
2.4.2 工作空间的结构
一个标准的 ROS 工作空间长这样:
catkin_ws/
├── src/ # 源代码目录
│ ├── package1/
│ ├── package2/
│ └── CMakeLists.txt # 顶层 CMake 文件
├── build/ # 编译中间文件
└── devel/ # 编译产物(可执行文件、库等)
└── setup.bash
catkin_ws 目录下执行 catkin_make,然后 source devel/setup.bash,新包才能被识别。
2.5 测试你的环境
我们来写一个最简单的 ROS 节点,验证整个环境是否正常。
2.5.1 创建功能包
cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp
cd ~/catkin_ws
catkin_make
source devel/setup.bash
2.5.2 编写发布者节点
在 test_pkg/src 目录下创建 talker.cpp:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
2.5.3 修改 CMakeLists.txt
在 test_pkg 的 CMakeLists.txt 中找到以下部分,取消注释并修改:
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
2.5.4 编译并运行
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore &
rosrun test_pkg talker
如果看到 [ INFO] hello world 0 不断输出,说明环境完全正常。
2.6 本章知识体系
下面这张图帮你理清整个环境搭建的逻辑:
2.7 避坑指南
最后,我总结几个我这些年遇到过的坑:
- Python 版本冲突:Noetic 默认用 Python 3。如果你装了 Anaconda,可能会把默认 Python 改成别的版本。我建议在
.bashrc里显式指定alias python=python3。 - 权限问题:不要在
sudo下运行catkin_make。如果遇到权限错误,检查src目录的所有者:sudo chown -R 你的用户名 ~/catkin_ws。 - 多版本 ROS 共存:如果你同时装了 ROS1 和 ROS2,环境变量会打架。我习惯用别名切换:
alias ros1='source /opt/ros/noetic/setup.bash'。
好了,环境搭建就到这里。记住:环境搭好了,后面的事就顺了。如果遇到问题,多看看终端输出的错误信息,大部分问题都能自己解决。