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起步,编译大型项目时内存不够就靠它了
- 安装时选中文还是英文?——我个人建议英文,因为终端里中文路径有时候会出幺蛾子
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后,你会看到多了几个文件夹:build、devel、src。其中devel里放着编译好的可执行文件和库文件。
验证一下工作空间是否创建成功:
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写真正的机器人控制程序。嗯,期待一下吧。