设计方案
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库
下载
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发送与接收