posedata = receive(posesub,10)
然后使用 MATLAB 的保存功能将姿势数据保存到 MAT 文件中。
save('posedata.mat','posedata')
在将文件加载回工作区之前清除 posedata 变量。
clear posedata
现在可以通过调用加载函数来加载消息数据。 这会将上面的姿势数据加载到 messageData 结构中。 Posedata是结构体的一个数据域。
messageData = load('posedata.mat')
messageData = struct with fields:
posedata: [1x1 struct]
检查消息数据。 Posedata查看消息内容。
messageData.posedata
ans = struct with fields:
MessageType: ‘geometry_msgs/Twist’
Linear: [1x1 struct]
Angular: [1x1 struct]
然后可以删除 MAT 文件
delete('posedata.mat')
5.消息数据转换
由于在 Matlab 中,ROS 消息的每个元素都是独立的,因此无法验证具有多个值在数学上是否有效。 因为每个值都可以单独设置,所以消息不会将属性作为一个整体进行验证。
例如,一个四元数消息包含 w、x、y 和 z 属性,但该消息并不强制四元数作为一个整体是有效的。 所以有可能单独修改一个四元数信息后,这个四元数不符合模型。
同时,消息属性也可以有多种数据类型。 MATLAB 使用 ROS 设置的规则来确定这些数据类型。
为此,这些数据类型必须映射到 MATLAB 数据类型才能在 MATLAB 中使用。 下表总结了 ROS 数据类型如何转换为 MATLAB 数据类型。
同时,Matlab也自带了一些常用的msg包matlab全局变量怎么定义,里面包含了常用的消息类型、服务类型或者操作类型。 可以在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.消息队列
在 ROS 中有一些复杂的消息可以包含其他消息并形成一个消息数组。
比如exampleHelperROSCreateSampleNetwork例子中,变量tf中包含了一条消息,这条消息的主要作用是坐标转换的tf/tfMessage类型。通过输入tf我们可以看到
tf
tf = struct with fields:
MessageType: ‘tf/tfMessage’
Transforms: [1x53 struct]
tf 有两个字段:MessageType 包含一个标准数据数组,Transforms 包含一个对象数组。
Transforms 中存储了 53 条消息matlab全局变量怎么定义,它们都具有相同的结构。 展开 Transforms 中的 tf 可以看到结构:
tf.Transforms
ans=1×53 struct array with fields:
MessageType
Header
ChildFrameId
Transform
Transforms 中的每个对象都有四个属性。
您可以展开以查看 Transforms 的 Transform 字段。下面的命令返回 53 个单独的输出,因为每个对象都被评估并返回其 Transform 字段的值
% tformFields = tf.Transforms.Transform
cellTransforms = {tf.Transforms.Transform}
这会将所有 53 个对象条目放入元胞数组中,以便可以使用与标准 MATLAB 向量相同的方式访问数组元素:
tf.Transforms(5)
ans = struct with fields:
MessageType: ‘geometry_msgs/TransformStamped’
Header: [1x1 struct]
ChildFrameId: ‘/imu_link’
Transform: [1x1 struct]
要访问有关 53 个转换列表中第五个转换的信息:
tf.Transforms(5).Transform.Translation
ans = struct with fields:
MessageType: ‘geometry_msgs/Vector3’
X: 0.0599
Y: 0
Z: -0.0141
7. 机器人中的特殊消息类型
7.1 图片信息
MATLAB 提供对图像消息的支持,其消息类型始终为 sensor_msgs/Image。
使用 rosmessage 创建一个空图像消息,以查看图像消息的标准 ROS 格式。
emptyimg = rosmessage("sensor_msgs/Image",DataFormat="struct")
emptyimg = struct with fields:
MessageType: ‘sensor_msgs/Image’
Header: [1x1 struct]
Height: 0
Width: 0
Encoding: ‘’
IsBigendian: 0
Step: 0
Data: [0x1 uint8]
为方便起见,从 specialROSMessageData.mat 加载完全填充的图像消息并将其存储在 img 变量中。
检查工作区中的图像消息变量 img。 图像的大小存储在 Width 和 Height 属性中。 ROS 使用数据属性中的向量发送实际图像数据。
load("specialROSMessageData.mat")
img
img = struct with fields:
MessageType: ‘sensor_msgs/Image’
Header: [1x1 struct]
Height: 480
Width: 640
Encoding: ‘rgb8’
IsBigendian: 0
Step: 1920
Data: [921600x1 uint8]
Data 属性存储不能在 MATLAB 中直接用于处理和可视化的原始图像数据。
可以使用rosReadImage函数以与MATLAB兼容的格式检索图像。然后通过imshow显示它
imageFormatted = rosReadImage(img);
imshow(imageFormatted)
7.2 点云信息
点云可以被机器人技术中使用的各种传感器捕获,包括 LiDAR、Kinect® 和立体相机。
ROS中最常见的用于传输点云的消息类型是sensor_msgs/PointCloud2,MATLAB提供了一些专门的函数来处理这些数据。具体步骤与图片类似
emptyptcloud = rosmessage("sensor_msgs/PointCloud2",DataFormat="struct")
% xyz = rosReadXYZ(ptcloud)% 通过调用rosReadXYZ函数,可以将x、y、z坐标提取为N乘3矩阵。
% xyzValid = xyz(~isnan(xyz(:,1)),:)%可以安全地删除所有NaN值
rgb = rosReadRGB(ptcloud)
rosPlot(ptcloud)
使用 rosReadAllFieldNames 函数检查存储在点云消息中的所有字段。 加载的点云消息包含四个字段 x、y、z 和 rgb。
fieldNames = rosReadAllFieldNames(ptcloud)
fieldNames = 1×4 单元格
{'x'} {'y'} {'z'} {'rgb'}
7.3 占用网格图信息
ROS 使用 Octomap 消息实现 3D 占用网格。 八叉树地图信息通常用于机器人应用程序,例如 3D 导航。
可以通过创建一个合适类型的空消息来查看标准ROS格式的octomap消息。具体步骤和图片类似
emptyoctomap = rosmessage("octomap_msgs/Octomap",DataFormat="struct")
occupancyMap3DObj = rosReadOccupancyMap3D(octomap);
show(occupancyMap3DObj)
参考链接: