第2章:开发环境搭建——Ubuntu+ROS Noetic安装、工作空间创建、依赖包安装、串口与CAN工具链配置

好,咱们正式开始动手了。

做硬件驱动开发,环境搭建是第一道坎。我见过太多人卡在这一步——不是装错版本,就是依赖冲突,折腾一整天还没跑起来。说实话,这挺打击信心的。

这一章,我会带你一步步把环境搭好。你跟着我来,别跳步,基本不会出问题。

2.1 为什么选Ubuntu 20.04 + ROS Noetic?

先回答一个常见问题:为什么非得用这个组合?

ROS Noetic 是最后一个完全支持 Python 2 的版本,但它也原生支持 Python 3。这意味着什么?意味着你既能用老项目的代码,又能写新风格的 Python 3 驱动。我自己的项目里,很多底层串口和 CAN 的封装都是用 Python 3 写的,跑在 Noetic 上非常稳。

另外,Ubuntu 20.04 是 LTS 版本,支持到 2025 年。你想想看,一个稳定的系统对嵌入式开发有多重要。我曾经在 Ubuntu 18.04 上踩过一个坑——某个 CAN 库的依赖在 18.04 上死活装不上,换到 20.04 一次过。

核心建议:如果你手头有 Ubuntu 20.04 的机器,直接用。如果没有,装个虚拟机也行。我个人习惯用 VMware,分配 4 核 CPU、8GB 内存,跑 Noetic 完全够用。

2.2 安装ROS Noetic

安装过程其实不复杂,但有几个细节要注意。

2.2.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.2.2 添加密钥

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

嗯,这里要注意。有时候网络不好,密钥下载会失败。我遇到过两次,解决办法是换个时间再试,或者用代理。

2.2.3 安装ROS Noetic

sudo apt update
sudo apt install ros-noetic-desktop-full

这个包大概 1.5GB 左右,下载时间取决于你的网速。我建议你泡杯咖啡,或者去干点别的。

2.2.4 初始化 rosdep

sudo rosdep init
rosdep update

这一步很多人会卡住。如果 rosdep update 报错,多半是网络问题。你可以试试:

sudo apt install python3-rosdep
sudo rosdep init --rosdistro noetic
rosdep update

小技巧:如果 rosdep 一直失败,可以手动下载 rosdep.yaml 文件放到 /etc/ros/rosdep/sources.list.d/ 目录下。具体方法网上有,我就不展开了。

2.2.5 设置环境变量

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证一下:

roscore

如果看到 ROS 的启动信息,恭喜你,安装成功了。

2.3 创建工作空间

工作空间是 ROS 项目的根目录。我习惯把它放在 ~/ros_ws 下。

mkdir -p ~/ros_ws/src
cd ~/ros_ws
catkin_make

编译完成后,你会看到 builddevel 两个目录。别忘了 source 一下:

source devel/setup.bash

为了以后方便,我建议你把这句话也加到 ~/.bashrc 里:

echo "source ~/ros_ws/devel/setup.bash" >> ~/.bashrc

注意:如果你同时有多个工作空间,source 的顺序很重要。后 source 的会覆盖前面的。我一般只保留一个工作空间在 .bashrc 里,其他的手动 source。

2.4 安装依赖包

做硬件驱动开发,有几个包是绕不开的。我列个清单:

包名 用途 安装命令
serial 串口通信 sudo apt install ros-noetic-serial
socketcan_interface CAN总线接口 sudo apt install ros-noetic-socketcan-interface
joy 手柄/摇杆输入 sudo apt install ros-noetic-joy
tf2 坐标变换 sudo apt install ros-noetic-tf2
robot_state_publisher 机器人状态发布 sudo apt install ros-noetic-robot-state-publisher

你可以一次性装完:

sudo apt install ros-noetic-serial ros-noetic-socketcan-interface ros-noetic-joy ros-noetic-tf2 ros-noetic-robot-state-publisher

另外,Python 的依赖也别忘:

sudo apt install python3-serial python3-can

个人经验:我早期做项目时,经常漏装 python3-serial,结果 Python 脚本里 import serial 就报错。后来我养成了一个习惯——装完 ROS 包后,立刻把 Python 的依赖也装上,省得后面再折腾。

2.5 串口工具链配置

串口是硬件驱动最常用的接口。我一般用 minicomscreen 来调试。

2.5.1 安装 minicom

sudo apt install minicom

配置串口参数:

sudo minicom -s

在菜单里设置波特率、数据位、停止位等。我常用的配置是 115200 波特率、8 数据位、1 停止位、无校验。

2.5.2 使用 screen

如果你喜欢轻量级工具,screen 是个好选择:

sudo apt install screen
screen /dev/ttyUSB0 115200

退出 screen 按 Ctrl+A 然后 K

2.5.3 权限问题

这是个大坑。默认情况下,普通用户没有权限访问串口设备。我遇到过好几次,明明插上了 USB 转串口,但程序就是打不开。

解决办法:

sudo usermod -a -G dialout $USER

然后注销重新登录。之后你就能直接 open("/dev/ttyUSB0") 了。

注意:如果你用的是 USB 转串口,设备名可能是 ttyUSB0ttyACM0。可以用 ls /dev/tty* 查看。插拔一下设备,看看哪个是新出现的。

2.6 CAN工具链配置

CAN 总线在机器人里用得越来越多,尤其是移动底盘和机械臂。ROS 对 CAN 的支持主要靠 socketcan_interface

2.6.1 安装 CAN 工具

sudo apt install can-utils

这个包提供了 candumpcansendcangen 等命令行工具,调试非常方便。

2.6.2 配置 CAN 接口

假设你用的是 USB 转 CAN 设备(比如 PCAN-USB 或 SLCAN),先加载驱动:

sudo modprobe can
sudo modprobe can_raw
sudo modprobe slcan

然后配置接口:

sudo ip link set can0 up type can bitrate 500000
sudo ifconfig can0 up

验证一下:

candump can0

如果看到数据,说明 CAN 通了。

2.6.3 自动配置脚本

每次重启都要手动配置,太麻烦了。我写了个脚本,放在 /etc/init.d/ 下:

#!/bin/bash
# CAN 接口自动配置脚本
sudo modprobe can
sudo modprobe can_raw
sudo modprobe slcan
sudo ip link set can0 up type can bitrate 500000
sudo ifconfig can0 up

保存为 can_setup.sh,然后:

sudo chmod +x can_setup.sh
sudo update-rc.d can_setup.sh defaults

小技巧:如果你用的是虚拟 CAN(vcan),可以用 sudo modprobe vcan 然后 sudo ip link add dev vcan0 type vcan。这样即使没有硬件,也能在软件层面调试 CAN 通信。

2.7 验证环境

最后,我们来验证一下整个环境是否正常。

2.7.1 测试串口

python3 -c "import serial; print('Serial OK')"

2.7.2 测试 CAN

python3 -c "import can; print('CAN OK')"

2.7.3 测试 ROS

roscore &
rostopic list

如果都没报错,恭喜你,环境搭建完成了。

总结一下:这一章我们装了 ROS Noetic、建了工作空间、装了依赖包、配了串口和 CAN 工具链。这些东西看着琐碎,但都是后面写驱动的基础。我当年第一次搭环境时花了整整两天,你现在跟着我走,应该两小时就能搞定。

下一章,我们会开始写第一个硬件驱动——一个简单的串口传感器驱动。到时候你会看到,今天配的这些工具全都会用上。

好,先到这儿。有什么问题,欢迎在评论区留言。