一、问题分析
在Ubuntu 22.04上使用树莓派4B扩展板时,虽然系统不同,但问题本质相似:
- 缺少硬件控制库(pigpio、rpi_ws281x、smbus2)
- 串口配置不同(Ubuntu的设备树配置方式与Raspberry Pi OS不同)
- I2C接口默认关闭
二、完整解决方案
1. 安装ROS2 Humble(如果尚未安装)
设置语言环境
bash
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仓库
bash
sudo apt install software-properties-common
sudo add-apt-repository universe
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
添加仓库到系统
bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
安装ROS2
bash
sudo apt update
sudo apt install ros-humble-desktop python3-rosdep python3-colcon-common-extensions
初始化rosdep
bash
sudo rosdep init
rosdep update
也可以使用鱼香ROS的一键安装指令:
bash
sudo wget http://fishros.com/install -O fishros && . fishros
详情见:Ubuntu的基础配置
2. 安装扩展板所需的Python库
2.1 安装pigpio库(Ubuntu版本)
安装依赖:
bash
sudo apt update
sudo apt install python3-pip python3-dev python3-setuptools
sudo apt install build-essential
从源码安装pigpio:
bash
cd ~
wget https://github.com/joan2937/pigpio/archive/master.zip
解压缩文件:
bash
unzip master.zip
编译:
bash
cd pigpio-master
make
安装:
bash
sudo make install
启动pigpio守护进程:
bash
sudo pigpiod
设置开机自启动:
bash
echo "sudo pigpiod" | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
2.2 安装rpi_ws281x库(LED控制)
安装依赖:
bash
sudo apt install python3-dev python3-pip
sudo apt install scons
从源码安装:
bash
cd ~
git clone https://github.com/jgarff/rpi_ws281x.git
cd rpi_ws281x
scons
安装Python绑定:
bash
cd python
sudo pip3 install rpi_ws281x
或者
bash
sudo python3 setup.py install
2.3 安装I2C支持库
启用I2C接口:
bash
sudo apt install i2c-tools
sudo usermod -a -G i2c $USER
安装smbus2(Python I2C库):
bash
sudo pip3 install smbus2
安装RPi.GPIO替代方案(Ubuntu兼容):
bash
sudo apt install python3-lgpio
sudo pip3 install RPi.GPIO
3. Ubuntu 22.04上的串口配置
bash
Ubuntu 22.04 for Raspberry Pi使用不同的设备树配置方式:
3.1 检查当前串口状态
查看串口设备:
bash
ls -l /dev/ttyAMA* /dev/ttyS* /dev/serial*
查看串口权限:
bash
groups $USER
3.2 配置串口(禁用蓝牙使用串口)
- 编辑设备树配置
bash
sudo nano /boot/firmware/config.txt
在文件末尾添加以下行:
bash
enable_uart=1
dtoverlay=pi3-miniuart-bt
或者完全禁用蓝牙,将串口分配给GPIO:
bash
dtoverlay=disable-bt
- 禁用串口控制台服务
bash
sudo systemctl disable serial-getty@ttyAMA0.service
sudo systemctl disable bluetooth.service
- 修改cmdline.txt(如果存在)
bash
sudo nano /boot/firmware/cmdline.txt
移除"console=serial0,115200"或"console=ttyAMA0,115200"。
3.3 添加用户到dialout组(获取串口权限)
bash
sudo usermod -a -G dialout $USER
sudo usermod -a -G tty $USER
sudo usermod -a -G gpio $USER
4. 验证硬件连接
重启系统:
bash
sudo reboot
重启后验证。
检查I2C设备:
bash
i2cdetect -y 1
检查GPIO:
bash
ls /sys/class/gpio/
检查pigpio是否运行:
bash
sudo systemctl status pigpiod
测试串口:
bash
sudo chmod 666 /dev/ttyAMA0
echo "test" > /dev/ttyAMA0
5. 创建ROS2包控制扩展板
5.1 创建ROS2工作空间和包
bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
创建扩展板控制包:
bash
ros2 pkg create --build-type ament_python raspberry_extension_board \
--dependencies rclpy std_msgs
5.2 示例:舵机控制节点
python
# ~/ros2_ws/src/raspberry_extension_board/raspberry_extension_board/servo_controller.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import Float32
import pigpio
class ServoController(Node):
def __init__(self):
super().__init__('servo_controller')
# 连接到pigpio守护进程
self.pi = pigpio.pi()
if not self.pi.connected:
self.get_logger().error('无法连接到pigpio守护进程')
return
# 设置舵机GPIO引脚
self.servo_pin = 18
# 创建订阅者
self.subscription = self.create_subscription(
Float32,
'servo_angle',
self.angle_callback,
10)
self.get_logger().info('舵机控制器已启动')
def angle_callback(self, msg):
# 将角度(0-180)转换为脉冲宽度(500-2500)
angle = msg.data
pulse_width = 500 + (angle / 180.0) * 2000
# 设置舵机位置
self.pi.set_servo_pulsewidth(self.servo_pin, int(pulse_width))
self.get_logger().info(f'设置舵机角度: {angle}°')
def destroy_node(self):
# 清理GPIO
self.pi.set_servo_pulsewidth(self.servo_pin, 0)
self.pi.stop()
super().destroy_node()
def main(args=None):
rclpy.init(args=args)
servo_controller = ServoController()
try:
rclpy.spin(servo_controller)
except KeyboardInterrupt:
pass
servo_controller.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
5.3 设置启动文件
python
# ~/ros2_ws/src/raspberry_extension_board/launch/extension_board.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess
def generate_launch_description():
return LaunchDescription([
# 启动pigpio守护进程(如果尚未运行)
ExecuteProcess(
cmd=['sudo', 'pigpiod'],
shell=True
),
# 启动舵机控制器节点
Node(
package='raspberry_extension_board',
executable='servo_controller',
name='servo_controller',
output='screen'
),
# 启动RGB灯控制节点(示例)
Node(
package='raspberry_extension_board',
executable='rgb_controller',
name='rgb_controller',
output='screen'
)
])
6. 常见问题解决
问题1:权限不足
解决方案:设置udev规则
bash
sudo nano /etc/udev/rules.d/99-gpio.rules
添加以下内容:
bash
SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660"
SUBSYSTEM=="tty", GROUP="dialout", MODE="0666"
SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660"
重新加载udev规则
bash
sudo udevadm control --reload-rules
sudo udevadm trigger
问题2:pigpio守护进程启动失败
检查是否已有进程在运行
bash
sudo killall pigpiod
sudo pigpiod
或者使用systemd管理
bash
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
问题3:串口无法访问
检查串口设备:
bash
ls -la /dev/ttyAMA*
如果没有权限,添加用户到相应组:
bash
sudo usermod -a -G dialout $USER
newgrp dialout # 立即生效,不需要重启
测试串口:
bash
sudo stty -F /dev/ttyAMA0 115200
echo "test" | sudo tee /dev/ttyAMA0
7. 测试扩展板功能
python
# 创建测试脚本
cat > ~/test_extension.py << EOF
#!/usr/bin/env python3
import time
import pigpio
from rpi_ws281x import PixelStrip, Color
# 初始化pigpio
pi = pigpio.pi()
# 测试舵机
servo_pin = 18
print("测试舵机...")
for angle in range(0, 180, 30):
pulse = 500 + (angle / 180.0) * 2000
pi.set_servo_pulsewidth(servo_pin, int(pulse))
time.sleep(0.5)
# 测试RGB灯
LED_COUNT = 16
LED_PIN = 12
strip = PixelStrip(LED_COUNT, LED_PIN)
strip.begin()
print("测试RGB灯...")
for i in range(strip.numPixels()):
strip.setPixelColor(i, Color(255, 0, 0))
strip.show()
time.sleep(1)
print("扩展板测试完成")
EOF
运行测试:
bash
sudo python3 ~/test_extension.py
8. 与ROS2集成的最佳实践
- 使用ROS2参数服务器配置GPIO引脚
- 创建硬件抽象层(HAL)包
- 实现硬件诊断节点
- 使用ROS2生命周期节点管理硬件资源
三、总结
在Ubuntu 22.04上使用树莓派4B扩展板的关键步骤:
- 安装ROS2 Humble - 使用官方Ubuntu镜像
- 安装硬件库 - pigpio、rpi_ws281x、smbus2
- 配置串口 - Ubuntu使用不同的设备树配置方式
- 设置权限 - 添加用户到dialout、gpio、i2c组
- 创建ROS2节点 - 将硬件控制集成到ROS2生态
与Raspberry Pi OS的主要区别:
- 配置文件位置不同 :Ubuntu使用
/boot/firmware/config.txt - 服务管理不同:使用systemd而非init.d
- 权限管理更严格:需要明确配置用户组权限
按照以上步骤,你可以在Ubuntu 22.04的树莓派4B上成功运行ROS2并控制扩展板的所有功能。