本文主要解决如何ROS采用串口通讯发送相关数据,本达到相互发送和接收对方数据的目的,从而为我们自己以ros操作系统开发硬件提供相应的便利。
一、相关原理及准备工作
完成ROS的串口通信,需要准备的硬件有TTL转USB模块(2个),Linux硬件设备,Linux硬件设备下搭载的ROS环境是ros-melodic,接线如图所示
二、ROS节点文件编写
1.下载依赖
下载对应版本的串口库
sudo apt-get install ros-melodic-serial
2.创建工作空间并初始化
mkdir -p listener_ws/src
cd listener_ws
catkin_make
3.创建功能包并添加依赖
cd src
catkin_create_pkg xx(包名) roscpp rospy std_msgs serial
创建ros包时需要加入serial包 否则编译查询不到。
进入到新创建的包的src内,生成一个cpp文件,代码如下
#include <ros/ros.h>
#include <nav_msgs/Odometry.h>
#include <serial/serial.h>
int main(int argc, char** argv)
{
// 初始化ROS节点
ros::init(argc, argv, "serial_sender");
// 创建ROS节点句柄
ros::NodeHandle nh;
// 创建串口对象
serial::Serial serial_port;
// 打开串口
try
{
serial_port.setPort("/dev/ttyUSB0"); // 设置串口设备路径
serial_port.setBaudrate(115200); // 设置波特率
serial::Timeout timeout = serial::Timeout::simpleTimeout(1000); // 设置超时时间
serial_port.setTimeout(timeout);
serial_port.open(); // 打开串口
}
catch (serial::IOException& e)
{
ROS_ERROR_STREAM("无法打开串口: " << e.what());
return 1;
}
// 创建订阅器,订阅位置消息,消息类型为nav_msgs::Odometry
ros::Subscriber sub = nh.subscribe<nav_msgs::Odometry>("Odometry", 10, [&](const nav_msgs::Odometry::ConstPtr& msg) {
// 构造要发送的数据
std::string data = "位置坐标:x=" + std::to_string(msg->pose.pose.position.x) + ", y=" +
std::to_string(msg->pose.pose.position.y) + ", z=" +
std::to_string(msg->pose.pose.position.z);
// 发送数据到串口
serial_port.write(data);
// 打印发送的数据
ROS_INFO_STREAM("已发送数据: " << data);
});
// 循环等待回调函数
ros::spin();
// 关闭串口
serial_port.close();
return 0;
}
ps:我订阅的是slam算法里面的Odometry的位姿数据,因此需要注意的是在头文件中要修改你的数据类型的相关的库
4.修改编译文件
进入到功能包内的CMakeLists.txt
仅需要添加
add_executable(exe_a src/a.cpp) //exe_a是生成的可执行文件名字,在ws/devel/lib里
add_executable(exe_b src/b.cpp)
target_link_libraries(exe_a ${catkin_LIBRARIES})
target_link_libraries(exe_b ${catkin_LIBRARIES})
随后编译就可以完成
提供一些使用的ros指令
rosmsg list ##所有消息列表
rosmsg show ##显示消息描述
rosmsg package ##显示某个功能包下的所有消息
rosmsg packages ##列出包含消息的功能包
rosmsg info ##显示消息信息
ls -l /dev/ttyUSB0 ##查看串口是否在使用
5.运行
sudo chmod 777 /dev/ttyUSB0
rosrun sender serial_sender###(节点名字,rosinit内的)
参考文章
学习笔记:ROS使用经验(创建功能包)_ros创建功能包-CSDN博客
ROS机器人制作(三)—— ROS上位机与stm32进行串口通信_ros与stm32通信-CSDN博客https://www.cnblogs.com/Tan-code/p/17978525
[ROS串口通信]报错:IO Exception (13): Permission denied, file /tmp/binarydeb/ros-noetic-serial-1.2.1/src/impl/unix.cc, line 151. [ERROR] [1705845384.528602780]: Unable to open port - Tanگگ - 博客园 (cnblogs.com)