ROS系统基础知识梳理(四) 串口通信

2023-05-16

ROS系统基础知识梳理(四) 串口通信

学习ROS系统,初步接触到ROS系统外接传感器,传感器通过Uart通信向台式机发送数据,内容涉及到ROS调用串口数据、串口数据校验、以及欧拉角转换四元数。
任务系统:Ubuntu18.04LTS
ROS Melodic
传感器:WT61c(加速度传感器、6轴陀螺仪)

类声明

针对要处理的数据定义类

#ifndef WT61CUART_H
#define WT61CUART_H
#include <vector>
#include <math.h>
#include <time.h>
#include "ros/ros.h"
#include "serial/serial.h"
#include "std_msgs/String.h"
#include "std_msgs/Empty.h"
#include "sensor_msgs/Imu.h"
#include "geometry_msgs/Twist.h"
#include "tf/LinearMath/Quaternion.h"
#define PI 3.14159
namespace WTU {
	class Wt61cUart {                       //整个类基于serial封装,整理出了ROS常用接口
	private:                                //包括波特率/uart端口号/ROS系统内的话题名称等
		int baudrate_,index_;              //index_初始化置零,用作变长数组索引
		std::string com_;
		serial::Serial ser;                //serial类,实现对串口控制的核心操作
		double g_;
		std::vector<uint8_t> UartData_;
		std::string topic_pub_;
		ros::Publisher wt61c_pub_;
		ros::Publisher wt61c_turtle_;
	public:
		Wt61cUart(ros::NodeHandle&);       
		~Wt61cUart();
		int TranslateAndPub();
		int UartInit();                   //串口初始化,按照launch文件上传的参数初始化串口
		int GetAndCheck();         //校验函数
	};
}
#endif

ROS调用串口

ROS系统有专门用于调用串口进行通信的数据包:serial。
serial::Serial Class Reference:docs.ros.org/jade/api/serial/html/classserial_1_1Serial.html
利用serial命名空间下的Serial类可实现ros对于串口的调用。

//串口初始化程序
int WTU::Wt61cUart::UartInit() {
	try{
		ser.setPort(com_);           //按照launch文件设置的端口号和波特率初始化串口
		ser.setBaudrate(baudrate_);
		serial::Timeout to = serial::Timeout::simpleTimeout(1000);  //设置截止时间
		ser.setTimeout(to);
		ser.open();                         
	}
	catch(serial::IOException& e){
		ROS_ERROR_STREAM("Unable to open port. Please try again.");
		return -1;
	}
	if(ser.isOpen()) {
		//ser.flushInput();
		ROS_INFO_STREAM("The port initialize succeed.");
		ser.flushInput();      //清空输入缓存,把多余的无用数据删除
		sleep(0.1);            //延时0.1秒,确保有数据进入
		return 0;
	}
	else
		return -1;
}

数据读取与校验

ROS的串口读取用serial类中的read()函数来实现,相对于程序执行速度来讲读取速度略慢,所以按字节读取易产生bug,利用available()返回值做参数,可一次性读取串口buffer里面的全部数据,程序执行理论上会快一些.
以available()做为参数,将buffer内容全部读取到内存中来,然后按位判断包头位置,所余数据不足一包时再次读取buffer中的数据,然后进行校验.

int WTU::Wt61cUart::GetAndCheck() {
	int i,j;      //校验计数位
	int sum = 0x55;      //数据和,初始化为0x55.wt61c发送数据包包头为0x55
	while(UartData_.size()-index_<33){    //当数据校验成功并且解析发送之后,index_再次置零并且删除已处理的数据.
		while(ser.available()<33){ROS_INFO("wait");}   //保证读取大于33byte数据,即一个完整的数据包
		ser.read(UartData_,ser.available());
	}
	while(true){
		if(UartData_[index_] ==0x55 && UartData_[index_+1] ==0x51){
			//检测到index_指向的数据为0x55,并且第二个数据为0x51,此时,大概率检测到数据包头
			for (i= 1; i<10; i++)
				sum+= UartData_[index_+i];         //和校验
			if(UartData_[index_+10] == sum%0x100)
				j = 1;
			sum = 0x55;
			for (i= 12; i<21; i++)
				sum+= UartData_[index_+i];
			if(UartData_[index_+21] == sum%0x100)
				j++;
			sum = 0x55;
			for (i= 23; i<32; i++)
				sum+= UartData_[index_+i];
			if(UartData_[index_+32] == sum%0x100)
				j++;
			if (j = 3){           //校验位通过
				ROS_INFO("Yes,I got a complete package.");
				return 0;
			}
			else{               //校验位未通过,则表明index_ 指向的并非包头,index_自增,进行下一次循环检测
				sum = 0x55;
				index_++;
			}
		}
		else
			index_++;
		while(UartData_.size()-index_-32<33){   //若剩余数据不足33,即一个包的大小,则补入数据
			while(ser.available()<33){}
			ser.read(UartData_,ser.available());
		}
	}	
}

