1. 程式人生 > >matlab簡單介面ros通訊

matlab簡單介面ros通訊

MatLab有非常便捷的視覺化程式設計,我們可以藉助Matlab來製作一些小的視覺化工具,我們在之前的部落格中,使用rviz的外掛功能實現過一個速度控制的小工具,今天就來探索研究如何用Matlab來實現類似的工具。

本文使用的完整程式碼可見:github

一、瞭解Matlab的視覺化程式設計

Matlab的視覺化程式設計非常簡單,首先在命令視窗中輸入“guide”命令來啟動視覺化程式設計:

Image

然後選擇預設的空視窗,點選“OK”,然後會出現如下的視覺化編輯介面:

Image

在這個介面中,我們可以從左邊的控制元件列表中選擇建立按鈕、編輯框等控制元件:

Image

建立控制元件後就可以編輯該控制元件的回撥函式,從而實現該控制元件的對應功能。

二、建立介面

瞭解了上邊建立控制元件的基礎知識,我們接下來就來動手做一個速度控制的介面。

首先從左側控制元件列表中選擇一個“Edit Text”控制元件,然後在主視窗中點選並拖動滑鼠來繪製控制元件的位置。

Image

現在控制元件的命名和預設內容不是我們想要的,雙擊控制元件,可以修改相應的屬性。

Image

這個輸入控制元件是用來輸入ROS_MASTER_URI的,同樣的方法,我們再來建立一個輸入框,用來輸入topic name:

 Image

接下來,我們需要建立一些按鍵,並且編輯按鍵的屬性,最終的介面如下:

 Image

三、編輯控制元件回撥函式

介面我們已經設計完成了,接下來我們來編輯每個控制元件的功能,即回撥函式。儲存目前設計的介面,命名為myTeleop,在儲存路徑下,我們可以看到出現了一個.fig檔案和一個.m檔案,前者是介面設計,上一節已經實現,後者是這一節將要編輯的程式碼檔案。在上一篇中我們已經講到了Matlab中可用的一些ROS介面,這裡的核心程式碼基本還上一篇類似,忘記的同學可以參考上一篇。

1.設計全域性變數

考慮到該工具所應用的一些功能,我們首先在程式碼宣告一些全域性變數,方便不同回撥函式的使用。

  1. % 宣告一些全域性變數
  2. % ROS Master URI和Topic name
  3. global rosMasterUri
  4. global teleopTopicName
  5. rosMasterUri = 'http://192.168.1.202:11311';
  6. teleopTopicName = '/cmd_vel';
  7. % 機器人的執行速度
  8. global leftVelocity
  9. global rightVelocity
  10. global forwardVelocity
  11. global backwardVelocity
  12. leftVelocity = 2;        % 角速度 (rad/s)
  13. rightVelocity = -2;      % 角速度 (rad/s)
  14. forwardVelocity = 2;     % 線速度 (m/s)
  15. backwardVelocity = -2;   % 線速度 (m/s)

2.URI輸入框和Topic name輸入框

兩個輸入分別對應ROS_MASTER_URI和Topic name,在輸入之後,我們需要將輸入的字串儲存到全域性變數當中,所對應的回撥函式如下:

  1. % 設定ROS Master URI
  2. function URIEdit_Callback(hObject, eventdata, handles)
  3. global rosMasterUri
  4. rosMasterUri = get(hObject,'String')
  5. % 設定Topic name
  6. function TopicEdit_Callback(hObject, eventdata, handles)
  7. global teleopTopicName
  8. teleopTopicName = get(hObject,'String')

3.建立連線和斷開連線的按鍵

建立連線的按鍵在點選之後需要初始化Matlab中的ros環境,並且和ROS master建立連線,還需要初始化速度指令的釋出者。

斷開連線的按鍵在點選之後關閉Matlab中的ROS即可。

  1. % 建立連線並初始化ROS publisher
  2. function ConnectButton_Callback(hObject, eventdata, handles)
  3. global rosMasterUri
  4. global teleopTopicName
  5. global robot
  6. global velmsg
  7. setenv('ROS_MASTER_URI',rosMasterUri)
  8. rosinit
  9. robot = rospublisher(teleopTopicName,'geometry_msgs/Twist');
  10. velmsg = rosmessage(robot);
  11. % 斷開連線,關閉ROS
  12. function DisconnectButton_Callback(hObject, eventdata, handles)
  13. rosshutdown

4.運動控制按鍵

最後是四個控制前後左右的按鍵,按下對應的按鍵,就會發布相應的運動指令。

  1. % 向前
  2. function ForwardButton_Callback(hObject, eventdata, handles)
  3. global velmsg
  4. global robot
  5. global teleopTopicName
  6. global forwardVelocity
  7. velmsg.Angular.Z = 0;
  8. velmsg.Linear.X = forwardVelocity;
  9. send(robot,velmsg);
  10. latchpub = rospublisher(teleopTopicName, 'IsLatching', true);
  11. %向左
  12. function LeftButton_Callback(hObject, eventdata, handles)
  13. global velmsg
  14. global robot
  15. global teleopTopicName
  16. global leftVelocity
  17. velmsg.Angular.Z = leftVelocity;
  18. velmsg.Linear.X = 0;
  19. send(robot,velmsg);
  20. latchpub = rospublisher(teleopTopicName, 'IsLatching', true);
  21. % 向右
  22. function RightButton_Callback(hObject, eventdata, handles)
  23. global velmsg
  24. global robot
  25. global teleopTopicName
  26. global rightVelocity
  27. velmsg.Angular.Z = rightVelocity;
  28. velmsg.Linear.X = 0;
  29. send(robot,velmsg);
  30. latchpub = rospublisher(teleopTopicName, 'IsLatching', true);
  31. % 向後
  32. function BackwardButton_Callback(hObject, eventdata, handles)
  33. global velmsg
  34. global robot
  35. global teleopTopicName
  36. global backwardVelocity
  37. velmsg.Angular.Z = 0;
  38. velmsg.Linear.X = backwardVelocity;
  39. send(robot,velmsg);
  40. latchpub = rospublisher(teleopTopicName, 'IsLatching', true);

四、執行效果

OK,到此為止,我們已經在Matlab中實現了速度控制外掛的介面和程式碼,接下來就可以執行看效果了。

這裡以小海龜的模擬作為控制物件,在ubuntu中執行ROS,並且檢視ROS_MASTER_URI,然後執行小海龜模擬器。

Image

然後在matlab中執行我們剛才實現的速度控制工具,並且在輸入框中輸入對應的資訊。

Image

接著點選“建立連線”,如果一切正常的話,可以在Matlab的命令視窗中看到如下資訊:

Image

這樣就可以開始控制了,我們點選前、後、左、右的按鍵(點選之後要放開滑鼠),可以看到小海龜確實可以按照我們的指令運動。

Image

這樣,我們就使用Matlab的視覺化程式設計介面實現了一個ROS速度控制的小工具,更多功能和應用還等待我們繼續探索。