ROS與Matlab系列:一個簡單的運動控制
Matlab擁有強大的數據處理、可視化繪圖能力以及眾多成熟的算法函數,非常適合算法開發;在控制系統設計中,Simulink也是普遍使用的設計和仿真工具。而ROS系統,則是一種新的標准化機器人系統軟件框架。通過ROS,你可以使用大量的示例代碼和開源程序輕松地完成機器人編程和控制任務。
如何利用matlat和ROS不同的優勢,協同進行機器人設計與仿真?
如何用matlat程序通過ROS直接控制物理世界中的機器人?
我們進行了初步的嘗試,並在這里把設計過程中遇到的一些問題及解決方案與大家分享!
1. 系統配置
VM虛擬機運行Ubuntu和ROS系統,稱為主機,假設ip地址為192.168.1.101。
Windows主機運行matlab2015以上版本,稱為從機,假設ip地址為192.168.1.100。
2. 虛擬機網絡設置
首先檢查虛擬的網絡設置,設置為“橋接模式”並勾選下面的“復制主機連接狀態”。
windows主機聯網后,DHCP給自動為主機和虛擬機分配ip地址。如果沒有網絡的話,一個簡單的做法是可以通過手機開一個熱點(無需連接internet),主機連上熱點后會自動分配好ip地址。
虛擬機下輸入ifconfig命令,獲取ip地址,比如192.168.1.101。
windows下輸入ipconfig命令,獲取ip地址,比如192.168.1.100。
3. 檢查WINDOWS與Ubuntu網絡是否聯通
Matlab的Robotics System Toolbox與Ubuntu下的ROS通信並工作,首先必須保證WIN主機與UBUNTU主機的網絡可達性。通常我們通過創建局域網,將兩主機置於同一子網內。主機網絡設置好后可通過PING工具檢測網絡可達性。
注意!windows需關閉防火牆
4. 設置ROS環境變量(此處是重點!)
Master以及兩主機間的各node之間的正確通信必須設置相應的環境變量,以保證node能找到master進行注冊等操作,以及node使用正確的地址發布TOPIC和宣告SERVICE。所以需要在沒有運行master的主機設置ROS_MASTER_URI變量,並在兩主機上設置ROS_IP環境變量。
注意這里應使用ROS_IP而非ROS_HOSTNAME,是因為WINDOWS常常不能將計算機名解析成IP地址以致連接失敗。兩台機器都是Linux主機用ROS_HOSTNAME是木有問題的。
ROS_MASTER_URI:若roscore在其他機器上運行,則需要將ROS_MASTER_URI設置為運行roscore主機的ip,node就能以此與master建立連接進行通信及數據交互。
ROS_IP:變量對所運行的主機上的node起作用,node的TOPIC與SERVICE都發布到此地址上。
操作:
在主機上,在~/.bashrc文件中添加:
export ROS_IP=192.168.1.101
保存退出,重開終端,運行master(ROS環境變量腳本已經source):
roscore
運行一個簡單的turtle例程。
rosrun turtlesim turtlesim_node
在從機上,打開mablab,進行環境變量設置。在命令窗口輸入:
setenv('ROS_MASTER_URI','http://192.168.1.101:11311')
setenv('ROS_IP','192.168.1.100')
初始化全局node:
rosinit()
5. 在matlab下操作ROS
文件:testROS.m
在matlab查閱下topic列表
rostopic list
會出現以下顯示
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
在matlab下顯示topic內容
rostopic echo /turtle1/pose
若果出現以下內容,恭喜你!數據已經讀到matlab里了。
X : 5.544444561
Y : 5.544444561
Theta : 0
LinearVelocity : 0
AngularVelocity : 0
---
注意,以上顯示會刷屏,按ctrl+c停止顯示。
查看topic數據類型等信息:
rostopic info /turtle1/cmd_vel
顯示:
Type: geometry_msgs/Twist
Publishers:
Subscribers:
* /turtlesim (http://192.168.1.101:37723/)
接下來我們嘗試下在matlab里發送消息給小海龜。
首先設置消息類型為geometry_msgs/Twist
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
cmdpub = rospublisher(
'/turtle1/cmd_vel'
,rostype.geometry_msgs_Twist)
pause(3)
% Wait to ensure publisher is setup
cmdmsg = rosmessage(cmdpub);
cmdmsg.Linear.X = 10;
cmdmsg.Angular.Z = 15;
send(cmdpub,cmdmsg)
chatterpub = rospublisher(
'/chatter'
,rostype.std_msgs_String)
pause(3)
% Wait to ensure publisher is setup
chattermsg = rosmessage(chatterpub);
chattermsg.Data =
'hello world'
send(chatterpub,chattermsg)
pause(5)
|
看到小海龜動了沒?
當然也可以發布其他topic
6. 在simulink下控制ROS小海龜
文件:testControlTurtle.slx
接下來我們設計一個小控制器,來控制小海龜平滑地運動到指定位置。
首先按照上一節的步奏,啟動ROS節點,並檢查連通性。
運行testControlTurtle.slx
並設置小海龜的期望位置x,y(可在線修改,范圍1~15)
速度是一個簡單的比例控制器控制運動速度Linear.X
航向控制通過計算小海龜與目標連線的角度(Line of sight)控制轉動速度Angular.Z
Enjoy it!
文件下載鏈接:http://pan.baidu.com/s/1sl8C01n