通过编写ROS2 UART节点进行PC和RDK X3模块间的通信

设计方案

1. 硬件设置

首先确保硬件设置正确。串口设备需要正确连接到RDK X3,并且串口设置(如波特率、数据位等)与代码中的设置相匹配。

使用RDK X3 MD 模块,USB转TLL模块连接X3的6,7引脚,端口号(/dev/ttyS2),这里使用的是虚拟机Ubuntu 22.04。

X3模块的配置参考官方资料:地平线RDK套件 | RDK X3用户手册 (horizon.cc)

 2. 单元测试

对于单元测试,可以参考X3官方资料进行自测确保串口是没有问题的

  • 串口读写测试: 使用一个简单的串口通信程序(可以使用Python的pyserial库或C++的serial库编写)来测试硬件设备是否能够发送和接收数据。
  • 节点功能测试: 单独测试发布者和订阅者节点的功能。测试发布者节点是否能正确读取数据并发布ROS2消息。对于订阅者,使用一个测试节点来发布消息,验证订阅者是否能正确接收和处理这些消息。参考小鱼的资料学习如何编写一个节点:【ROS2机器人入门到实战】_ros2机器人编程实战 pdf-CSDN博客

准备工作

安装Ubuntu串口调试工具cutecom

sudo apt-get install cutecom
sudo cutecom

安装Serial库

serial: Serial Library

下载

git clone git://github.com/wjwwood/serial.git

安装

cd serial
mkdir build

cd build
camke .. & make -j

PC端向X3发送消息

创建功能包

mkdir -p d3l_ws/src
cd d3l_ws/src
//创建一个名为uart_node的功能包
ros2 pkg create uart_node --build-type ament_cmake --dependencies rclcpp
cd uart_node/src
touch uart_node.cpp
//在vscode编写代码
cd ..
code .

uart_node.cpp代码

#include <chrono>
#include <iostream>
#include <memory>
#include <string>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include "serial/serial.h"

class UartNode : public rclcpp::Node {
public:
  UartNode() : Node("uart_node") {
    // 设置串口参数
    serial_port_ = std::make_shared<serial::Serial>("/dev/ttyUSB0", 921600);
    if (!serial_port_->isOpen()) {
      RCLCPP_ERROR(this->get_logger(), "Failed to open serial port");
      return;
    }

    // 创建定时器,每隔5秒发送一条消息
    timer_ = this->create_wall_timer(
        std::chrono::seconds(5), std::bind(&UartNode::sendSerialMessage, this));

    // 订阅接收到的消息,并在终端打印
    sub_ = this->create_subscription<std_msgs::msg::String>(
        "uart_message", 10, [&](const std_msgs::msg::String::SharedPtr msg) {
          RCLCPP_INFO(this->get_logger(), "Received message: %s", msg->data.c_str());
        });
  }

private:
  void sendSerialMessage() {
    // 构造要发送的消息
    std::string message = "Hello, RDK X3!";
    // 发送消息到串口
    serial_port_->write(message);

    RCLCPP_INFO(this->get_logger(), "Sent message: %s", message.c_str());
  }

  std::shared_ptr<serial::Serial> serial_port_;
  rclcpp::TimerBase::SharedPtr timer_;
  rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_;
};

int main(int argc, char** argv) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<UartNode>());
  rclcpp::shutdown();
  return 0;
}

CMakeLists文件添加依赖项

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(serial REQUIRED)

endif()
add_executable(uart_node src/uart_node.cpp)

ament_target_dependencies(uart_node rclcpp std_msgs serial)
install(TARGETS
  uart_node
  DESTINATION lib/${PROJECT_NAME}
)
ament_package()

package.xml添加项

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>
  <depend>serial</depend>

确保PC已经通过USB连接到了X3的UART,运行节点出现[ros2run]: Aborted,是串口的权限问题

输入解决

sudo chmod 777 /dev/ttyUSB0

回到d3l_ws工作空间目录编译运行节点

colcon build --packages-select uart_node
source install/setup.bash
ros2 run uart_node uart_node 

开始运行

X3向PC发送消息也和上面相同

我们使用Ubuntu的串口调试窗口来看收到的信息,结果如下

PC发送与接收

X3发送与接收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值