csdn原創文章,轉載請註明
本文描述瞭如何在兩臺電腦之間通過ROS實現協同運行的方法。系統配置爲:
- 一臺電腦運行windows 10系統、Matlab R2019b, 本文簡稱PCw;
- 另一臺電腦運行Ubuntu 16.04和Ros
Kinetic,本文簡稱PCu ; - 兩臺電腦通過網線連接於同一局域網。
1. PCw運行Matlab, 啓動ROS
PCw運行Matlab2019b,其自帶robotics system toolbox工具箱,啓動ros:
>> rosinit
Matlab啓動成功後,顯示
Initializing ROS master on http://SIAT-20190705OY:11311/.
Initializing global node /matlab_global_node_72448 with NodeURI http://SIAT-20190705OY:62356/
>>
2 確認兩臺電腦的名稱和IP地址
第一臺電腦PCw在cmd命令行輸入,得到主機名
>> hostname
或者
>> systeminfo
PCw在cmd命令行輸入,得到IP地址
>> ipconfig
第二臺電腦PCu在終端輸入,得到主機名
>> hostname
輸入下列命令,得到IP地址
>> ifconfig -a
本文中兩臺電腦的主機名和IP爲:
PCw | PCu |
---|---|
SIAT-20190705OY | kun-System-Product-Name |
172.20.10.152 | 172.20.10.110 |
3 兩臺電腦設置對方信息
1. PCu端設置:
終端中輸入下列命令打開hosts文件:
sudo gedit /etc/hosts
修改/etc/hosts文件 添加運行matlab端電腦PCw的IP地址: 在etc/hosts文件中添加 "172.20.10.152 SIAT-20190705OY "
新打開一個終端,打開ROS:
roscore
2. PCw端設置:
在matlab端輸入以下命令,設置ROS主機的IP地址爲Ubuntu端電腦的IP;啓動ros:
>> setenv('kun-System-Product-Name','http://172.20.10.110')
>> rosinit
用rostopic list 命令查看話題名稱:
rostopic list
這時候就可以看大有一個‘/rosout’ 的話題:
>> rostopic list
/rosout
還可以在matlab端使用命令 “help robotics.ros” 來查看相關命令:
help robotics.ros
4 Example
example:
- 在Ubuntu端啓動一個pr2機器人,
- 實現在MATLAB端接收顯示pr2機器人的傳感器數據,
- 發佈控制命令到/cmd_vel 話題上控制pr2機器人運行。
步驟:
s1: 在Ubuntu端啓動pr2機器人
首先確保已經按照上文設置好了PCw的主機名和地址。打開終端,啓動ROS,啓動pr2機器人。
roscore
roslaunch pr2_gazebo pr2_empty_world.launch
如果正常,會出現gazebo的pr2機器人界面;如果有問題,請參見博主另一篇介紹pr2啓動的文章。
s2: matlab 端首先設置ROS主機爲ubuntu 端的電腦,然後在matlab中初始化ros,最後利用rostopic list 查看主機上發佈的話題。
setenv('ROS_MASTER_URI','http://10.5.3.11:11311')
rosinit
rostopic list
s3: matlab端處理pr2發佈的topic:
列出topic:
rostopic list
查看topic信息:
rostopic info /torso_lift_imu/data
打印topic信息
rostopic echo /torso_lift_imu/data
s4: PCw接收PCu的機器人消息
即接收並顯示PR2發佈的激光雷達數據。ROS 在matlab中接收一個topic的函數是 rossubscriber(topic_name,@function), 與ros中的接收函數不同,在matlab中不需要指定這個話題的數據類型,它會自動檢測消息類型。function 表示回調函數,可以指定回調函數,也可以缺省。在matlab命令窗口中輸入:
>> laser = rossubscriber('/base_scan');
>> scandata = receive(laser,10);
>> plot(scandata)
s5: PCw發佈消息(控制命令to PCu)
創建一個發佈器:
chatterpub = rospublisher('/chatter',rostype.std_msgs_String);
填充數據:
chattermsg = rosmessage(chatterpub);
chattermsg.Data = 'test 2 PCs msg transfer';
send(chatterpub,chattermsg)
在ROS主機PCu上運行:
rostopic echo /chatter
每當PCw在matlab端調用一次 “send(chatterpub,chattermsg)” 函數,在ROS端就會打印一次: test 2 PCs msg transfer
——————————————
版權聲明:轉載請附上原文出處鏈接及本聲明。