在ros中利用串口serial发布fdilink的gps话题

文章目录

  • 介绍
  • FDILink通讯协议
    • 数据帧组成
    • 数据包
  • 数据处理
    • 打开串口
    • 在头文件中定义参数
    • 串口读取
  • 代码运用
    • 依赖:
    • 使用:
  • 源码

介绍

DETA100系列 是一个提供 GNSS/INS & AHRS 系统的模组,在最苛刻的条件下提供准确的位置、速度、加速度和姿态数据。它结合了温度校准的加速度计,陀螺仪,磁力计与一个双天线RTK、GNSS接收器。这些是耦合在一个复杂的融合算法,以提供准确和可靠的导航和方向。同时DETA100系列 支持辅助设备的数据接入,如里程计、光流计、RTCM 数据等。

FDILink通讯协议

数据帧组成

在这里插入图片描述
A: 指令类别
在这里插入图片描述
B:载荷的字节数。
C:流水号, 每发送一个数据帧数值加一,用于检测数据帧丢包。
D:帧头CRC8校验,计算帧头部分 起始标志 + 指令类别 + 数据长度 + 流水序号。
E:数据CRC16校验,计算载荷数据的CRC16校验。

数据包

以双天线为例
在这里插入图片描述
在这里插入图片描述

数据处理

