ROS初探

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, subscribersservers,並且定義要傳遞的messages
     3. 通過'rosnode list''rostopic list''rosservice list'命令來分別查看所有nodestopicsservices

查看ROS node, topicservicemessage的具體信息
     1. 使用'resnode info /node''resnode info /topic''resnode info /sevice'命令查看某個nodetopicservice的具體信息。
     2. 通過'rostopic type ...''rosmsg show ...'等系列命令可以查看messages中所含的具體信息。

關閉ROS network
     先從network移除nodespublisherssubscribers,然後調用'rosshutdown'命令關閉ROS



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章