Ubuntu 22.04 ROS2 Humble 串口通信全流程避坑实战第一次在Ubuntu 22.04上配置ROS2 Humble与CH340串口通信时我遇到了驱动签名失败、权限不足、动态库缺失等一系列问题。经过多次尝试和排查终于整理出这份覆盖完整流程的解决方案。本文将重点解决实际开发中最容易卡住的几个关键环节帮助开发者快速搭建稳定的串口通信环境。1. 环境准备与驱动安装1.1 系统基础配置在开始之前建议先更新系统软件包sudo apt update sudo apt upgrade -yUbuntu 22.04默认启用了安全启动(Secure Boot)这会导致第三方驱动无法直接加载。对于CH340这类常见USB转串口芯片我们需要特别注意驱动签名问题。1.2 CH340驱动安装与签名CH340驱动安装过程中最常见的错误是Key was rejected by service。这是因为新版本Ubuntu对内核模块有更严格的安全要求。以下是具体解决方案首先安装编译依赖sudo apt install build-essential linux-headers-$(uname -r) -y下载官方驱动源码git clone https://github.com/juliagoda/CH341SER.git cd CH341SER make处理签名问题sudo mkdir -p /usr/local/lib/modules/$(uname -r)/kernel/drivers/usb/serial sudo cp ch34x.ko /usr/local/lib/modules/$(uname -r)/kernel/drivers/usb/serial sudo depmod -a如果仍然遇到签名错误可以尝试临时禁用Secure Boot或在BIOS中将其关闭。1.3 验证驱动加载安装完成后插入CH340设备检查驱动是否加载成功dmesg | grep ch34x ls /dev/ttyUSB*正常情况应该能看到类似输出[ 1234.567890] usbserial: USB Serial support registered for ch34x [ 1234.567891] ch34x 1-1.2:1.0: ch34x converter detected /dev/ttyUSB02. ROS2串口通信环境配置2.1 安装ROS2 Humble基础环境确保已正确安装ROS2 Humble桌面版sudo apt install ros-humble-desktop source /opt/ros/humble/setup.bash2.2 安装串口通信相关包ROS2的串口通信主要依赖serial-driver包sudo apt install ros-humble-serial-driver同时安装调试工具sudo apt install cutecom2.3 解决动态库缺失问题运行程序时可能会遇到error while loading shared libraries: libserial.so错误。这是因为系统找不到serial库文件。解决方法如下临时方案当前终端有效export LD_LIBRARY_PATH/usr/local/lib:$LD_LIBRARY_PATH永久方案echo /usr/local/lib | sudo tee -a /etc/ld.so.conf sudo ldconfig验证是否生效ldconfig -p | grep libserial3. 串口权限与常见冲突解决3.1 串口设备权限管理默认情况下普通用户无法直接访问串口设备。不建议使用chmod 777这种不安全的方式而是应该将用户加入dialout组sudo usermod -aG dialout $USER然后重新登录使更改生效。验证权限ls -l /dev/ttyUSB0正确输出应包含dialout组crw-rw---- 1 root dialout 188, 0 Jun 1 10:00 /dev/ttyUSB03.2 解决brltty服务冲突Ubuntu 22.04默认安装的brltty服务会占用串口设备导致无法访问。解决方法检查服务状态systemctl status brltty-udev.service禁用服务sudo systemctl mask brltty-udev.service sudo systemctl stop brltty-udev.service移除自动安装sudo apt remove brltty4. ROS2串口通信实战4.1 创建工作空间与包mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ros2 pkg create --build-type ament_cmake serial_demo4.2 编写串口发布节点创建serial_publisher.cpp文件#include rclcpp/rclcpp.hpp #include std_msgs/msg/string.hpp #include serial/serial.h class SerialPublisher : public rclcpp::Node { public: SerialPublisher() : Node(serial_publisher) { publisher_ this-create_publisherstd_msgs::msg::String(serial_data, 10); timer_ this-create_wall_timer( std::chrono::milliseconds(500), std::bind(SerialPublisher::timer_callback, this)); serial_.setPort(/dev/ttyUSB0); serial_.setBaudrate(9600); serial::Timeout timeout serial::Timeout::simpleTimeout(1000); serial_.setTimeout(timeout); try { serial_.open(); } catch (serial::IOException e) { RCLCPP_ERROR(this-get_logger(), 无法打开串口); } } private: void timer_callback() { auto message std_msgs::msg::String(); if(serial_.isOpen()) { size_t bytes serial_.available(); if(bytes 0) { std::string result serial_.read(bytes); message.data result; publisher_-publish(message); RCLCPP_INFO(this-get_logger(), 收到数据: %s, message.data.c_str()); } } } rclcpp::TimerBase::SharedPtr timer_; rclcpp::Publisherstd_msgs::msg::String::SharedPtr publisher_; serial::Serial serial_; }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::spin(std::make_sharedSerialPublisher()); rclcpp::shutdown(); return 0; }4.3 修改CMakeLists.txt在CMakeLists.txt中添加find_package(serial REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) add_executable(serial_publisher src/serial_publisher.cpp) target_link_libraries(serial_publisher ${rclcpp_LIBRARIES} ${std_msgs_LIBRARIES} serial::serial ) install(TARGETS serial_publisher DESTINATION lib/${PROJECT_NAME} )4.4 编译与运行cd ~/ros2_ws colcon build --packages-select serial_demo source install/setup.bash ros2 run serial_demo serial_publisher5. 高级调试技巧5.1 串口调试工具使用推荐使用cutecom进行基础调试sudo cutecom在界面中选择正确的串口设备(/dev/ttyUSB0)设置波特率等参数后可以手动发送和接收数据。5.2 查看系统日志当遇到问题时系统日志往往能提供有用信息journalctl -f5.3 检查USB设备详情lsusb -v | grep -A 3 CH340输出示例Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics CH340 serial converter Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.105.4 自定义udev规则可选为避免每次插拔USB设备后节点名称变化(/dev/ttyUSB*编号变化)可以创建udev规则创建规则文件sudo nano /etc/udev/rules.d/99-ch340.rules添加内容SUBSYSTEMtty, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, SYMLINKttyROS_CH340重新加载规则sudo udevadm control --reload-rules sudo udevadm trigger之后设备将固定出现在/dev/ttyROS_CH340在代码中可以直接使用这个固定名称。