打开串口

  try{serial_.setPort(serial_port_);serial_.setBaudrate(serial_baud_);serial_.setFlowcontrol(serial::flowcontrol_none);serial_.setParity(serial::parity_none); //default is parity_noneserial_.setStopbits(serial::stopbits_one);serial_.setBytesize(serial::eightbits);serial::Timeout time_out = serial::Timeout::simpleTimeout(serial_timeout_);serial_.setTimeout(time_out);serial_.open();}catch (serial::IOException &e){ROS_ERROR_STREAM("Unable to open port ");exit(0);}

在头文件中定义参数

进行指令和字节数赋值
以双天线消息为例

#define TYPE_GNSS 0x78 //指令ID
#define GNSS_DUAL_ANTENNA_DATA_LEN 0x86  //字节数长度 134 = 133+1

定义双天线消息的数据结构

#pragma pack(1)
struct Gnss_Dual_Antenna_data_Packet_t
{uint32_t Microseconds;double RoverRtkRefPosN;double RoverRtkRefPosE;double RoverRtkRefPosD;double MBRtkRefPosN;double MBRtkRefPosE;double MBRtkRefPosD;double RoverLat;double RoverLon;float RoverAlt;float Rover_hAcc;float Rover_vAcc;double MBLat;double MBLon;float MBAlt;float MBhAcc;float MBvAcc;double RoverRtkPosLength;float RoverRtkAccuracyLength;double RoverRtkPosHeading;float RoverRtkAccuracyHeading;uint8_t MBfixtype;uint8_t Roverfixtype;    
};
#pragma pack()

串口读取

    else if (head_type[0] == TYPE_GNSS){Gnss_Dual_Antenna_data_frame_.frame.header.header_start   = check_head[0];Gnss_Dual_Antenna_data_frame_.frame.header.data_type      = head_type[0];Gnss_Dual_Antenna_data_frame_.frame.header.data_size      = check_len[0];Gnss_Dual_Antenna_data_frame_.frame.header.serial_num     = check_sn[0];Gnss_Dual_Antenna_data_frame_.frame.header.header_crc8    = head_crc8[0];Gnss_Dual_Antenna_data_frame_.frame.header.header_crc16_h = head_crc16_H[0];Gnss_Dual_Antenna_data_frame_.frame.header.header_crc16_l = head_crc16_L[0];uint8_t CRC8 = CRC8_Table(Gnss_Dual_Antenna_data_frame_.read_buf.frame_header, 4);if (CRC8 != Gnss_Dual_Antenna_data_frame_.frame.header.header_crc8){ROS_WARN("header_crc8 error");continue;}if(!frist_sn_){read_sn_  = Gnss_Dual_Antenna_data_frame_.frame.header.serial_num - 1;frist_sn_ = true;}
 else if (head_type[0] == TYPE_GNSS){uint16_t head_crc16_l = Gnss_Dual_Antenna_data_frame_.frame.header.header_crc16_l;uint16_t head_crc16_h = Gnss_Dual_Antenna_data_frame_.frame.header.header_crc16_h;uint16_t head_crc16 = head_crc16_l + (head_crc16_h << 8);size_t data_s = serial_.read(Gnss_Dual_Antenna_data_frame_.read_buf.read_msg, (GNSS_DUAL_ANTENNA_DATA_LEN + 1)); //134+1// if (if_debug_){// for (size_t i = 0; i < (GNSS_DUAL_ANTENNA_DATA_LEN + 1); i++)// {//   std::cout << std::hex << (int)Gnss_Dual_Antenna_data_frame_.read_buf.read_msg[i] << " ";// }// std::cout << std::dec << std::endl;// std::cout << "frame_end: " << std::hex << (int)Gnss_Dual_Antenna_data_frame_.frame.frame_end<< std::dec << std::endl;// }uint16_t CRC16 = CRC16_Table(Gnss_Dual_Antenna_data_frame_.frame.data.data_buff, GNSS_DUAL_ANTENNA_DATA_LEN);if (if_debug_){          std::cout << "CRC16:        " << std::hex << (int)CRC16 << std::dec << std::endl;std::cout << "head_crc16:   " << std::hex << (int)head_crc16 << std::dec << std::endl;std::cout << "head_crc16_h: " << std::hex << (int)head_crc16_h << std::dec << std::endl;std::cout << "head_crc16_l: " << std::hex << (int)head_crc16_l << std::dec << std::endl;bool if_right = ((int)head_crc16 == (int)CRC16);std::cout << "if_right: " << if_right << std::endl;}if (head_crc16 != CRC16){ROS_WARN("check crc16 faild(gnss).");continue;}else if(Gnss_Dual_Antenna_data_frame_.frame.frame_end != FRAME_END){ROS_WARN("check frame end.gnss");continue;}}

代码运用

依赖:

sudo apt install ros-melodic-serial

使用:

ahrs_driver.launch

<launch><node pkg="fdilink_ahrs" name="ahrs_driver" type="ahrs_driver" output="screen" ><!-- 是否输出debug信息 --><param name="debug"  value="false"/><!-- 串口设备,可通过rules.d配置固定 --><param name="port"  value="/dev/ttyUSB0"/><!-- <param name="port"  value="/dev/ttyTHS1"/> --><!-- 波特率 --><param name="baud"  value="921600"/><!-- 发布的imu话题名 --><param name="imu_topic"  value="/imu"/><!-- 发布的imu话题中的frame_id --><param name="imu_frame"  value="imu"/><!-- 地磁北的yaw角 --> # 二维指北的朝向,北为0,逆时针增加,0~2π的取值范围。<param name="mag_pose_2d_topic"  value="/mag_pose_2d"/><!-- 发布的数据基于不同设备有不同的坐标系   --><param name="device_type"  value="1"/> <!-- 0: origin_data, 1: for single imu or ucar in ROS, 2:for Xiao in ROS --></node>
</launch> 

其中device_type

  1. Deta-10的原始坐标系模式
  2. 单独imu的坐标系模式

调用的ahrs_driver节点会发布sensor_msgs/Imu格式的imu topic。

std_msgs/Header headeruint32 seqtime stampstring frame_id
geometry_msgs/Quaternion orientationfloat64 xfloat64 yfloat64 zfloat64 w
float64[9] orientation_covariance
geometry_msgs/Vector3 angular_velocityfloat64 xfloat64 yfloat64 z
float64[9] angular_velocity_covariance
geometry_msgs/Vector3 linear_accelerationfloat64 xfloat64 yfloat64 z
float64[9] linear_acceleration_covariance

也会发布geometry_msgs/Pose2D格式的二维指北角话题,话题名默认为/mag_pose_2d

float64 x
float64 y
float64 theta  # 指北角

源码

链接:https://pan.baidu.com/s/1xG-Hmpuv_GSkeDP47lfApA
提取码:armd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111578.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营Day42 | 01背包理论基础 | 01背包 (滚动数组) | 416. 分割等和子集

文章目录 01背包理论基础题目描述暴力解法动态规划 01背包 (滚动数组)01背包总结 416. 分割等和子集二维 dp一维 dp&#xff08;滚动&#xff09;题解 01背包理论基础 理论基础 题目描述 有 n 件物品和一个最多能背重量为w 的背包&#xff0c;已知第 i 件物品的重量是 weigh…

hadoop大数据集群中更换磁盘,balance的速度缓慢问题(解决)

hadoop大数据集群中更换磁盘&#xff0c;balance的速度缓慢问题&#xff08;解决&#xff09; 看现象只有4个bloucks在执行的 调整参数&#xff1a; 增大配置参数&#xff0c;观察重新负载的速度 修改配置文件 hdfs-site.xml dfs.datanode.balance.max.concurrent.moves100 …

使用GoLand进行远程调试

对部署进行配置 在此配置远程服务器地址&#xff0c;映射&#xff0c;是否自动上传(更新)等 选择SFTP类型 选择上传 另外给自动上传选项打钩 此时在本地修改某个文件&#xff0c;远程机器相应目录的文件&#xff0c;也会被同步修改 对远程调试进行配置 远程机器需要安装delve 而…

数论基础(II)。

数论基础&#xff08;II&#xff09;TOC 数论按照研究的数据、方法、方向不同&#xff0c;通常可以分为玄数论、素数论、和数论。无限个数&#xff0c;真正用得到的只有数头&#xff1b;数头比较重要的关限是100&#xff0c;120&#xff0c;十万&#xff0c;百亿&#xff0c;&…

百度“AI智障”到AI智能体验之旅

目录 前言一、百度PLATO1.抬杠第一名2.听Ta瞎扯淡3.TA当场去世了4.智障与网友的高光时刻 二、文心一言1.设计测试用例2.随意发问3.手机端约会神器 三、体验总结&#xff1a;四、千帆大模型 前言 最近收到了文心一言3.5大模型的内测资格&#xff0c;正巧之前也体验过它的前身&q…

MySQL数据库——多表查询(2)-内连接、外连接

目录 内连接 查询语法 内连接演示 外连接 查询语法 外连接演示 内连接 内连接查询的是两张表交集的部分&#xff0c;返回A表和B表交集部分的数据。内连接分为两种形式&#xff1a;隐式内连接和显式内连接。 查询语法 隐式内连接 SELECT 字段列表 FROM 表1,表2 WHERE 条…

Redis 事务

1. 是什么 1. 官网 https://redis.io/dosc/manual/transactions/ 2. 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞 2. 能干啥 一个队列中&#xff0c;一次…

基于SSM的旅游管理系统jsp房源信息java源代码Mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于SSM的旅游管理系统 系统有2权限&#xff1a;管理…

【数据结构与算法】—— 手撕红黑树

目录 &#xff08;一&#xff09;红黑树的定义 1、红黑树的引入 2、红黑树的概念 3、红黑树的性质 &#xff08;二&#xff09;红黑树的操作 1、红黑树节点的定义 2、红黑树的插入操作 1️⃣ 思路 2️⃣ 代码实现 3、红黑树的删除操作&#xff08;了解&#xff09; …

扩散模型实战(八):微调扩散模型

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xf…

yolov5和yolov7部署的研究

1.结论 onnx推理比torch快3倍, openvino比onnx快一丢丢。 | yolov7.pt 转 onnx python export.py --weights best_31.pt --grid --end2end --simplify --topk-all 10 --iou-thres 0.65 --conf-thres 0.65 --img-size 320 320 --max-wh 200可以看到yolov7的 onnx是包括nms…

【Unity小技巧】手戳一个简单易用的游戏UI框架(附源码)

文章目录 前言整套框架分为三大部分框架代码调用源码参考完结 前言 开发一款游戏美术成本是极其高昂的&#xff0c;以我们常见的宣传片CG为例&#xff0c;动辄就要成百上千万的价格&#xff0c;因此这种美术物料一般只会放在核心剧情节点&#xff0c;引爆舆论&#xff0c;做高…

MATLAB中符号变量的使用方法解析

简介 MATLAB中常常使用符号变量&#xff0c;这里定义符号变量的函数是syms 使用方法如下 syms x y z 其中&#xff0c;x、y、z 是符号变量&#xff0c;可以是任意字母、数字或下划线组合而成的字符串。 举例1&#xff1a; 代码 以下是一个简单的例子&#xff0c;演示如何…

WebSocket- 前端篇

官网代码 // 为了浏览器兼容websocketconst WebSocket window.WebSocket || window.MozWebSocket// 创建连接 this.socket new WebSocket(ws://xxx)// 连接成功this.socket.onopen (res)>{console.log(websocket 连接成功)this.socket.send(入参字段) // 传递的参数字段}…

强化自主可控,润开鸿发布基于RISC-V架构的开源鸿蒙终端新品

2023 RISC-V中国峰会于8月23日至25日在北京召开,峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。本次大会邀请了RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇,吸引超过百余家业界企业、高…

出现ZooKeeper JMX enabled by default这种错误的解决方法

系列文章专栏 学习以来遇到的bug/问题专栏 文章目录 系列文章专栏 前言 一 问题描述 二 解决方法 2.1 可能的原因分析 2.2 小编的问题解决方法 First&#xff1a;检查/etc/profile里面zookeeper的环境变量配置 Second&#xff1a;检查 zookeeper/conf/zoo.cfg里面的d…

minikube mac 启动

系统信息如下 最开始使用的minikube是1.22.0版本&#xff0c;按照如下命令启动&#xff1a; minikube start --memory7851 --cpus4 --image-mirror-countrycn遇到了下面一些问题&#xff1a; 1、拉取coredns:v1.8.0镜像失败 Error response from daemon: manifest for regis…

Tensorflow调用训练好的yolov5模型进行推理

文章目录 1、安装TensorFlow-GPU版本1.2、验证是否安装正常 2、将训练好的pt文件转换成onnx文件2.2、什么是Onnx模型和Tensorflow模型2.1、将onnx文件转换成pb文件 1、安装TensorFlow-GPU版本 1、创建虚拟环境python3.8 conda create -n TF2.4 python3.82、进入虚拟环境 conda…

智安网络|探索物联网架构:构建连接物体与数字世界的桥梁

物联网是指通过互联网将各种物理设备与传感器连接在一起&#xff0c;实现相互通信和数据交换的网络系统。物联网架构是实现这一连接的基础和框架&#xff0c;它允许物体与数字世界之间的互动和协作。 一、物联网架构的概述 物联网架构是一种分层结构&#xff0c;它将物联网系…

python面试:使用cProfile剖析程序性能

我们需要安装tuna&#xff1a;pip install tuna 程序执行完毕后&#xff0c;我们会得到一个results.prof&#xff0c;在CMD中输入指令&#xff1a;“tuna results.prof”。 import time import cProfile import pstatsdef add(x, y):resulting_sum 0resulting_sum xresulti…