欧拉角转四元数

欧拉角转化四元数,ROS中的TF包中函数可以实现
头文件:#include "tf/LinearMath/Quaternion.h"
函数:tf::Quaternion::setRPY()
欧拉角转换四元数GitHub:wt61c_uart

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

ROS系统基础知识梳理(四) 串口通信 的相关文章

  • ROS中显示inf问题(激光雷达laserscan rviz)

    需要改动两处代码 xff1a robot sim demo urdf sick tim urdf xacro 文件 xff1a 将带有 xff02 gpu xff02 的那一行注释掉 xff0c 使用非 xff02 gpu xff02 那一
  • 阿里云 开通 https CDN 客户端和服务器不支持常用的 SSL 协议版本或加密套件

    需要在CDN管理配置上添加https证书 HTTPS设置
  • 1e-7

    1e 7 就是10的负7次方
  • 3维空间中点、线、面之间的数学关系(python代码)

    1 面的定义 三维空间中的平面由两个量确定 xff1a 一个法向量 xff08 垂直于该平面的向量 xff09 一个已知点 xff08 位于该平面上的一个点 2 叉乘和点乘的区别 2 1叉乘的计算方式 xff0c 叉乘用来得到垂直于两条向量
  • 三维空间中,向量在另外一个向量或者面上的投影

    1 向量在另外一个向量上的投影 求向量u在向量v上的投影 定义为u xff0c 为两向量的夹角 一个向量有两个属性 xff0c 大小和方向首先明确向量点乘的含义 u v
  • C++编程02(引用、参数传递、内联函数)

    C 43 43 编程02 xff08 引用 参数传递方式 内联函数 xff09 引用 文章目录 C 43 43 编程02 xff08 引用 参数传递方式 内联函数 xff09 一 引用1 引用的实质2 引用必须初始化3 对数组建立引用 二
  • 使用Git bash查看之前版本和恢复最新版本的方法

    项目场景 xff1a 作为实习生 xff0c 一直在帮公司搞C 43 43 的图像识别项目 xff0c 因为总是改需求 xff0c 所以我的代码注释的一大片 xff0c 不便于整理 xff0c 有时候改的改的 xff0c 就找不到之前的版本
  • Windows平台下CMake使用报错No CMAKE_CXX_COMPILER could be found

    今天在笔记本建立了一个Cmakelists xff0c 使用cmake编译的时候 xff0c 报错 No CMAKE CXX COMPILER could be found No CMAKE C COMPILER could be foun
  • Cartographer编译方法及编译出错(glog库链接错误)解决方法

    最近在重新调试Carto代码 xff0c 想把自己的代码加入到Carto中 xff0c 原本想在IDE中调试 xff0c 然而Carto编译方式比较奇葩 xff08 catkin make isolated install use ninj
  • 什么是RTOS?RTOS与普通操作系统的区别

    一 xff1a 什么是RTOS RTOS Real Time Operating System xff0c 实时操作系统 实时性是其最大特征 xff0c 实时操作系统中都要包含一个实时任务调度器 xff0c 这个任务调度器与其它操作系统的最
  • 进度条(CSS)

    效果 xff08 实际有动态效果 xff09 html span class token tag span class token tag span class token punctuation lt span div span span
  • 终端命令行打开vscode

    在指定文件夹内 xff0c 使用终端命令行打开vscode 在当前目录打开vscode code 如果code命令无法使用 xff0c 需要配路径 xff0c 如下 xff1a 打开bash或者zsh配置文件 bash 用户请使用 vi b
  • 串口缓冲区管理分析

    一 概述 xff1a 串口使用时一般包含两个缓冲区 xff0c 即发送缓冲区和接收缓冲区 发送数据时 xff0c 先将数据存在发送缓冲区 xff0c 然后通过串口发送 xff1b 接收数据时 xff0c 先将接收的数据存在接收缓冲区 xff
  • array element has incomplete type

    http stackoverflow com search q 61 luaL reg 43 incomplete 43 type libs edje lua2 o edje lua2 c 183 error array type has
  • rt-thread学习记录(一)--内核的移植

    rt thread学习记录 xff08 一 xff09 内核的移植 1 基本选择 在rt thread官网上 xff0c 看到其对stm32芯片的支持 xff0c 因此选择stm32c8t6最小系统来进行移植内核 xff0c rt thre
  • rt-thread内核启动分析

    1 项目准备 上一节的基本环境 如rh thread 基本环境的搭建 硬件材料stm32f103C8T6 以及st link rt thread 内核启动官网分析 在分析rt thread代码的时候 由于rt thread的代码是十分优秀的
  • 达梦数据库sql语句记录

    登入 在ubuntu上安装好达梦数据 xff0c 并且生成实例 xff0c 在ubuntu上进行安装目录 xff0c 采用在tools目录下 xff0c 使用 disql进行命令行模式 xff0c 连接服务器 xff1a Conn sysd
  • vertx web开发(一)

    vertx web开发 最近在开发中 xff0c 由于spring 的大而全 xff0c 反而不实用于一下小项目 xff0c 因为spring boot在空载的情况 xff0c 至少其内存占用超过150M 而对于一些简单的项目反到不适用 而
  • kotlin协程实现原理

    传统runnable接口实现 在java中 xff0c 很多耗时的行为通过实现runnable接口 xff0c 并且通过线程运行下这些耗时的任务 xff0c 例如 xff1a span class token keyword public
  • PCL---RANSAC随机采样一致性算法

    前言 通过前面的文章 xff0c 我们基本上代建的相关环境 本文将继续基于此继续学习PCL相关采样一致性算法 基础代码下载 1 准备 1 1 Ransac算法介绍 RANSAC从样本中随机抽选出一个样本子集 xff0c 使用最小方差估计算法

