ROS-UART-嵌入式设备之间数据读写

2023-05-16

ROS-UART-单片机之间数据读写

ROS通过串口与嵌入式设备进行通信,总的来说有两种方式:
**第一种:**在嵌入式设备加载ROS库,让嵌入式设备成为一个节点,并发布话题,在ROS订阅该话题即可获得嵌入式设备的数据,同时嵌入式设备订阅ROS上的话题即可接收消息;
**第二种:**ROS应用层写一个与串口通讯的ROS节点,该节点负责从串口读取嵌入式系统传输给ROS应用层的数据,同时也负责将控制指令通过串口发送给嵌入系统系统,最终驱动实际的执行器去动作。
第二种采用第二种方式:
项目代码如下:

#include "serial_node.h"
#include <iostream>
#include <string>
using namespace std;


int openSerialport(serial::Serial ros_ser,unsigned char* port,int baudrat)
{
    try {
        ros_ser.setPort(port.c_str());
        ros_ser.setBaudrat(baudrat);
        ros_ser::Timeout to=serial::Timeout::simpleTimeout(1000);
        ros_ser.setTimeout(to);
        ros_ser.open();
    }
    catch(serial::IOException& ioe)
    {
        ROS_INFO_STREAM("Unable to open serial port ");
        return 0;
    }
    if(ros_ser.isOpen())
        ROS_INFO_STREAM("serial port is opened");
    else
        return 0;
    return 1;
};

void recImudata(serial::Serial ros_ser,ros::NodeHandle& nh)
{
    ros::Rate loop_rate(200);
    ros::Publisher read_pub=nh.advertise<serial_node::my_msg>("read imu", 1000);
    while(ros::ok())
    {
        size_t n=ros_ser.available();
        if(n>35) {
            ros_ser.read(totalbuffer, n);
            unsigned char buf[30];
            int state = 0;
            int findpos = 0;
            for (int i = 0; i < buffer_size && i < n; i++) {
                if (state == 0 && totalbuffer[i] == 0xAA)
                    state = 1;
                else if (state == 1 && totalbuffer[i + 1] == 0xBB)
                    state = 2;
                else if (state == 2 && totalbuffer[i + 16] == 0xCC)
                    state = 3;
                else if (state == 3 && totalbuffer[i + 16] == 0xDD) {
                    findpos = i;
                    state = 4;
                    break;
                } else
                    state = 0;
            }
            if (state == 4) {
                for (int i = 0; i < 15; i++) {
                    buffer[i] = totalbuffer[findpos + i + 2];
                    buffer[i + 15] = totalbuffer[findpos + i + 18];
                }
                for (int k = 0; k < 6; k++) {
                    for (int j = 0; i < 4; j++)
                        _ga[k].data8[j] = buffer[k * 5 + j + 1];
                    _ros_msg.gyro_x = _ga[0].data;
                    _ros_msg.gyro_y = _ga[1].data;
                    _ros_msg.gyro_z = _ga[2].data;
                    _ros_msg.acc_x = _ga[3].data;
                    _ros_msg.acc_y = _ga[4].data;
                    _ros_msg.acc_z = _ga[5].data;
                    if (buffer[0] == 0xFE)
                        _ros_msg.gyro_x = -_ros_msg.gyro_x;
                    if (buffer[5] == 0xFE)
                        _ros_msg.gyro_y = -_ros_msg.gyro_y;
                    if (buffer[10] == 0xFE)
                        _ros_msg.gyro_z = -_ros_msg.gyro_z;
                    if (buffer[15] == 0xFE)
                        _ros_msg.acc_x = -_ros_msg.acc_x;
                    if (buffer[20] == 0xFE)
                        _ros_msg.acc_y = -_ros_msg.acc_y;
                    if (buffer[25] == 0xFE)
                        _ros_msg.acc_z = -_ros_msg.acc_z;
                }
                state = 0;
            }
        }
        read_pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
    }
};

