3、ROS开发环境搭建:Ubuntu系统安装、ROS Noetic安装、工作空间创建与编译

说实话,每次带新人入门ROS,我都要花不少时间在环境搭建上。很多人觉得这步简单,不就是装个系统、装个ROS嘛。但我在项目里见过太多因为环境问题折腾好几天的情况了。嗯,咱们今天就把这事彻底讲清楚。

3.1 Ubuntu系统安装——选对版本很重要

ROS Noetic对应的Ubuntu版本是20.04 LTS。这一点我特别强调一下,千万别装错了。我见过有人装了Ubuntu 22.04然后死活装不上Noetic,最后才发现版本不匹配。

版本对应关系:
  • ROS Noetic → Ubuntu 20.04 LTS(Focal Fossa)
  • ROS Melodic → Ubuntu 18.04 LTS
  • ROS Kinetic → Ubuntu 16.04 LTS

如果你用其他版本,可能会遇到依赖冲突,到时候哭都来不及。

安装Ubuntu 20.04,我个人习惯用桌面版。为啥?因为调试可视化工具方便。你想想看,后面要跑rviz、gazebo这些,没图形界面怎么行?

具体步骤我就不啰嗦了,网上教程一大把。但有几个坑我得提醒你:

  • 分区时给根目录留够空间——我建议至少50GB,ROS装完一堆包,空间很快就没了
  • 交换分区别太小——8GB起步,编译大型项目时内存不够就靠它了
  • 安装时选中文还是英文?——我个人建议英文,因为终端里中文路径有时候会出幺蛾子
我的小技巧:装完系统第一件事,换国内源。阿里云、清华、中科大任选一个,不然apt update能等到你怀疑人生。

3.2 ROS Noetic安装——一条命令搞定?没那么简单

官方文档说安装ROS很简单,几条命令就完事。但我在实际项目中踩过不少坑,今天一次性告诉你。

先上标准流程:

# 1. 设置sources.list
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

# 2. 设置密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

# 3. 更新
sudo apt update

# 4. 安装完整版(推荐)
sudo apt install ros-noetic-desktop-full

# 5. 初始化rosdep
sudo rosdep init
rosdep update

# 6. 设置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

# 7. 安装构建工具
sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

嗯,看起来挺顺的,对吧?但实际执行时,sudo rosdep init这一步经常卡住。为啥?因为rosdep要访问raw.githubusercontent.com,这个域名在国内经常被墙。

我曾经遇到过:rosdep init一直报网络错误,折腾了两个小时。后来发现是DNS解析问题。解决办法很简单——要么挂代理,要么手动修改hosts文件。

如果你也遇到这个问题,试试这个:

# 手动添加hosts
sudo echo "185.199.108.133 raw.githubusercontent.com" >> /etc/hosts

或者更直接一点,跳过rosdep init,手动创建配置文件。我个人习惯用第二种方法,省心。

3.3 工作空间创建与编译——你的第一个ROS项目

环境装好了,接下来就是创建工作空间。说白了,工作空间就是你存放ROS项目的文件夹。ROS用catkin来管理编译,跟CMake有点像,但更智能一些。

标准流程如下:

# 1. 创建工作空间目录
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws

# 2. 初始化工作空间
catkin_make

# 3. 设置环境变量
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

执行完catkin_make后,你会看到多了几个文件夹:builddevelsrc。其中devel里放着编译好的可执行文件和库文件。

注意:每次打开新终端,都要记得source一下工作空间的setup.bash。不然ROS找不到你写的包。我刚开始学的时候经常忘了这步,然后一脸懵逼地问"为啥我的节点找不到?"

验证一下工作空间是否创建成功:

echo $ROS_PACKAGE_PATH

如果输出里包含/home/你的用户名/catkin_ws/src,那就说明搞定了。

3.4 避坑指南——我踩过的那些雷

做ROS开发这几年,环境搭建这块我踩过的坑,比吃过的盐还多。挑几个典型的说说:

问题 原因 解决办法
catkin_make报错找不到Python 系统默认Python版本不对 检查python --version,Noetic必须用Python3
rosrun找不到包 没有source工作空间 执行source ~/catkin_ws/devel/setup.bash
编译时提示缺少依赖 rosdep没有更新 执行rosdep install --from-paths src --ignore-src -r -y
roscore启动失败 ROS_MASTER_URI配置错误 检查echo $ROS_MASTER_URI,默认是http://localhost:11311

我曾经犯过的错:有一次我在服务器上装ROS,没有图形界面,结果装完才发现ros-noetic-desktop-full依赖一堆图形库,根本装不上。后来换成ros-noetic-ros-base才搞定。所以如果你是在服务器上开发,记得装基础版就行。

3.5 验证环境——跑个Hello World

环境搭好了,总得试试能不能用吧。来,写个最简单的发布订阅程序验证一下。

先创建一个功能包:

cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

然后在test_pkg/src里写个简单的talker节点:

#!/usr/bin/env python3
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10)  # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

别忘了给脚本加执行权限:

chmod +x ~/catkin_ws/src/test_pkg/src/talker.py

然后启动roscore,再运行节点:

roscore &
rosrun test_pkg talker.py

如果终端里不断输出"hello world + 时间戳",那就恭喜你——ROS环境搭建成功了!

总结一下:环境搭建这事,说难不难,说简单也不简单。关键是版本要对、源要换、依赖要全。我建议你装完后跑一遍这个Hello World,确认没问题再往下学。不然后面出了问题,你都不知道是代码的锅还是环境的锅。

好了,环境搭好了,下一章咱们正式开始写ROS节点。到时候我会教你如何用C++和Python写真正的机器人控制程序。嗯,期待一下吧。