Matlab与ROS(1/2)---Message(三)

0. 简介

消息是ROS中交换数据的主要容器。主题和服务使用消息在节点之间传输数据。为了标识其数据结构,每条消息都有一个消息类型。例如,来自激光扫描仪的传感器数据通常以sensor_msgs/LaserScan类型的消息发送。每种消息类型标识消息中包含的数据元素。每个消息类型名称都是一个包名称。

在这里插入图片描述
MATLAB支持在机器人应用程序中经常遇到的许多ROS消息类型。这个例子展示了在MATLAB中创建、探索和填充ROS消息的一些方法。

1. 查找消息类型

初始化ROS主节点和全局节点

rosinit

Launching ROS Core…
Done in 0.37599 seconds.
Initializing ROS master on http://172.29.217.11:53161.
Initializing global node /matlab_global_node_29455 with NodeURI http://dcc083455glnxa64:37683/ and MasterURI http://localhost:53161.

使用exampleHelperROSCreateSampleNetwork使用另外三个节点以及示例发布者和订阅者填充ROS网络。

网络上有各种节点,它们都有一些主题和关联的发布者和订阅者。

您可以通过调用rostopic list查看可用主题的完整列表。

rostopic list

/pose
/rosout
/scan
/tf

如果您想了解更多关于通过/scan主题发送的数据类型的信息,请使用rostopic info命令来检查它。/scan的消息类型为sensor_msgs/LaserScan

rostopic info /scan

