ROS初探
ROS(Robot Operating System) 相關術語
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);
複製消息:
1)reference copy(參考複製)
twistCopyRef = twist
2)deep copy(深度複製)
twistCopyDeep = copy(twist)
修改twistCopyRef,twist不跟着改變。
保存和下載消息:
posedata = receive(posesub,10);
clear posedata;
消息中的對象數組(Object Arrays in Messages):
來自ROS的消息被存儲在對象數組中,同一種消息類型(type),多個對象,相同的特徵
發佈器(Publisher)
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)
服務: 更加緊密耦合的請求-應答的通信方式,服務客戶端發送一個請求信號給服務服務器,等待應答。
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。