ROS初探
ROS(Robot Operating System) 相关术语
ROS:让机器人和计算机进行交互的操作系统。
ROS network: 由一个通过ROS通讯的机器人系统的不同部分组成。
ROS master: 协调ROS网络中的不同部分。它由运行服务器的主机名或IP地址唯一标识。
ROS node: 包含一系列的ROS功能(publishers, subscribers,services), 一个ROS网络可以有很多节点
Publishers, subscribers和services是不同的处理数据的ROS实体对象,它们通过消息(messages)交换数据。
Ros publishers和subscribes之间的数据交换
一个publisher发送messages给一个特定的topic(比如”odometry”),这个topic对应的subscribers接收到这些messages。与一个topic相关的publishers和subscribers可以有多个。
数据结构(data structure)
设置消息数据:
twist = rosmessage(rostype.geometry_msgs_Twist);
twist.Linear.Y = 5;
复制消息:
1)reference copy(参考复制)
twistCopyRef = twist
修改twistCopyRef,twist也跟着改变。
2)deep copy(深度复制)
twistCopyDeep = copy(twist)
修改twistCopyRef,twist不跟着改变。
保存和下载消息:
posedata = receive(posesub,10);
save('posedata.mat','posedata')
clear posedata;
messageData = load('posedata.mat');
messageData.posedata
消息中的对象数组(Object Arrays in Messages):
来自ROS的消息被存储在对象数组中,同一种消息类型(type),多个对象,相同的特征
发布器(Publisher)
创建一个发送字符串消息到 /chatter topic的发布器
rosinit
exampleHelperROSCreateSampleNetwork
chatterpub = rospublisher('/chatter', rostype.std_msgs_String) %添加一个发布器,将消息发给‘chatter’这一topic
pause(2) % 等待发布器被注册
chattermsg = rosmessage(chatterpub);
chattermsg.Data = 'hello world'
chattersub = rossubscriber('/chatter', @exampleHelperROSChatterCallback) % 与‘chatter’这一topic相关的订阅器接收消息,并调 用exampleHelperROSChatter这一回调函数
send(chatterpub,chattermsg) %把消息传给发布器
pause(2)
exampleHelperROSShutDownSampleNetwork
rosshutdown
订阅器(Subscriber)
普通订阅和等待消息
rosinit
exampleHelperROSCreateSampleNetwork
laser = rossubscriber('/scan')
scandata = receive(laser,10)
当订阅器在等待新的消息的时候,不能执行其他的MATLAB程序。
用回调函数订阅消息
robotpose = rossubscriber('/pose',@exampleHelperROSPoseCallback)
global pos %使用全局参量是回调函数和工作空间分享数据的一种方式
global orient
pause(2)
pos
orient
clear robotpose
定义一个回调函数(callback function),当一个新的消息被接受时就调用它,当订阅器等 待消息时,允许执行其他MATLAB程序。当使用多个订阅器时,使用回调函数是必要的。
ROS服务(Services)
ROS的两种主要通信机制:Topics&Services
服务: 更加紧密耦合的请求-应答的通信方式,服务客户端发送一个请求信号给服务服务器,等待应答。
服务的特点:
1)服务请求被用在一对一的通信中,一个节点初始化请求,有且只有一个节点将接收到请求并且发出应答。
2)当产生一个服务请求时,服务客户端和服务服务器是紧密耦合的。请求发出时服务器必须存在,一旦请求被发出,客户端将屏蔽直至收到应答。
创建一个服务服务器
rosinit; exampleHelperROSCreateSampleNetwork;
testserver = rossvcserver('/test', rostype.std_srvs_Empty, @exampleHelperROSEmptyCallback)
创建一个服务客户端
testclient = rossvcclient('/test');
testreq = rosmessage(testclient); % 为服务创建一个请求信息
testresp = call(testclient,testreq,'Timeout',3); % 呼叫服务器返回一个应答信息
创建一个两数相加的服务
sumserver = rossvcserver('/sum', rostype.roscpp_tutorials_TwoInts, @exampleHelperROSSumCallback);
sumclient = rossvcclient('/sum');
sumreq = rosmessage(sumclient);
sumreq.A = 2;
sumreq.B = 1;
sumresp = call(sumclient,sumreq,'Timeout',3)
ROS简单使用方法介绍
在MATLAB中配置ROS
1. 初始化ROS network:使用'rosinit'语句创建一个ROS master,并创建一个与master相连的全局节点(global node)。
2. 通过编写代码,添加nodes,然后自定义它的publishers, subscribers和servers,并且定义要传递的messages。
3. 通过'rosnode list','rostopic list','rosservice list'命令来分别查看所有nodes,topics和services。
查看ROS node, topic,service和message的具体信息
1. 使用'resnode info /node','resnode info /topic','resnode info /sevice'命令查看某个node,topic或service的具体信息。
2. 通过'rostopic type ...','rosmsg show ...'等系列命令可以查看messages中所含的具体信息。
关闭ROS network
先从network移除nodes,publishers,subscribers,然后调用'rosshutdown'命令关闭ROS。