void sendCallback(serial_node::my_msg msg,serial::Serial ser)
{
    IMU_data t[6];
    t[0].data=msg.gyro_x;
    t[1].data=msg.gyro_y;
    t[2].data=msg.gyro_z;
    t[3].data=msg.acc_x;
    t[4].data=msg.acc_y;
    t[5].data=msg.acc_z;
    _stm32_msg[0]=0xAA;
    _stm32_msg[1]=0xBB;
    for(int i=0;i<3;i++)
    {
        if (t[i].data < 0)
            _stm32_msg[2 + i * 5] = 0xFE;
        else
            _stm32_msg[2 + i * 5] = 0xFF;
        for (int j = 1; j < 5; j++)
            _stm32_msg[2 + i * 5 + j] = t[i].data8[j - 1];
    }
    _stm32_msg[2+3*5]=0xCC;
    for(int i=3;i<6;i++)
    {
        if (t[i].data < 0)
            _stm32_msg[2 + i * 5+1] = 0xFE;
        else
            _stm32_msg[2 + i * 5+1] = 0xFF;
        for (int j = 1; j < 5; j++)
            _stm32_msg[2 + i * 5 + j+1] = t[i].data8[j - 1];
    }
    _stm32_msg[2+5*6+4+2]=0xDD;

    ros_ser.write(_stm32_msg,34);
};

void sendImudata(ros::NodeHandle& nh)
{
    ros::Subscriber write_pub=nh.subscribe("write",34,sendCallback);
};
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "serial/serial.h"
#include "serial_node/my_msg.h"
using namespace std;
#define buffer_size 1000;
unsigned char totalbuffer[buffer_size];

typedef union
{
    float data;
    unsigned char data8[4];
} IMU_data;

IMU_data _ga[6];
serial_node::my_msg _ros_msg;  //接收到的数据
unsigned char _stm32_msg[34];  //发送给嵌入式设备的数据

int openSerialport(serial::Serial ros_ser,unsigned char* port,int baudrat);
void recImudata(serial::Serial ros_ser,ros::NodeHandle& nh);
void sendCallback(serial_node::my_msg msg,serial::Serial ros_ser);
void sendImudata(ros::NodeHandle& nh);

参考有价值博客:
1、ROS系统的串口数据读取和解析https://blog.csdn.net/afeik/article/details/91997758
2、ROS与STM32的串口通信https://blog.csdn.net/weifengdq/article/details/84374690
3、Ubuntu16.04 + ROS下串口通讯https://www.cnblogs.com/qilai/p/11313308.html
4、ROS与嵌入式设备的通讯:串口https://zhuanlan.zhihu.com/p/52337690
5、ROS学习篇(三)ROS系统的串口数据读取和解析(组合导航系统)https://blog.csdn.net/Tansir94/article/details/81357612
6、ROS与stm32通信https://blog.csdn.net/qq_19324147/article/details/105669169
7、ROS与STM32通信https://blog.csdn.net/qq_42688495/article/details/107730630
8、Ubuntu16.04环境下STM32和ROS间的串口通信https://zhuanlan.zhihu.com/p/166496656

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

