ROS串口通讯

        本文主要解决如何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、STM32】ROS与STM32通信-CSDN博客

学习笔记: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)


ROS环境下的串口通讯_ros2 串口通信-CSDN博客

ROS入门-ROS的安装及编写简单的节点talker和listener-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值