解决: 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并控制扩展板的所有功能。

相关推荐
A小辣椒18 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言