Ubuntu 下 ROS 使用 serial 包进行无线串口通信

2023-05-16

1、查看本机当前USB、串口设备

  • 查看当前已连接的 USB 设备:lsusb;
  • 查看电脑连接的USB 转串口的信息:dmesg | grep ttyUSB*;
  • 查看电脑连接的串口的信息:dmesg | grep ttyS*;
  • 查看串口名称使用:一般USB转串口设备/dev/ttyUSB*,如果是普通的串口设备会是/dev/ttyS*
    ls -l /dev/tty*;
    ls -l /dev/ttyS*;
    ls -l /dev/ttyUSB*;

2、安装 Linux 下的串口调试助手

2.1 CuteCom

// 安装
sudo apt-get install cutecom
// 运行
sudo cutecom

在这里插入图片描述
CuteCom 使用可参考:Linux下uart通讯——cutetom的使用

2.2 CommMaster

CommMaster 是一款跨平台调试工具,支持 deepin, windows xp, macos。Gitee 仓库地址:https://gitee.com/itas109/CommMaster/
在这里插入图片描述

3、使用 ROS 提供的 serial包实现串口通信

serial作为ROS与下位机通讯的功能包,可以很方便的供我们与我们的下位机通信。

3.1 安装 ros-melodic-serial 包

// 安装
sudo apt install ros-melodic-serial

进入下载的软件包的位置 roscd serial,若是安装成功会看到:
在这里插入图片描述

3.2 创建工作空间和功能包

// 创建工作空间
$ mkdir -p ~/serial_port_ws/src
$ cd ~/serial_port_ws/src/
$ catkin_init_workspace

// 编译工作空间
$ cd ~/serial_port_ws/
$ catkin_make

// 设置环境变量
$ source devel/setup.bash

// 检查环境变量
$ echo $ROS_PACKAGE_PATH

// 创建功能包
$ cd ~/serial_port_ws/src/
$ catkin_create_pkg serial_communicate std_msgs rospy roscpp serial

// 编译功能包
$ cd ~/serial_port_ws/
$ catkin_make
$ source ~/serial_port_ws/devel/setup.bash

笔者在创建功能包时直接包含了serial,所以CMakelists.txt和package.xml文件无需再次添加编译规则:$ catkin_create_pkg serial_communicate std_msgs rospy roscpp serial

3.3 编写串口发送和接收节点

创建名为 key_input_send.cpp 节点文件:

#include<ros/ros.h>
#include<serial/serial.h>
#include<std_msgs/String.h>

#include<iostream>
#include<string>
#include<sstream>

using namespace std;


/**************************************************************************
函数功能:将数据经由串口发送出去
入口参数:[serial::Serial &ser]:              串口类名称;
        [std::string &serial_msg]:      发送的数据数组;
返  回  值:无
说        明:无
**************************************************************************/
int serial_write(serial::Serial &ser, std::string &serial_msg)
{
    ser.write(serial_msg);
    return 0;
}

/**************************************************************************
函数功能:将数据经由串口读取进来
入口参数:[serial::Serial &ser]:              串口类名称;
        [std::string &serial_msg]:      接收的数据数组;
返  回  值:无
说        明:无
**************************************************************************/
int serial_read(serial::Serial &ser, std::string &result)
{
    result = ser.read( ser.available() );
    return 0;
}


