matlab簡單介面ros通訊
MatLab有非常便捷的視覺化程式設計,我們可以藉助Matlab來製作一些小的視覺化工具,我們在之前的部落格中,使用rviz的外掛功能實現過一個速度控制的小工具,今天就來探索研究如何用Matlab來實現類似的工具。
本文使用的完整程式碼可見:github
一、瞭解Matlab的視覺化程式設計
Matlab的視覺化程式設計非常簡單,首先在命令視窗中輸入“guide”命令來啟動視覺化程式設計:
然後選擇預設的空視窗,點選“OK”,然後會出現如下的視覺化編輯介面:
在這個介面中,我們可以從左邊的控制元件列表中選擇建立按鈕、編輯框等控制元件:
建立控制元件後就可以編輯該控制元件的回撥函式,從而實現該控制元件的對應功能。
二、建立介面
瞭解了上邊建立控制元件的基礎知識,我們接下來就來動手做一個速度控制的介面。
首先從左側控制元件列表中選擇一個“Edit Text”控制元件,然後在主視窗中點選並拖動滑鼠來繪製控制元件的位置。
現在控制元件的命名和預設內容不是我們想要的,雙擊控制元件,可以修改相應的屬性。
這個輸入控制元件是用來輸入ROS_MASTER_URI的,同樣的方法,我們再來建立一個輸入框,用來輸入topic name:
接下來,我們需要建立一些按鍵,並且編輯按鍵的屬性,最終的介面如下:
三、編輯控制元件回撥函式
介面我們已經設計完成了,接下來我們來編輯每個控制元件的功能,即回撥函式。儲存目前設計的介面,命名為myTeleop,在儲存路徑下,我們可以看到出現了一個.fig檔案和一個.m檔案,前者是介面設計,上一節已經實現,後者是這一節將要編輯的程式碼檔案。在上一篇中我們已經講到了Matlab中可用的一些ROS介面,這裡的核心程式碼基本還上一篇類似,忘記的同學可以參考上一篇。
1.設計全域性變數
考慮到該工具所應用的一些功能,我們首先在程式碼宣告一些全域性變數,方便不同回撥函式的使用。
-
% 宣告一些全域性變數
-
% ROS Master URI和Topic name
-
global rosMasterUri
-
global teleopTopicName
-
rosMasterUri = 'http://192.168.1.202:11311';
-
teleopTopicName = '/cmd_vel';
-
% 機器人的執行速度
-
global leftVelocity
-
global rightVelocity
-
global forwardVelocity
-
global backwardVelocity
-
leftVelocity = 2; % 角速度 (rad/s)
-
rightVelocity = -2; % 角速度 (rad/s)
-
forwardVelocity = 2; % 線速度 (m/s)
-
backwardVelocity = -2; % 線速度 (m/s)
2.URI輸入框和Topic name輸入框
兩個輸入分別對應ROS_MASTER_URI和Topic name,在輸入之後,我們需要將輸入的字串儲存到全域性變數當中,所對應的回撥函式如下:
-
% 設定ROS Master URI
-
function URIEdit_Callback(hObject, eventdata, handles)
-
global rosMasterUri
-
rosMasterUri = get(hObject,'String')
-
% 設定Topic name
-
function TopicEdit_Callback(hObject, eventdata, handles)
-
global teleopTopicName
-
teleopTopicName = get(hObject,'String')
3.建立連線和斷開連線的按鍵
建立連線的按鍵在點選之後需要初始化Matlab中的ros環境,並且和ROS master建立連線,還需要初始化速度指令的釋出者。
斷開連線的按鍵在點選之後關閉Matlab中的ROS即可。
-
% 建立連線並初始化ROS publisher
-
function ConnectButton_Callback(hObject, eventdata, handles)
-
global rosMasterUri
-
global teleopTopicName
-
global robot
-
global velmsg
-
setenv('ROS_MASTER_URI',rosMasterUri)
-
rosinit
-
robot = rospublisher(teleopTopicName,'geometry_msgs/Twist');
-
velmsg = rosmessage(robot);
-
% 斷開連線,關閉ROS
-
function DisconnectButton_Callback(hObject, eventdata, handles)
-
rosshutdown
4.運動控制按鍵
最後是四個控制前後左右的按鍵,按下對應的按鍵,就會發布相應的運動指令。
-
% 向前
-
function ForwardButton_Callback(hObject, eventdata, handles)
-
global velmsg
-
global robot
-
global teleopTopicName
-
global forwardVelocity
-
velmsg.Angular.Z = 0;
-
velmsg.Linear.X = forwardVelocity;
-
send(robot,velmsg);
-
latchpub = rospublisher(teleopTopicName, 'IsLatching', true);
-
%向左
-
function LeftButton_Callback(hObject, eventdata, handles)
-
global velmsg
-
global robot
-
global teleopTopicName
-
global leftVelocity
-
velmsg.Angular.Z = leftVelocity;
-
velmsg.Linear.X = 0;
-
send(robot,velmsg);
-
latchpub = rospublisher(teleopTopicName, 'IsLatching', true);
-
% 向右
-
function RightButton_Callback(hObject, eventdata, handles)
-
global velmsg
-
global robot
-
global teleopTopicName
-
global rightVelocity
-
velmsg.Angular.Z = rightVelocity;
-
velmsg.Linear.X = 0;
-
send(robot,velmsg);
-
latchpub = rospublisher(teleopTopicName, 'IsLatching', true);
-
% 向後
-
function BackwardButton_Callback(hObject, eventdata, handles)
-
global velmsg
-
global robot
-
global teleopTopicName
-
global backwardVelocity
-
velmsg.Angular.Z = 0;
-
velmsg.Linear.X = backwardVelocity;
-
send(robot,velmsg);
-
latchpub = rospublisher(teleopTopicName, 'IsLatching', true);
四、執行效果
OK,到此為止,我們已經在Matlab中實現了速度控制外掛的介面和程式碼,接下來就可以執行看效果了。
這裡以小海龜的模擬作為控制物件,在ubuntu中執行ROS,並且檢視ROS_MASTER_URI,然後執行小海龜模擬器。
然後在matlab中執行我們剛才實現的速度控制工具,並且在輸入框中輸入對應的資訊。
接著點選“建立連線”,如果一切正常的話,可以在Matlab的命令視窗中看到如下資訊:
這樣就可以開始控制了,我們點選前、後、左、右的按鍵(點選之後要放開滑鼠),可以看到小海龜確實可以按照我們的指令運動。
這樣,我們就使用Matlab的視覺化程式設計介面實現了一個ROS速度控制的小工具,更多功能和應用還等待我們繼續探索。