Type: sensor_msgs/LaserScan
Publishers:
/node_3 (http://dcc083455glnxa64:36623/)
Subscribers:
/node_1 (http://dcc083455glnxa64:42445/)
/node_2 (http://dcc083455glnxa64:39859/)

命令输出还告诉您哪些节点正在发布和订阅主题。要了解有关发布者和订阅者的信息,请参见调用和提供ROS服务。

若要了解有关主题消息类型,rosmessage支持消息类型的TAB补全。若要完成消息类型名称,请键入要完成的名称的前几个字符,然后按Tab键。

scandata = rosmessage("sensor_msgs/LaserScan","DataFormat","struct")

scandata = struct with fields:
MessageType: ‘sensor_msgs/LaserScan’
Header: [1x1 struct]
AngleMin: 0
AngleMax: 0
AngleIncrement: 0
TimeIncrement: 0
ScanTime: 0
RangeMin: 0
RangeMax: 0
Ranges: [0x1 single]
Intensities: [0x1 single]

要查看主题和服务可用的所有消息类型的完整列表,请使用rosmsg list

2. 消息结构获取

ROS消息是对象,消息数据存储在属性中。MATLAB具有方便的方法来查找和探索消息的内容。

如果订阅了/pose主题,则可以接收和检查发送的消息。

posesub = rossubscriber("/pose","DataFormat","struct")

posesub =
Subscriber with properties:
TopicName: ‘/pose’
LatestMessage: []
MessageType: ‘geometry_msgs/Twist’
BufferSize: 1
NewMessageFcn: []
DataFormat: ‘struct’

使用receive从订阅者获取数据。一旦接收到新消息,函数将返回该消息并将其存储在posedata变量中(第二个参数是以秒为单位的超时)。

posedata = receive(posesub,10)

posedata = struct with fields:
MessageType: ‘geometry_msgs/Twist’
Linear: [1x1 struct]
Angular: [1x1 struct]

该消息的类型为geometry_msgs/Twist。消息中还有另外两个字段:Linear和Angular。您可以通过直接访问这些消息字段来查看它们的值:

posedata.Linear

ans = struct with fields:
MessageType: ‘geometry_msgs/Vector3’
X: 0.0457
Y: -0.0015
Z: 0.0300

posedata.Angular

ans = struct with fields:
MessageType: ‘geometry_msgs/Vector3’
X: -0.0358
Y: -0.0078
Z: 0.0416

这些消息字段的每个值实际上都是一条消息。它们的消息类型是geometry_msgs/Vector3。geometry_msgs/Twist是由两条geometry_msgs/Vector3消息组成的复合消息。

xpos = posedata.Linear.X

xpos = 0.0457

如果希望快速总结消息中包含的所有数据,请调用rosShowDetails函数。rosShowDetails适用于任何类型的消息,并递归地显示所有消息数据字段。

rosShowDetails(posedata)

ans =

MessageType : geometry_msgs/Twist
Linear
MessageType : geometry_msgs/Vector3
X : 0.04571669482429456
Y : -0.001462435127715878
Z : 0.03002804688888001
Angular
MessageType : geometry_msgs/Vector3
X : -0.03581136613727846
Y : -0.007823871737372501
Z : 0.04157355251890671’

rosShowDetails在调试期间和希望快速查看消息内容时提供帮助。

3. 设置消息信息

ROS 消息是结构。可以直接复制它们以生成新的消息。副本和原始消息都有自己的数据。创建一条类型为geometry_msgs/Twist的消息。

twist = rosmessage("geometry_msgs/Twist","DataFormat","struct")

twist = struct with fields:
MessageType: ‘geometry_msgs/Twist’
Linear: [1x1 struct]
Angular: [1x1 struct]

缺省情况下,此消息的数字字段初始化为0。您可以修改此消息的任何属性。例如Y等于5。

twist.Linear.Y = 5;

查看消息数据以确保您的更改生效

twist.Linear

ans = struct with fields:
MessageType: ‘geometry_msgs/Vector3’
X: 0
Y: 5
Z: 0

一旦用您的数据填充了消息,您就可以将其用于发布者、订阅者和服务。参见“与ROS发布者和订阅者交换数据”和“调用和提供ROS服务”示例。然后就可以通过publish发布我们设置的消息信息了

thermometerNode = ros2node("/thermometer");
tempPub = ros2publisher(thermometerNode,"/twist","sensor_msgs/geometry_msgs/Twist");
tempMsgs(10) = twist;    % Pre-allocate message structure array
for iMeasure = 1:10
    % Copy blank message fields
    tempMsgs(iMeasure) = twist;
    
    % Record sample message
    tempMsgs(iMeasure).Linear.Y = 20+randn*3;
    
    % Only calculate the variation once sufficient data observed
    if iMeasure >= 5
        tempMsgs(iMeasure).Linear.X= var([tempMsgs(1:iMeasure).Linear.Y]);
    end
    
    % Pass the data to subscribers
    send(tempPub,tempMsgs(iMeasure))
end
errorbar([tempMsgs.Linear.Y],[tempMsgs.Linear.X])

在这里插入图片描述

4. 保存和加载消息

您可以保存消息并存储内容以供以后使用。

例如从订阅者获取一条新消息。

posedata = receive(posesub,10)

然后使用MATLAB的保存函数将姿态数据保存到MAT文件中。

save('posedata.mat','posedata')

在将文件加载回工作空间之前,清除posedata变量。

clear posedata

现在可以通过调用load函数加载消息数据。这将从上面将posedata加载到messageData结构中。Posedata是结构的一个数据字段。

messageData = load('posedata.mat')

messageData = struct with fields:
posedata: [1x1 struct]

检查messageData。Posedata来查看消息内容。

messageData.posedata

ans = struct with fields:
MessageType: ‘geometry_msgs/Twist’
Linear: [1x1 struct]
Angular: [1x1 struct]

然后可以删除MAT文件

delete('posedata.mat')

5. Message数据转化

由于在Matlab中,ROS消息的每个元素是独立的,因此无法验证具有多个值在数学层面上的有效性。因为每个值都可以单独设置,所以消息不会将属性作为一个整体进行验证。例如,四元数消息包含w、x、y和z属性,但该消息并不强制四元数作为一个整体是有效的。所以有可能在单独修改一个四元数信息后,这个四元数是不符合模型的。同时消息属性还可以具有各种数据类型。MATLAB使用ROS设置的规则来确定这些数据类型。为此,这些数据类型必须映射到MATLAB数据类型才能在MATLAB中使用。下表总结了如何将ROS数据类型转换为MATLAB数据类型。

在这里插入图片描述
同时在Matlab中也自带了一些常用的msg包,这些包包含了常用的消息类型、服务类型或操作类型。可以在MATLAB命令窗口中调用rosmsg list查看,当然也可以通过第二讲提到的方法。通过ROS Toolbox的ROS自定义消息支持来生成新的消息定义。同时值得注意的是,在指定消息类型时,输入字符向量必须与rosmsg列表中列出的字符向量完全匹配。

ackermann_msgs
actionlib
actionlib_msgs
actionlib_tutorials
adhoc_communication
app_manager
applanix_msgs
ar_track_alvar
arbotix_msgs
ardrone_autonomy
asmach_tutorials
audio_common_msgs
axis_camera
base_local_planner
baxter_core_msgs
baxter_maintenance_msgs
bayesian_belief_networks
blob
bond
brics_actuator
bride_tutorials
bwi_planning
bwi_planning_common
calibration_msgs
capabilities
clearpath_base
cmvision
cob_base_drive_chain
cob_camera_sensors
cob_footprint_observer
cob_grasp_generation
cob_kinematics
cob_light
cob_lookat_action
cob_object_detection_msgs
cob_perception_msgs
cob_phidgets
cob_pick_place_action
cob_relayboard
cob_script_server
cob_sound
cob_srvs
cob_trajectory_controller
concert_msgs
control_msgs
control_toolbox
controller_manager_msgs
costmap_2d
create_node
data_vis_msgs
designator_integration_msgs
diagnostic_msgs
dna_extraction_msgs
driver_base
dynamic_reconfigure
dynamic_tf_publisher
dynamixel_controllers
dynamixel_msgs
epos_driver
ethercat_hardware
ethercat_trigger_controllers
ethzasl_icp_mapper
explorer
face_detector
fingertip_pressure
frontier_exploration
gateway_msgs
gazebo_msgs
geographic_msgs
geometry_msgs
gps_common
graft
graph_msgs
grasp_stability_msgs
grasping_msgs
grizzly_msgs
handle_detector
hector_mapping
hector_nav_msgs
hector_uav_msgs
hector_worldmodel_msgs
household_objects_database_msgs
hrpsys_gazebo_msgs
humanoid_nav_msgs
iai_content_msgs
iai_kinematics_msgs
iai_pancake_perception_action
image_cb_detector
image_exposure_msgs
image_view2
industrial_msgs
interaction_cursor_msgs
interactive_marker_proxy
interval_intersection
jaco_msgs
joint_states_settler
jsk_footstep_controller
jsk_footstep_msgs
jsk_gui_msgs
jsk_hark_msgs
jsk_network_tools
jsk_pcl_ros
jsk_perception
jsk_rviz_plugins
jsk_topic_tools
keyboard
kingfisher_msgs
kobuki_msgs
kobuki_testsuite
laser_assembler
laser_cb_detector
leap_motion
linux_hardware
lizi
manipulation_msgs
map_merger
map_msgs
map_store
mavros
microstrain_3dmgx2_imu
ml_classifiers
mln_robosherlock_msgs
mongodb_store
mongodb_store_msgs
monocam_settler
move_base_msgs
moveit_msgs
moveit_simple_grasps
multimaster_msgs_fkie
multisense_ros
nao_interaction_msgs
nao_msgs
nav_msgs
nav2d_msgs
nav2d_navigator
nav2d_operator
navfn
network_monitor_udp
nmea_msgs
nodelet
object_recognition_msgs
octomap_msgs
p2os_driver
pano_ros
pcl_msgs
pcl_ros
pddl_msgs
people_msgs
play_motion_msgs
polled_camera
posedetection_msgs
pr2_calibration_launch
pr2_common_action_msgs
pr2_controllers_msgs
pr2_gazebo_plugins
pr2_gripper_sensor_msgs
pr2_mechanism_controllers
pr2_mechanism_msgs
pr2_msgs
pr2_power_board
pr2_precise_trajectory
pr2_self_test_msgs
pr2_tilt_laser_interface
program_queue
ptu_control
qt_tutorials
r2_msgs
razer_hydra
rmp_msgs
robot_mechanism_controllers
robot_pose_ekf
roboteq_msgs
robotnik_msgs
rocon_app_manager_msgs
rocon_service_pair_msgs
rocon_std_msgs
rosapi
rosauth
rosbridge_library
roscpp
roscpp_tutorials
roseus
rosgraph_msgs
rospy_message_converter
rospy_tutorials
rosruby_tutorials
rosserial_arduino
rosserial_msgs
rovio_shared
rtt_ros_msgs
s3000_laser
saphari_msgs
scanning_table_msgs
scheduler_msgs
schunk_sdh
segbot_gui
segbot_sensors
segbot_simulation_apps
segway_rmp
sensor_msgs
shape_msgs
shared_serial
sherlock_sim_msgs
simple_robot_control
smach_msgs
sound_play
speech_recognition_msgs
sr_edc_ethercat_drivers
sr_robot_msgs
sr_ronex_msgs
sr_utilities
statistics_msgs
std_msgs
std_srvs
stdr_msgs
stereo_msgs
stereo_wall_detection
tf
tf2_msgs
theora_image_transport
topic_proxy
topic_tools
trajectory_msgs
turtle_actionlib
turtlebot_actions
turtlebot_calibration
turtlebot_msgs
turtlesim
um6
underwater_sensor_msgs
universal_teleop
uuid_msgs
velodyne_msgs
view_controller_msgs
visp_camera_calibration
visp_hand2eye_calibration
visp_tracker
visualization_msgs
wfov_camera_msgs
wge100_camera
wifi_ddwrt
wireless_msgs
yocs_msgs
zeroconf_msgs

6. Message中的队列

在ROS中有一些复杂的消息中可以包含其他的消息,并形成消息数组。例如在exampleHelperROSCreateSampleNetwork例子中,变量tf包含一个消息,这个消息的主要作用是坐标转换的tf/tfMessage类型。通过输入tf我们可以看到

tf

tf = struct with fields:
MessageType: ‘tf/tfMessage’
Transforms: [1x53 struct]

tf有两个字段:MessageType包含一个标准数据数组,而Transforms包含一个对象数组。在Transforms中存储了53条消息,它们都具有相同的结构。在Transforms中展开tf以查看结构:

…详情请参照古月居

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java Web】002 -- JS Vue快速入门

目录 一、JS快速入门 1、什么是JavaScript? 2、JS引入方式 ①、示例代码 3、JS基础语法 ①、书写语法 ②、变量 ③、数据类型 ④、运算符 ⑤、流程控制语句 4、JS函数 ①、第一种函数定义方式 function funcName(参数1,……) ②、第二种函数定义方式 var funcName …

Chatgpt4来了,测试小姐姐实测,在失业的边缘疯狂试探~

GPT-4是OpenAI于2023年3月发布的最新人工智能模型,它是继GPT-3.5之后的又一次重大突破。它的核心技术是基于Transformer的自回归语言模型,它使用了大量的无标注数据进行预训练,学习了自然语言和其他模态之间的通用表示和关系。我们今天来看看…

★Flash

1.NOR Flash和NAND Flash的区别 读速:Nor很快,NAND快 擦除/写入:Nor低,NAND高 访问方式:Nor一次写一个字节,按总线时序读写;NAND一次写多个(512字节的块),…

【2023中高级向】53道vue面试题附答案

1. 谈一谈对 MVVM 的理解? 参考答案: MVVM 是 Model-View-ViewModel 的缩写。MVVM 是一种设计思想。Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑;View 代表 UI 组件,它负责将数据模型转化成 UI 展现出来…

Spring MVC 图片的上传和下载

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

Graph Neural Networks: Graph Structure Learning

最近研究GNN的应用方面,遇到了很大的瓶颈,所以回归理论,潜心阅读图结构学习的理论知识,也希望给大家在学习时带来帮助,如有错误请私信指正! Graph Neural Networks: Graph Structure Learning 摘要&#…

Day912.多环境配置隔离 -SpringBoot与K8s云原生微服务实践

多环境配置隔离 Hi,我是阿昌,今天学习记录的是关于多环境配置隔离的内容。 多环境支持,是现在互联网开发研发和交付的主流基本需求。通过规范多环境配置可以规范开发流程,并同时提示项目的开发质量和效率等。 一个公司应该规范…

计算机组成原理实验1---运算器 预习报告

本实验为哈尔滨工业大学计算机组成原理实验,实验内容均为个人完成,目的是分享交流,如有抄袭将追究责任,笔者能力有限,若因此影响读者的分数,本人深表抱歉。 一、 实验目的 了解运算器的组成结构基于数据通…

mybatis resource配置mapper

<mapper resource"com/hm/mapper/UserMapper.xml"/> 这种配置mapper和package配置资源的区别&#xff1f; 1.package解析mapper过程&#xff0c; 获取name对应的路径&#xff0c;获取class下的mapper,根据mapper里的路径拼接.xml解析文件&#xff0c;此时命名…

亚马逊、eBay、速卖通等跨境电商自养号测评,你知道多少?

自养号测评对跨境电商来说已经司空见惯&#xff0c;现在绝大部分卖家都有对店铺产品进行测评&#xff0c;虽然平台和消费者对测评补单很反感&#xff0c;但是在人人都测评的大环境的影响下不测评就意味着要被淘汰。 之前在一些论坛看到有博主分享自己对于广告和数据化的理解&a…

基于SpringBoot+Vue家乡特色推荐系统

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

6.S081——虚拟内存部分——xv6源码阅读系列(1)

0.Briefly Speaking 这篇博客是完成6.S081第三个实验之前的准备环节&#xff0c;主要内容是阅读相关的源码。之前提过xv6最宝贵的部分是内核源码&#xff0c;这些是完成实验之前必备的基础&#xff0c;也是学习这门课的精髓所在&#xff0c;所以我准备再开一个系列博客专门用来…

golang大杀器GMP模型

golang 大杀器——GMP模型 文章目录golang 大杀器——GMP模型1. 发展过程2. GMP模型设计思想2.1 GMP模型2.2 调度器的设计策略2.2.1 复用线程2.2.2 利用并行2.2.3 抢占策略2.2.4 全局G队列2.3 go func()经历了那些过程2.4 调度器的生命周期2.5 可视化的CMP编程2.5.1 trace方式2…

【设计模式】创建型模式之原型模式

【设计模式】创建型模式之原型模式 文章目录【设计模式】创建型模式之原型模式1.概述2. 构成3. 实现3.1 浅克隆3.2 深克隆1.概述 原型模式(Prototype Pattern)&#xff1a;是用于创建重复的对象&#xff0c;同时又能保证性能。这种类型的设计模式属于创建型模式&#xff0c;它…

【人工智能里的数学】线性代数基础

系列文章目录 【人工智能学习笔记】人工智能里的数学——概述 【人工智能里的数学】一元函数微分学 文章目录系列文章目录前言一、向量与其运算1.2 行向量和列向量1.3 向量的运算1.3.1 向量的加减1.3.2 向量的数乘运算1.3.3 转置1.3.4 运算法则1.3.5 向量的内积1.4 向量的范数…

今年面试好激烈!

金三银四过去一半&#xff0c;市场火热&#xff0c;但是大家就业压力却没有缓解多少。 很多粉丝后台留言&#xff0c;Java程序员面临的竞争太激烈了…… 我自己也有实感&#xff0c;多年身处一线互联网公司&#xff0c;虽没有直面过求职跳槽的残酷&#xff0c;但经常担任技术面…

记一次Git未Commit直接Pull导致本地代码丢失后的挽救过程

第一次遇到这种问题&#xff0c;有点紧张... 好吧&#xff0c;废话不多说&#xff0c;IDEA或者AndroidStudio进入Git Uncommiteed Changes -> Unstash Changes&#xff1a; 在弹出的Unstash Changes对话框点View查看代码&#xff0c;如果代码是本地丢失的代码&#xff0c;那…

MySQL——distinct与group by去重 / 松散索引扫描紧凑索引扫描

本篇介绍MySQL中的 distinct 和 group by的区别&#xff0c;包括用法、效率&#xff0c;涉及松散索引扫描和紧凑索引扫描的概念&#xff1b;distinct用法示例&#xff1a;SELECT DISTINCT columns FROM table_name WHERE where_conditions;DISTINCT关键词修饰查询的列&#xff…

CVE-2023-28708 原理剖析

CVE-2023-28708 原理剖析这应该不是一个严重的漏洞&#xff0c;可能评分只能为低&#xff0c;因为并没有什么卵用。 话不多说&#xff0c;直接进入正题 我的复现环境&#xff1a; tomcat-8.5.50 首先我们得简单写一个servlet&#xff0c;当然不写也没事&#xff0c;因为我们的…

【C语言学习】结构体

结构体&#xff08;Struct&#xff09;从本质上讲是一种自定义的数据类型&#xff0c;只不过这种数据类型比较复杂&#xff0c;是由 int、char、float 等基本类型组成的。你可以认为结构体是一种聚合类型。 在实际开发中&#xff0c;我们可以将一组类型不同的、但是用来描述同…