在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.mzph.cn/news/57859.shtml

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

相关文章

pytest笔记: pytest单元测试框架

第一步&#xff1a;安装 和查看版本 pycharm settings 查看 第二步&#xff1a; 编写test_example.py def inc(x):return x1 def test_answer():assert inc(4) 5 第三步&#xff1a;在当前路径下执行pytest 命令 PS E:\data\web测试\Selenium3自动化测试实战——基于Pyth…

Flink流批一体计算(18):PyFlink DataStream API之计算和Sink

目录 1. 在上节数据流上执行转换操作&#xff0c;或者使用 sink 将数据写入外部系统。 2. File Sink File Sink Format Types Row-encoded Formats Bulk-encoded Formats 桶分配 滚动策略 3. 如何输出结果 Print 集合数据到客户端&#xff0c;execute_and_collect…

力扣:74. 搜索二维矩阵(Python3)

题目&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返…

MySQL概述,架构原理

一.MySQL简介 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;后被oracle公司收购&#xff0c;MySQL是当下最流行的关系型数据库管理系统之一&#xff0c;在WEB应用方面&#xff0c;MySQL是最好的RDBMS&#xff08;Relational Database Man…

Mybatis小记

目录 Mybatis第一个程序 xml文件 测试类 错误排查 Mybatis第一个程序 1.搭建实验数据库 2.导入MyBatis相关jar包 3.编写MyBatis核心配置文件 4.编写MyBatis工具类 5.创建实体类、 6.编写Mapper接口类 7.编写Mapper.xml配置文件 8.编写测试类 对象传参只引用需要的属性就可…

基于AVR128单片机抢答器proteus仿真设计

一、系统方案 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void timer0_init() //定时器初始化 { TCCR00x07; //普通模式&#xff0c;OC0不输出&#xff0c;1024分频 TCNT0f_count; //初值&#xff0c;定时为10ms TIFR0x01; //清中断标志…

ChatGPT Prompting开发实战(二)

一、基于LangChain源码react来解析prompt engineering 在LangChain源码中一个特别重要的部分就是react&#xff0c;它的基本概念是&#xff0c;LLM在推理时会产生很多中间步骤而不是直接产生结果&#xff0c;这些中间步骤可以被用来与外界进行交互&#xff0c;然后产生new con…

IdentityServer密码长度超长会导致跳转到登录页

应用系统项目的安全要求越来越高&#xff0c;基本都是采取https等加密证书传输&#xff0c;无法使用https的&#xff0c;也是要求不能明文传输内容&#xff0c;因此做一些等保要求&#xff0c;密码需要加密后才能传输给服务端&#xff0c;所以前端会采取一些密码手段&#xff0…

【Android Framework系列】第12章 RecycleView相关原理及四级缓存策略分析

1 RecyclerView简介 RecyclerView是一款非常强大的widget&#xff0c;它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView的时候&#xff0c;我发现对于复杂的列表界面有很多资源可以参考&#xff0c;但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView的…

『赠书活动 | 第十八期』《深入浅出SSD:固态存储核心技术、原理与实战》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十八期』 本期书籍&#xff1a;《深入浅出SSD&#xff1a;固态存储核心技术、原理与实战》 赠书规则&#xff1a;评论区&#xff1a;点赞&…

Java 线程池

线程池 Java 线程池是一种多线程处理技术&#xff0c;它可以在程序中预先创建一定数量的线程&#xff0c;将任务提交到线程池中&#xff0c;线程池会自动调度线程执行任务。通过使用线程池&#xff0c;可以避免反复创建和销毁线程的开销&#xff0c;提高程序性能&#xff0c;同…

monorepo更新组件报错,提示“无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本”

解决方法&#xff1a; 第一步&#xff1a;管理员身份运行 window.powershell&#xff0c; win x打开powerShell命令框&#xff0c;进入到对应项目路径。 第二步&#xff1a;执行&#xff1a;get-ExecutionPolicy&#xff0c;显示Restricted&#xff0c;表示状态是禁止的; 第…

面试前的准备:程序员应该如何备战面试

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

盲盒电商小程序

一、准备阶段 在开始制作盲盒小程序前&#xff0c;你需要在乔拓云平台上创建一个账号&#xff0c;并登录到后台管理页面。在后台管理页面&#xff0c;你可以找到商城管理模块&#xff0c;点击进入商城编辑制作页面。 二、小程序商城模板选择与编辑 1.在商城编辑制作页面&#x…

2023.08.27 学习周报

文章目录 摘要文献阅读1.题目2.重点3.引言4.方法5.实验结果6.结论 深度学习Majorization-Minimization算法1.基本思想2.要求3.示意图 总结 摘要 This week, I read a computer science on the prediction of atmospheric pollutants in urban environments based on coupled d…

pandas读取excel,再写入excel

需求是这样的&#xff0c;从一个表读取数据&#xff0c;然后每次执行创建一个新表将值写入 读取这个表 写入到这个表 分别对应的是e、h列数据&#xff0c;代码如下&#xff1a; import pandas as pd import openpyxl import datetime dfpd.read_excel(rC:\Users\admin\Deskt…

设计模式-职责链模式

文章目录 职责链模式模式概述主要角色适用场景实现步骤优点注意事项 定义职责链结构示例总结 职责链模式 职责链模式是一种行为设计模式&#xff0c;它可以将请求的发送者和请求的处理者解耦&#xff0c;并按照预定义的顺序处理请求。职责链模式常用于需要逐级审批或转交处理的…

玩转软件|钉钉个人版内测启动:AI探索未来的工作方式

目录 前言 正文 AI为核心&#xff0c;个人效率为王&#xff01; 指令中心&#xff0c;解锁AI技巧&#xff01; 灵感Store&#xff0c;探索更多可能&#xff01; 未来的AI&#xff0c;即将问世&#xff01; 个人内测体验 前言 重磅消息&#xff1a;钉钉个人版在8月16日正…

c# modbus CRC计算器(查表法)

一、简介&#xff1a; 本案例为crc计算器&#xff0c;通过查表法计算出结果 1.窗体后台源代码 using Crc; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text…

Stm32的时钟系统以及使用SysTick滴答定时器实现延时

前言 STM32的时钟系统由多个时钟源和时钟树组成时钟源包括主时钟源&#xff08;HSE&#xff09;、内部高速时钟源&#xff08;HSI&#xff09;、内部低速时钟源&#xff08;LSI&#xff09;和外部低速时钟源&#xff08;LSE&#xff09;。时钟树由多个时钟分频器和时钟门控器组…