【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型)

2023-05-16

文章目录

  • 一、已有ROS仿真器,自行编写控制器节点
    • 1、利用rostopic list明确仿真器可用的topic
    • 2、rostopic info 找到对应话题的类型
    • 3、rosmsg show查找msg定义
    • 4、编写控制器节点
    • 补充:Twist定义的介绍
  • 二、自己构建Publisher和Subscriber节点
    • (一)ROS中消息类型的结构框架
      • 1、common_msgs
      • 2、geometry_msgs
      • 3、Twist类型定义
      • 4、vetor3的定义
      • 5、对象赋值
    • (二)ROS中常见的消息类型
      • 1、geometry_msgs消息类型
      • 2、nav_msgs消息类型
    • (三)ROS中基本的消息类型

在ROS中数据类型(消息)是话题发布的基本形式,明确ROS基本数据类型(消息),是基于ROS编程的基础。
通常有以下两种编程场景,需要明确话题的消息类型(数据类型):

一、已有ROS仿真器,自行编写控制器节点

利用ROS进行仿真的时候,通常仿真器已具有明确的subscriber规则,如:turtlesim和gazebo等。此时我们在编写控制器Publisher节点时,需要参照仿真器已有的话题名、消息类型等进行编程。
通常步骤可以分为四步:1、明确话题名2、明确话题消息;3、明确消息定义;4、编写控制器。

1、利用rostopic list明确仿真器可用的topic

roscore
rosrun turtlesim turtlesim_node 
rostopic list

在这里插入图片描述

2、rostopic info 找到对应话题的类型

在这里插入图片描述

3、rosmsg show查找msg定义

在这里插入图片描述

4、编写控制器节点

在turtle_sim的例子中,可以查看turtle_teleop_key节点代码深入理解,消息类型的使用。
(1)确定功能包的绝对路径

teleop_turtle_key.cpp的路径为:https://github.com/ros/ros_tutorials/blob/noetic-devel/turtlesim/tutorials/teleop_turtle_key.cpp

(2)编程采用的数据类型
① 加载头文件:

#include<总包/消息名.h>

在这里插入图片描述
②发布类型模板:

nh.advertise<总包名::消息名>

在这里插入图片描述
③ 赋值:
用消息定义一个对象。将值赋予对象的特定成员。

在这里插入图片描述

补充:Twist定义的介绍

geometry_msgs为点、向量和姿态等常见几何原语提供数据类型。这些Primative旨在提供通用数据类型,并促进整个系统的互操作性。
Twist消息是geometry_msgs下的一个数据类型,存放了两组vector3,每个vector3又分别存放了3个float64类型变量
在这里插入图片描述
在这里插入图片描述

二、自己构建Publisher和Subscriber节点

自己构建Publisher和Subscriber节点,自己挑选合适的msg。主要需要自己对常见的数据类型有一定的了解。

(一)ROS中消息类型的结构框架

1、common_msgs

ROS中C++和Python最基础的数据类型包为common_msgs。其中包含常见的多种消息类型:动作消息( actionlib_msgs ),诊断消息 ( diagnostic_msgs ), 几何消息( geometry_msgs ),导航消息( nav_msgs )和常见的传感器消息 ( sensor_msgs )。
在这里插入图片描述

2、geometry_msgs

在这里插入图片描述

3、Twist类型定义

在这里插入图片描述

4、vetor3的定义

在这里插入图片描述

5、对象赋值

在这里插入图片描述

(二)ROS中常见的消息类型

1、geometry_msgs消息类型

Point 点
float64 x ,float64 y,float64 z
Point32 一般使用Point,大规模点云使用Point32
float32 x,float32 y,float32 z
PointStamped
(1)std_msgs/Header header 包含坐标系和时间戳信息
(2)geometry_msgs/Point point 点
Polygon 多边形
geometry_msgs/Point32[] points
PolygonStamped
(1)std_msgs/Header header
(2)geometry_msgs/Polygon polygon
Pose 位姿:
(1)geometry_msgs/Point position 位置
(2)geometry_msgs/Quaternion orientation 姿态,即方向
Pose2D 2d平面的位姿
float64 x,float64 y,float64 theta
PoseArray 位姿序列:
(1)std_msgs/Header header
(2)geometry_msgs/Pose[] poses
PoseStamped 位姿:
(1)std_msgs/Header header
(2)geometry_msgs/Pose pose
PoseWithCovariance:
(1)geometry_msgs/Pose pose 即(x, y, z, X 旋转, Y旋转, Z旋转)
(2)float64[36] covariance协方差
PoseWithCovarianceStamped:
(1)std_msgs/Header header
(2)geometry_msgs/PoseWithCovariance pose
Quaternion 四元数旋转
float64 x,float64 y,float64 z,float64 w
QuaternionStamped
Transform 坐标系之间的变换:
(1)geometry_msgs/Vector3 translation 平移向量
(2)geometry_msgs/Quaternionrotation 旋转向量
TransformStamped
Twist 速度
(1)geometry_msgs/Vector3 linear 线速度
(2)geometry_msgs/Vector3 angular角速度
TwistStamped
TwistWithCovariance
TwistWithCovarianceStamped
Vector3
向量float64 x,float64 y,float64 z
Vector3Stamped
Wrench 力
(1)geometry_msgs/Vector3 force 力
(2)geometry_msgs/Vector3 torque 扭矩
WrenchStamped