随机推荐

  • PCL-使用potree可视化

    前言 在几篇文章中 xff0c 基本实现了对PCL相关操作 xff0c 最近在github上找到了Web端对点云数据可视化兼容很好的项目 Potree 对此本文将介绍如何使用Potree来进行web端的可视化 1 Potree 官方运行 P
  • PCL- Las文件处理

    前言 在对点云数据处理的时候 xff0c 很多时候激光雷达扫描的文件不一定是 pcd文件 xff0c 这个时候需要进行相关文件处理 xff0c 如Las xff0c laz e57等文件格式 xff0c 本文将介绍las文件的读写 1 引入
  • PCL-Window下安装

    1 安装编译工具链MSVC MSVC工具链是visual studio 自带的工具链 xff0c 因此安装visual studio社区版即安装完成相应的MSVC工具链 2 安装Clion 相比与Visual studio的界面来说 xff
  • STM32 串口详细讲解

    什么是串口 UART Universal Asynchronous Receiver Transmitter 通用异步收发器 USART Universal Synchronous Asynchronous Receiver Transmi
  • ubuntu 修改pip指定路径

    参考这篇文章 还有 这篇文章 第二篇更好一点 xff0c 亲测成功
  • CrowdHuman数据集介绍

    CrowdHuman数据集是旷世发布的用于行人检测的数据集 xff0c 图片数据大多来自于google搜索 CrowdHuman 数据集数据量比较大 xff0c 训练集15000张 xff0c 测试集5000张 xff0c 验证集4370张
  • CityPersons数据集介绍

    CityPersons数据集是cityscape的一个子集 xff0c 它只包含个人注释 有2975张图片用于培训 xff0c 500张和1575张图片用于验证和测试 一幅图像中行人的平均数量为7人 xff0c 提供了可视区域和全身标注 C
  • CUHK-SYSU数据集介绍

    该数据集是一个大规模的人员搜索基准 xff0c 包含18184张图像和8432个身份 根据图像来源 xff0c 数据集可以分为两部分 xff1a 街道捕捉和电影 xff1a 在街拍中 xff0c 图像通过手持摄像机收集 xff0c 跨越数百
  • ETHZ数据集介绍

    Ess等构建了基于双目视觉的行人数据库用于多人的行人检测与跟踪研究 该数据库采用一对车载的AVT Marlins F033C摄像头进行拍摄 xff0c 分辨率为640 480 xff0c 帧率13 14fps xff0c 给出标定信息和行人
  • Swin Transformer V2

    Swin Transformer V2 论文链接 xff1a https arxiv org pdf 2111 09833 pdf 代码链接 xff1a https github com microsoft Swin Transformer
  • Jetson_Xavier_NX使用教程1(刷机)

    刷机教程 一 xff1a 准备 1 xff1a 准备需要一个tf卡 xff0c 容量最好大点 xff0c 我买的128G的 2 xff1a 还有两个软件一个是格式化卡的软件 xff0c 一个是将镜像文件写入的卡的软件 格式化卡的软件 写入镜
  • Jetson_Xavier_NX使用教程2(简单实用)

    本文会介绍一些刷机后的基本操作 1 风扇控制 刚开始插入电源风扇不转我以外坏了 xff0c 后来才发现并没有 Xavier NX的风扇在系统内核中有一套自动控制温度和转速的算法 xff0c 经过我观察大约在40度左右的时候会自动开启风扇进行
  • NVIDIA Jetson NX使用教程3配置pytorch环境

    本节主要记录 xff0c 安装pytorch及torch vision 1 下载Pytorch 因为jetson属于arm架构的机器 xff0c 所以需要去nvidia的官网下载对应的安装包而不是pytroch的官网 官网链接 xff0c
  • Java 基于 IETF RFC 2617 身份认证

    IETF RFC 2617 身份认证 是基于 HTTP 协议进行验证的 xff0c 认证过程中需要发送两次 HTTP 请求 xff0c 第一次请求服务器返回 401 和 认证标识 xff08 nonce xff09 xff0c 第二次访问H
  • 判断一台机器是大端序还是小端序

    在几乎所有的机器上 xff0c 多字节对象都被存储为连续的字节序列 例如在C语言中 xff0c 一个类型为int的变量x地址为0x100 xff0c 那么其对应地址表达式 amp x的值为0x100 且x的四个字节将被存储在存储器的0x10
  • STL容器保存智能指针并将this指针通过emplace传入STL容器所造成的致命问题(【double free or corruption (out)】和【bad_weak_ptr】)

    我用std queue保存了一个Message类型的智能指针 queue lt shared ptr lt MessageA gt xff0c 然后在Message类型中来将this指针插入队列 xff0c 使用std queue push
  • 实时动态定位(RTK)

    内容来着网络 实时动态定位 xff1a Real Time Kinematic RTK技术的关键在于使用了GPS的载波相位观测量 xff0c 并利用了参考站和移动站之间观测误差的空间相关性 xff0c 通过差分的方式除去移动站观测数据中的大
  • 几个实用的 Bat 脚本命令

    文章目录 1 截图2 息屏后锁屏3 查看当前的路径4 倒计时5 密码输入6 比较两个文本的差异 1 截图 start snippingtool 2 息屏后锁屏 powershell Add Type 39 DllImport 34 user
  • 学习cmake的使用和CMakeLists.txt

    1 学习cmake的使用和CMakeLists txt 文章目录 1 学习cmake的使用和CMakeLists txt1 1 cmake外部构建基础1 2 让每个源文件目录都包含一个CMakeLists txt1 3 安装 1 4 构建静
  • ROS系统基础知识梳理(四) 串口通信

    ROS系统基础知识梳理 四 串口通信 学习ROS系统 xff0c 初步接触到ROS系统外接传感器 xff0c 传感器通过Uart通信向台式机发送数据 xff0c 内容涉及到ROS调用串口数据 串口数据校验 以及欧拉角转换四元数 任务系统 x