ROS-UART-嵌入式设备之间数据读写 的相关文章

  • CAPL编写TestCase常用函数及使用方法介绍

    哈喽 xff0c 好久好久好久不见 xff0c 已经记不清是断更的多少天了 xff01 从今天开始为大家带来一些有关自动化测试脚本编写相关知识分享 xff0c 主要是基于VECTOR的相关工具链进行脚本开发 xff1b 废话不多说 xff0
  • 玩平衡小车系列—TB6612FNG与直流电机控制教程

    xff08 基于平衡车之家做的标准版小车 xff09 1 直流电机原理 下面是分析直流电机的物理模型图 其中 xff0c 固定部分有磁铁 xff0c 这里称作主磁极 xff1b 固定部分还有电刷 转动部分有环形铁心和绕在环形铁心上的绕组 其
  • http请求带Authorization

    Authorization 用户凭证 基本概念 授权authorization是指 xff0c 根据用户提供的身份凭证 xff0c 生成权限实体 xff0c 并为之授予相应的权限 方法 在接口自动化测试中 我们会遇到Authorizatio
  • Vue-Waterfall-Easy插件详细使用教程

    前言 自己在做信息管理系统后台所遇到的一些问题 xff0c 困扰了我好几天 xff0c 于是将这个用法记录下来 xff0c 希望能够大家在学习vue的道路上一路长虹 我想要展示一些照片 xff0c 展示大学课余生活以及一起参加活动的一些片段
  • 机器人操作系统ROS(9)Gazebo物理仿真(摄像头仿真)

    前期 需要完成机器人操作系统ROS xff08 8 xff09 arbotix控制器控制小车运动 物理仿真实验 机器人底盘仿真 我是自己创建了一个工作空间model gazebo xff0c 创建方法 xff1a 参考 xff1b 如果按照
  • 机器人操作系统ROS(18) 在ROS中使用OpenCV进行简单的图像处理---代码实现篇

    本文转自 ROS学习笔记 xff08 2 xff09 xff1a 在ROS中使用OpenCV进行简单的图像处理 代码实现篇 Vector0805的博客 xff0c 如有侵权 xff0c 请联系删除 实例 xff1a 从ROS中读取图象 xf
  • ROS-Academy-for-Beginners之ORB-SLAM2 双目视觉初探

    现在我们跑通了ROS Academy for Beginners 按照 https www guyuehome com 33866 的方法修改对应的文件 xff0c 重新编译 终端1 xff1a span class token built
  • Ubuntu16.04 (ROS)下通过CAN分析仪(USBCAN/CANalyst-II)调试无人车助力转向电机(1)

    调试流程 1 测试USBCAN CANalyst II工作是否正常 2 使用PC端的上位机测试转向电机是否正常及指令测试 3 测试USBCAN CANalyst II提供的Linux x64的例程 4 移植Linux x64的例程到ROS功
  • 神秘的程序员

    神秘的程序员漫画集
  • PX4从放弃到精通(十八):参数

    无人机硬件 提供全程指导 文章目录 无人机硬件 提供全程指导 https item taobao com item htm spm a1z10 1 c w137644 23632941727 26 118775c2oUPAnL amp id
  • PX4从放弃到精通(十一):混控及PWM输出

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • Mbot ros编译环境安装

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • Ubuntu系统迁移

    文章目录 前言一 备份系统二 制作系统盘三 安装系统 前言 本博客记录如何将一个电脑 板卡 xff08 或虚拟机 xff09 的ubuntu系统原封不动的迁移到另一个电脑 板卡 xff08 或虚拟机 xff09 上 Ubuntu20 04系
  • ubuntu20.04搭建QGC4.2编译环境

    文章目录 前言 一 安装qt 二 编译QGC 安装依赖 安装GStreamer 三 编译安卓版QGC 安装jdk11 配置Qt creator 配置手机 配置遥控器 常见报错 前言 Ubuntu20 04 QGC 4 2 ubuntu18
  • PX4实战之旅(三):通过OFFBOARD模式控制无人机自主飞行

    文章目录 前言 一 添加自定义模块 二 测试 前言 固件 PX4 1 13 1 一 添加自定义模块 在PX4 Autopilot src modules目录下新建control node文件夹 在control node文件夹下新建下面四个
  • QGC二次开发基础

    文章目录 前言 一 添加文件到QGC工程 二 添加界面 三 QML和C 交互 四 信号与槽 五 测试 前言 QGC 4 2 4 一 添加文件到QGC工程 在qgroundcontrol src目录下创建SimpleTest文件夹 在文件夹中
  • windos10安装QGC4.2编译环境

    文章目录 前言一 安装VS二 安装QT三 编译四 常见报错及解决办法 前言 参考链接 https dev qgroundcontrol com master en getting started 一 安装VS 下载地址 xff1a http
  • PX4入门指南

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • PX4基本配置

    目录 下载固件 下载原生稳定版固件 安装PX4 Master Beta或自定义固件 FMUv2 Bootloader 更新 机架设置 飞行控制器 传感器方向 计算朝向 设置朝向 罗盘校准 执行校准 陀螺仪校准 执行校准 加速度计 执行校准
  • VNCVIEW以LXDE环境连接Ubuntu12.04

    问题 xff1a 之前装了好几个桌面环境 xff0c 连接时只默认使用第一个桌面环境 xff0c 表示很郁闷 之前总以为命令是lxde开头的 xff0c 刚才又搜索了一下 xff0c 发现是startlxde 编辑 vnc xstartup

随机推荐