ROS与Matlab语言入门教程-开始使用ROS
机器人操作系统(Robot Operating System ROS)是一个能够让机器人系统的不同部分发现、传输和接收数据的通信接口。MATLAB®支持ROS是基于一个函数库,该函数库使得你在MATLAB可以和基于ROS的实际机器人或者仿真机器人如Gazebo®进行数据交换。
ROS术语
- ROS网络有机器人系统的不同部分组成,比如规划器或者摄像头接口,在ROS上进行通信。网络可以分布在多个机器上。
- ROS主控节点负责协调ROS网络的各个部分。通过主控URI(Uniform Resource Identifier)鉴别主控节点,URI指定了主控节点运行的计算机上的宿主名或者IP地址。
- ROS节点是包含着与ROS功能有关的集合的实体,比如发布器、订阅器和服务。一个ROS网络可以包含多个ROS节点。
- 发布器、订阅器和服务是ROS中处理数据的不同实体,它们通过消息交换数据。
- 发布器将消息传送到指定的话题(比如“里程计”),订阅器通过该话题接收消息。允许多个发布器和订阅器共用一个话题。
更多信息,查阅ROS官网:Robot Operating System (ROS)和Concepts。
初始化ROS网络
使用指令“rosinit”初始化ROS。默认情况下, “rosinit” 指令在MATLAB中创建一个ROS主控节点并开始了一个“global node”节点,该节点与主控节点相连。“global node”节点能够自动的被其它ROS函数使用。代码运行示例:
rosinit
Initializing ROS master on http://bat5136glnxa64.mathworks.com:11311/.
Initializing global node /matlab_global_node_8332 with NodeURI http://bat5136glnxa64:58596/
使用指令“rosnode list”查看ROS网络中的所有节点,注意,这里只有由“rosinit”创建的一个全局节点。代码运行示例:
rosnode list
/matlab_global_node_8332
使用指令“exampleHelperROSCreateSampleNetwork”给ROS网络添加三个节点以及采样的发布器和订阅器,代码运行示例:
exampleHelperROSCreateSampleNetwork
再次使用“rosnode list”指令,可以观察到新增加了三个节点(node_1,node_2和node_3),代码运行示例:
rosnode list
/matlab_global_node_8332
/node_1
/node_2
/node_3
当前ROS网络的视觉可视化如图2.1所示,接下来探索该例子过程中,可以结构图为参考。当前MATLAB的全局节点(/matlab_global_node)由于没有任何发布器、订阅器或服务,因此处于离线状态。
话题
使用“rostopic list”指令查看ROS网络中可获得的话题,可以观察到/pose, /rosout, and /scan三个话题。其中,rosout是默认的记录话题,它在ROS网络中总是存在的。另外两个话题作为采样网络而创建。代码运行示例:
rostopic list
/pose
/rosout
/scan
使用“rostopic info”指令获得指定话题的相关信息,下面的指令显示“/node_1”发布“/pose”话题,而“node_2”订阅该话题。代码运行示例:
rostopic info /pose
Type: geometry_msgs/Twist
Publishers:
* /node_1 (http://bat5136glnxa64:51246/)
Subscribers:
* /node_2 (http://bat5136glnxa64:55141/)
使用“rosnode info”指令获得指令节点的信息,下面的指令显示节点“node_1”发布数据到话题“/pose”和“/rosout”,同时订阅了话题“/scan”的数据。代码运行示例:
rosnode info /node_1
Node: [/node_1]
URI: [http://bat5136glnxa64:51246/]
Publications (2 Active Topics):
* /pose
* /rosout
Subscriptions (1 Active Topics):
* /scan
Services (0 Active):
服务
ROS服务提供了ROS网络中的“程序调用”的机制。服务客户端向服务器发送请求信息,服务器处理请求信息并返回响应信息。(查看Calling and Providing ROS Services)
使用“rosservice list”指令查看ROS网络中所有可用的服务。运行下面的指令显示有两个可用的服务(/add和/reply)。
rosservice list
/add
/reply
使用“rosservice info”指令获取指定服务的信息。
rosservice info /add
Node: /node_3
URI: rosrpc://bat5136glnxa64:47000/
Type: roscpp_tutorials/TwoInts
Args: A B
消息
发布器、订阅器和服务使用ROS消息进行信息交换。每个ROS消息拥有一个相关的消息类型,定义了消息中的数据类型和数据结构。(查看 Working with Basic ROS Messages)
使用“rostopic type”指令查看话题使用的消息类型,下面的指令显示了“/pose”话题使用了消息类型为“geometry_msgs/Twist”。代码运行示例:
rostopic type /pose
geometry_msgs/Twist
使用“rosmsg show”指令查看消息类型的属性,“geometry_msgs/Twist”消息类型有两种属性,分别是“Linear”和“Angular”。每个属性是一个“geometry_msgs/Vector3”类型的消息,该类型消息由三个属性为“double”的数据组成。代码运行示例:
rosmsg show geometry_msgs/Twist
% This expresses velocity in free space broken into its Linear and Angular parts.
Vector3 Linear
Vector3 Angular
rosmsg show geometry_msgs/Vector3
% This represents a vector in free space.
double X
double Y
double Z
使用“rosmsg list”指令查看MATLAB中所有可用的消息类型,代码运行示例:
rosmsg list
ackermann_msgs/AckermannDrive
ackermann_msgs/AckermannDriveStamped
actionlib_msgs/GoalID
actionlib_msgs/GoalStatus
actionlib_msgs/GoalStatusArray
adhoc_communication/BroadcastCMgrRobotUpdate
adhoc_communication/BroadcastCMgrRobotUpdateRequest
adhoc_communication/BroadcastCMgrRobotUpdateResponse
adhoc_communication/BroadcastString
adhoc_communication/BroadcastStringRequest
adhoc_communication/BroadcastStringResponse
adhoc_communication/CMgrDimensions
adhoc_communication/CMgrRobotUpdate
adhoc_communication/ChangeMCMembership
adhoc_communication/ChangeMCMembershipRequest
adhoc_communication/ChangeMCMembershipResponse
adhoc_communication/ExpAuction
adhoc_communication/ExpCluster
adhoc_communication/ExpFrontier
adhoc_communication/ExpFrontierElement
adhoc_communication/GetGroupState
adhoc_communication/GetGroupStateRequest
adhoc_communication/GetGroupStateResponse
adhoc_communication/GetNeighbors
adhoc_communication/GetNeighborsRequest
adhoc_communication/GetNeighborsResponse
adhoc_communication/MmControl
adhoc_communication/MmListOfPoints
adhoc_communication/MmMapUpdate
adhoc_communication/MmPoint
...
关闭ROS网络
使用“exampleHelperROSShutDownSampleNetwork”指令从ROS网络中移除采样节点、发布器和订阅器。该指令仅在采样节点已经创建的情况下需要使用。
使用“rosshutdown”指令关闭MATLAB中的ROS网络,该指令关闭了由“rosinit”指令创建的ROS主控节点并删除全局节点。建议你在完成ROS网络相关工作后使用“rosshutdown”指令。运行代码示例:
rosshutdown
Shutting down global node /matlab_global_node_8332 with NodeURI http://bat5136glnxa64:58596/
Shutting down ROS master on http://bat5136glnxa64.mathworks.com:11311/.
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号