int main(int argc, char** argv)
{
    ros::init(argc, argv,"my_serial_port");
    ros::NodeHandle n;

    //创建一个serial类
   serial::Serial ser;

    //初始化串口相关设置
   ser.setPort("/dev/ttyUSB0");         //设置打开的串口名称
   ser.setBaudrate(9600);                //设置串口的波特率
   serial::Timeout to = serial::Timeout::simpleTimeout(1000);           //创建timeout
   ser.setTimeout(to);                           //设置串口的timeout

    //打开串口
    try
    {
        ser.open();         //打开串口
    }
    catch(const std::exception& e)
    {
        ROS_ERROR_STREAM("Unable to open port ");           //打开串口失败,打印信息
        return -1;
    }

    //判断串口是否成功打开
    if( ser.isOpen() )
    { 
        ROS_INFO_STREAM("Serial Port initialized. \n");         //成功打开串口,打印信息
    }
    else
    {
        return -1;
    }


    ros::Rate loop_rate(50);
	
	//data 为发送数据
    //result 为接收数据
  	std::string data, result;
    int func(0);
    
    cout << "Please input function number:" << endl;

    while( ros::ok() )
    {
      	//从键盘中读取键入数据
      	cout << "Your function number is: ";
        cin >> func;
        
  /*****************************************************************************
 * 以下逻辑可以按照你自己的写,主要工作是根据键盘键入的数据,为 data 赋值
 *****************************************************************************/
     	 switch (func)
        {
            case 0:     data = "A 800 456\r\n";         break;
            case 1:     data = "B 1200 456\r\n";        break;
            case 2:     data = "C 1600 456\r\n";        break;
            case 3:     data = "D 1800 456\r\n";        break;
            default:    ROS_ERROR_STREAM("No this function number!!!");     break;
        }

        //串口写数据
        serial_write(ser, data);
        cout << " the data write to serial is :  " << data.c_str();
        //串口读数据
        serial_read(ser, result);
        cout << " the data read from serial is : " << result.c_str();
        cout << endl;
    }

	ser.close();
    return 0;
}

配置 CMakeLists.txt 文件:

# 生成可执行文件
add_executable(key_input_send src/key_input_send.cpp)
# 链接库
target_link_libraries(key_input_send  ${catkin_LIBRARIES})

以上代码参考自CSDN博客:ROS使用serial包进行串口通信

3.4 测试节点

使用刘老师自研的两个 USB 转串口无线收发模块,进行无线串口收发通信测试。其中 ttyUSB0 采用上述节点控制,ttyUSB1 采用 CommMaster 串口调试助手测试。
在这里插入图片描述

// 开启一个终端
$ roscore
// 再开启一个终端
$ rosrun serial_communicate key_input_send

在这里插入图片描述

打开 CommMaster,连接串口 /dev/ttyUSB1
在这里插入图片描述
在终端中依次输入 0 1 2 3,观察到 CommMaster 中接收区显示:
在这里插入图片描述
可见,ttyUSB0ttyUSB1 发送数据正常。

CommMaster 发送区发送一次 HuangXiaoBaiDeJinJieZhiLu,然后在终端随意输入0 1 2 3 中的任意一个数字,显示如下:
在这里插入图片描述
可见,ttyUSB1ttyUSB0 发送数据正常,且 ttyUSB0读取数据正常。测试完毕。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu 下 ROS 使用 serial 包进行无线串口通信 的相关文章

随机推荐

  • 旅行商问题--蚁群优化算法求解(matlab实现)

    今天给大家分享一下matlab实现蚁群优化算法 xff0c 解决旅行商问题 在上一篇博客中对蚁群优化算法做了较为详细的介绍 xff0c 有需要的小伙伴可以看一下 https blog csdn net HuangChen666 articl
  • 粒子群优化算法及MATLAB实现

    上一篇博客是关于蚁群优化算法的 xff0c 有兴趣的可以看下 https blog csdn net HuangChen666 article details 115913181 1 粒子群优化算法概述 2 粒子群优化算法求解 2 1 连续
  • A星(A*、A Star)路径规划算法详解(附MATLAB代码)

    首先看看运行效果 xff0c 分别有三种模式 xff0c 代码运行前需要通过鼠标点击设置起点和终点 第一种模式直接输出最短路径 第二种模式输出最短路径的生成过程 第三种模式输出最短路径的生成过程和详细探索的过程 代码获取 gitee链接 x
  • Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

    Ubuntu20 04 43 MAVROS 43 PX4 43 Gazebo 安装PX4步骤安装MAVROS安装QGCPX4仿真 安装PX4步骤 从github上clone源码 span class token function git s
  • PX4+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https docs px4 io main zh ros mavros offboard cpp html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 键盘控制飞行代码 可以先借鉴本篇博客 xf
  • 基于ESP32的小型四轴无人机

    粗糙版试飞成功 xff01 陀螺仪部分直接飞线飞了一个模块 xff0c 懒得焊了 不是很水平 xff0c 稳定性不是很好 因为滤波算法中加入的元素太少了 xff0c 目前也就MPU6050的输出数据加入了计算 xff0c 所以很多自稳定性飞
  • PX4无人机 - 键盘控制飞行代码

    PX4无人机 键盘控制飞行代码 仿真效果 实机效果 由于图片限制5M以内 xff0c 只能上传一小段了 xff0c 整段视频请点击链接 Pixhawk 6c 无人机 键盘控制无人机 Offboard模式 核心 xff1a 发布 mavros
  • 【FreeRTOS学习 - 消息队列学习】

    跟着韦东山老师FreeRTOS教学资料的学习记录 FreeRTOS全部项目代码链接 xff08 更新中 xff09 https gitee com chenshao777 free rtos study 本文章一共分为一下几个部分 1 创建
  • 【Linux多线程编程-自学记录】08.Linux多线程互斥量

    Linux多线程编程学习代码 xff08 代码已上传gitee xff0c 还请各位兄弟点个Star哦 xff01 xff09 https gitee com chenshao777 linux thread git 笔记 xff1a 1
  • 【Linux多线程编程-自学记录】09.Linux多线程之读写锁

    Linux多线程编程学习代码 xff08 代码已上传gitee xff0c 还请各位兄弟点个Star哦 xff01 xff09 https gitee com chenshao777 linux thread git 笔记 xff1a 1
  • 【Linux多线程编程-自学记录】10.条件变量

    Linux多线程编程学习代码 xff08 代码已上传gitee xff0c 还请各位兄弟点个Star哦 xff01 xff09 https gitee com chenshao777 linux thread git 笔记 xff1a 1
  • 树莓派4B安装Ros 2 Foxy踩坑记录

    1 通过树莓派官方提供的写卡工具raspberry pi imager选择Ubuntu 20 04 5 xff08 64 bit xff09 xff0c 因为我打算用一个8G的存储卡安装ros 2 xff0c Ubuntu 22 04的比较
  • 港科大vins-fusion初探

    SLAM新手 xff0c 欢迎讨论 关于vins fusion的博客 xff1a 1 初探 xff1a https blog csdn net huanghaihui 123 article details 86518880 2 vio主体
  • vins-fusion代码解读[一] vio主体

    SLAM新手 xff0c 欢迎讨论 港科大vins fusion代码解读 一 vins fusion与vins mono代码结构有很大相似性 这次先看看vins estimator节点内的内容 1 程序入口 xff1a 1 vins est
  • vins-fusion代码解读[二] 惯性视觉里程结果与GPS松耦合

    感谢 slam萌新 xff0c 本篇博客部分参考 xff1a https blog csdn net weixin 41843971 article details 86748719 欢迎讨论 惯性视觉里程结果与GPS松耦合 xff1a g
  • vins-fusion代码解读[四] 图像回环检测loop_fusion主体

    SLAM新手 xff0c 欢迎讨论 这篇主要讲loop fusion包的程序结构 xff0c loop fusion主要作用 xff1a 利用词袋模型进行图像的回环检测 在vinsmono中 xff0c 该程序包处于pose graph包内
  • 基于乐鑫开源ESP32四轴无人机项目分享

    上次说重新焊接一块的 xff0c 周末搞定了 xff0c 基本组装的也完成了 xff0c 上个图 试飞还是可以的 xff0c 因为没有光流和定高模块 xff0c 所以稳定性不是很好 xff0c 不过乐鑫预留了扩展模块的接口 xff0c 大家
  • vins-回环检测单独剥离运行

    由于前端如果单纯依靠视觉 43 imu作为里程计 效果经常不稳定 因此最近做项目的过程中 xff0c 将前端转化为以里程计 xff08 码盘编码器 xff09 来进行 xff0c 相对比较鲁棒 由于这个局部传感器有累计误差 xff0c 因此
  • apt 的 update 和 upgrade 命令的区别是什么?

    如果想让你的 Ubuntu 或者 Debian 系统保持更新 xff0c 要用 sudo apt update 和 sudo apt upgrade 命令组合 一些以前的教程也会提到 sudo apt get update 和 sudo a
  • Ubuntu 下 ROS 使用 serial 包进行无线串口通信

    1 查看本机当前USB 串口设备 查看当前已连接的 USB 设备 xff1a lsusb 查看电脑连接的USB 转串口的信息 xff1a dmesg grep ttyUSB 查看电脑连接的串口的信息 xff1a dmesg grep tty