解决: Ubuntu 22.04上树莓派4B扩展板ROS2兼容性修复指南

一、问题分析

在Ubuntu 22.04上使用树莓派4B扩展板时,虽然系统不同,但问题本质相似:

  1. 缺少硬件控制库(pigpio、rpi_ws281x、smbus2)
  2. 串口配置不同(Ubuntu的设备树配置方式与Raspberry Pi OS不同)
  3. 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 配置串口(禁用蓝牙使用串口)
  1. 编辑设备树配置
bash 复制代码
sudo nano /boot/firmware/config.txt

在文件末尾添加以下行:

bash 复制代码
enable_uart=1
dtoverlay=pi3-miniuart-bt

或者完全禁用蓝牙,将串口分配给GPIO:

bash 复制代码
dtoverlay=disable-bt
  1. 禁用串口控制台服务
bash 复制代码
sudo systemctl disable serial-getty@ttyAMA0.service
sudo systemctl disable bluetooth.service
  1. 修改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集成的最佳实践

  1. 使用ROS2参数服务器配置GPIO引脚
  2. 创建硬件抽象层(HAL)包
  3. 实现硬件诊断节点
  4. 使用ROS2生命周期节点管理硬件资源

三、总结

在Ubuntu 22.04上使用树莓派4B扩展板的关键步骤:

  1. 安装ROS2 Humble - 使用官方Ubuntu镜像
  2. 安装硬件库 - pigpio、rpi_ws281x、smbus2
  3. 配置串口 - Ubuntu使用不同的设备树配置方式
  4. 设置权限 - 添加用户到dialout、gpio、i2c组
  5. 创建ROS2节点 - 将硬件控制集成到ROS2生态

与Raspberry Pi OS的主要区别:

  • 配置文件位置不同 :Ubuntu使用/boot/firmware/config.txt
  • 服务管理不同:使用systemd而非init.d
  • 权限管理更严格:需要明确配置用户组权限

按照以上步骤,你可以在Ubuntu 22.04的树莓派4B上成功运行ROS2并控制扩展板的所有功能。

相关推荐
zizle_lin1 小时前
CentOS配置yum源
linux·运维·centos
武器大师722 小时前
从零开始在 Linux 上编译运行 lvgljs 图形界面项目
linux·运维·服务器
剑神一笑2 小时前
Linux free 命令深度解析:从内存监控到 OOM 排查的完整指南
linux·运维·服务器
似水এ᭄往昔2 小时前
【Linux网络编程】--计算机网络基础
linux·网络·计算机网络
leaves falling3 小时前
深入理解Linux进程控制:从fork到exec,手写一个迷你Shell
linux·运维·服务器
思麟呀3 小时前
C++工业级日志项目(七)日志器核心
linux·开发语言·c++·windows
满天星83035773 小时前
【Git】原理及使用(二) (版本回退)
linux·git
Strugglingler3 小时前
【Linux Device Drivers-第九章 与硬件通讯 I/O端口,I/O内存】
linux·i/o端口·i/o内存
.YYY3 小时前
万字详解|Linux Chrony 时间服务完整学习手册
linux·运维