2、nav_msgs消息类型

1 GridCells 栅格单元
(1)std_msgs/Header header头,时间戳与坐标系
(2)float32 cell_width,float32 cell_height宽度与高度
(3)geometry_msgs/Point[] cells数组

2MapMetaData 占有率栅格地图数据
(1)time map_load_time 地图被加载的时间
(2)float32 resolution 分辨率(m/cell)
(3)uint32 width,uint32 height
(4)geometry_msgs/Pose origin 真实世界中的原点 (m,m,rad) 图像中的(0,0)点

3 OccupancyGrid 2d栅格地图
(1)Header header
(2)nav_msgs/MapMetaData info 地图信息
(3)int8[] data 占有率地图数据序列,概率为【0-100】,未知为-1

4 Odometry 估计的位姿与速度
(1)std_msgs/Header header 位姿所在坐标系
(2)string child_frame_id 速度所在坐标系
(3)geometry_msgs/PoseWithCovariance pose 位姿
(4)geometry_msgs/TwistWithCovariance twist 速度

5 Path 路径
(1)Header header
(2)geometry_msgs/PoseStamped[] poses 代表路径的三维点坐标数组

(三)ROS中基本的消息类型

http://wiki.ros.org/msg

Primitive TypeSerializationC++Python2 / Python3
boolunsigned 8-bit intuint8_tbool
int8signed 8-bit intint8_tint
uint8unsigned 8-bit intuint8_tint
int16signed 16-bit intint16_tint
uint16unsigned 16-bit intuint16_tint
int32signed 32-bit intint32_tint
uint32unsigned 32-bit intuint32_tint
int64signed 64-bit intint64_tlong int
uint64unsigned 64-bit intuint64_tlong int
float3232-bit IEEE floatfloatfloat
float6464-bit IEEE floatdoublefloat
stringascii stringstd::stringstr bytes
timesecs/nsecs unsigned 32-bit intsros::Timerospy.Time
durationsecs/nsecs signed 32-bit intsros::Durationrospy.Duration
#include <std_msgs/Float64.h>
std_msgs::Float64 input_float; //create a variable of type "Float64
ros::Publisher my_publisher_object = n.advertise<std_msgs::Float64>("topic1", 1)   ;
my_publisher_object.publish(input_float);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ROS进阶】5000字解析如何确定ROS编程中数据类型(消息类型) 的相关文章

  • 互联网+时代的7个引爆点(读书笔记)

    百货商场里的销售人员一直抱怨 xff0c 大家只是到自己这里来看看 xff0c 之后转身就在网上下单 从旧视角瞎看这固然是一种文体 xff0c 显示着揭示了一种新的机会 以线下体验为入口的机会 小团队精益式的迭代 xff0c 几个周期后就可
  • maperuce运算框架

    1 xff0c 概念 mapreduce 运算框架主要实现hadoop 的数据处理 xff0c 数据处理中 流经过5个节点 数据流 xff1a input gt spilt gt map gt shuffle gt reduce xff08
  • 在Python中使用print输出时,出现UnicodeEncodeError错误,错误提示为“‘gbk‘ codec can‘t encode character ‘\u2022‘ in posit

    利用chatgpt一步步解决了这个问题 xff0c 感觉ChatGPT还是太强大了 问题描述 xff1a 在Python中使用print输出时 xff0c 出现UnicodeEncodeError错误 xff0c 错误提示为 39 gbk
  • openstack一些特性资料

    Keystone RBAC nova compute Cells Bare Metal Compute 是什么东西 xff1f http wiki openstack org blueprint nova compute cells htt
  • 【神经网络和深度学习-开发案例】 第二章 神经网络结构

    神经网络和深度学习 第二章 神经网络结构 案例 xff1a 使用神经网络识别手写数字 我将介绍一个神经网络 xff0c 它可以很好地对手写的数字进行分类 为了准备这一点 xff0c 它有助于解释一些术语 xff0c 让我们可以命名一个网络的
  • 2000页kubernetes操作手册,内容详细代码清晰,小白也能看懂

    现如今 xff0c Kubernetes业务已成长为新时代的IT基础设施 xff0c 并成为高级运维工程师 架构师 后端开发工程师的必修技术栈 毫无疑问 xff0c Kubernetes是云计算发展演进的一次彻底革命性的突破 xff0c 只
  • FreeRTOS代码阅读笔记:heap_4.c

    FreeRTOS中对于内存的管理当前一共有5种实现方式 xff08 作者当前的版本是10 1 1 xff09 xff0c 均在 Source portable MemMang 下面 xff0c 这里笔记下 heap 4 c和第二种方式比较相
  • (1)touchgfx 添加时钟控件

    第一步 xff1a 新建空白模版 添加图片 xff1a 放入 链接 xff1a https pan baidu com s 1NI6LUYrTUs64Z2jZE6AAQQ 提取码 xff1a 2odw 添加控件 xff1a 位置部件属性1T
  • 【基于51】红外寻迹智能小车 - 代码篇

    文章目录 前言一 准备工作二 使用步骤1 模块化编程2 电机模块3 小车动作模块4 PWM 和定时器 中断系统5 寻迹逻辑 总结 前言 关于硬件部分可以看我上次写的帖子https blog csdn net ZER00000001 arti
  • C++关键字override

    一 什么是override override的翻译是覆盖 实际上它在C 43 43 中可以检测哪些虚函数没有被重写并报错 注 xff1a 在派生类的成员函数中使用override时 xff0c 如果基类中无此函数 xff0c 或基类中的函数
  • 邻接矩阵和邻接表

    图的概述和存储结构 xff08 一 xff09 文章目录 前言一 图的概述1 xff09 图的分类2 xff09 图的要素 二 图的存储结构三 邻接矩阵四 邻接表 前言 有一种说法是程序是由数据结构和算法组成的 xff0c 这很能体现出数据
  • 图解迪杰斯特拉(Dijkstra)最短路径算法

    往期文章目录 干货满满 xff01 最小生成树 Prim算法 最小生成树 Kruskal算法 目录 前言 一 最短路径的概念及应用 二 Dijkstra迪杰斯特拉 1 什么是Dijkstra 2 逻辑实现 总结 前言 无论是什么程序都要和数
  • Vscode配置Git+快速入门,一篇学会80%的Git操作

    前言 团队开发中经常会用到Git xff0c 能极大简化开发的流程 xff0c 而个人开发也可以利用Git管理自己的代码 同样作为一个初学者 xff0c 我在学完Git之后写下这篇文章总结个人走过的坑 xff0c 大家一起进步 Git下载和
  • 【C++11】三大神器之——智能指针

    文章目录 前言 一 智能指针的原理1 RAII机制2 简单的实现 二 智能指针的用法1 智能指针的分类2 unique ptr基本语法 3 shared ptr基本语法 4 删除器5 weak ptr 前言 一 智能指针的原理 1 RAII
  • 【C++11】三大神器之——右值、移动语义、完美转发

    前言 如果你还不知道C 43 43 11引入的右值 移动语义 完美转发是什么 xff0c 可以阅读这篇文章 xff1b 如果你已经对这些知识了如指掌 xff0c 也可以看看有什么可以补充 x1f60f 一 右值 值类别vs变量类型 在正式认
  • 【C++11】三大神器之——包装器和绑定器

    前言 如果你还不知道 C 43 43 11 引入的包装器和绑定器是什么 xff0c 可以读读这篇文章 xff0c 看看有什么 启发 xff1b 如果你已经对包装器和绑定器了如指掌 xff0c 也可以读读这篇文章 xff0c 看看有什么 补充
  • 【神经网络和深度学习-开发案例】第四章 神经网络如何对数字进行分类

    神经网络和深度学习 第四章 神经网络如何对数字进行分类 案例 xff1a 使用神经网络识别手写数字 好了 xff0c 让我们来写一个程序 xff0c 学习如何识别手写的数字 xff0c 使用随机梯度下降和MNIST的训练数据 我们将用一个简
  • Win7下安装Ubuntu(双硬盘)的简要步骤

    0 硬件准备 一个至少4G大小的U盘 xff0c 用于刻录Ubuntu系统并安装 1 下载Ubuntu镜像及刻录 Ubuntu镜像 Ubuntu镜像可从官网下载 xff08 外网 xff0c 速度太慢 xff09 xff0c 或使用国内镜像
  • C++ Primer Plus拾遗

    本博文整理了C 43 43 Primer Plus前六章中的部分知识点 xff0c 一般为不常用的小技巧或基础概念性的内容 C与C 43 43 的语言特性 C语言特性 结构化编程 xff08 Structured Programming x
  • 时隔一年,对全国大学生智能车竞赛做段总结(五)

    早期粗糙的赛道元素处理 说这个没有别的意思 xff0c 就是觉得 xff0c 遇到实际应用上的问题 xff0c 虽然脑海里的知识技巧并不能让我们有多高明的手法去解决这个问题 xff0c 但也要努力去尝试 元素判断 这里的元素判断也是粗糙的

随机推荐