ROS与MATLAB联合控制"/>
ROS与MATLAB联合控制
虚拟机的下载与使用
版本说明:
Windows:MATLAB2020b+VMWare Workstation 15 Player
虚拟机:Ubuntu18.04 +ROS1 melodic+ROS2
虚拟机的下载
MATLAB与ROS联合仿真下载文件提供了MATLAB、ROS联合仿真的相关文件。根据其中的要求,虚拟机应当为VMWARE,VMWARE产品下载列表。依据上述的链接即可安装好虚拟机和已经安装好的ROS的Ubuntu镜像。
tips:MATLAB尽量安装最新版本的,不然有些功能无法使用。
虚拟机的设置和测试
- 在ROS上获取虚拟机的IP地址 $ifconfig,如图为虚拟机的IP地址。
2.根据上述地址,设置ubuntu的环境(设置完了可以检查一下):
$ echo export ROS_MASTER_URI=http://IP_OF_VM:11311 >> ~/.bashrc
$ echo export ROS_IP=IP_OF_VM >> ~/.bashrc
3.在WINDOW端,进入cmd环境(win+R,输入cmd即可);ping一下虚拟机的地址(ping 192.168.152.132)
至此,基本主机已经能够与虚拟机进行连接和通信。
注意:
台式机上,为了保证能够ping通,需要设置虚拟机的网络设置,需要将虚拟机的网络连接模式设置为NAT模式。
虚拟机网络连通时会出现如下标识。
MATLAB与ROS的联合仿真
为了便于讲述仿真的流程和具体的知识,不妨以TurtleBot的仿真为案例。TurtleBot的简单安装和使用教程。在运行MATLAB之前,需要准备好ROS的环境。安装好TurtleBot,运行以下命令即可:
$ source /.bashrc
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
MATLAB的设置与通信连接
可以通过如下方式设置MATLAB的环境变量:
setenv('ROS_MASTER_URI','http://192.168.152.131:11311')
setenv('ROS_IP','192.168.152.131')
setenv('ROS_HOSTNAME','')
使用环境变量可能会导致MATLAB自带的例子无法运行,建议作为了解即可,不用设置。
Matlab与ROS的通讯方式如下:(前两者只有在设置环境变量才可以运行,为了便于例子可以跑通,使用第三种办法即可)
- rosinit %该方式似乎也并不可行
- 通过hostname %rosinit(‘master_host’) %此种方式似乎并不可行
- 通过MATLAB host电脑的IP地址 %rosinit(‘192.168.152.131’) %rosinit(‘192.168.152.131’,11311),rosinit(‘http://192.168.152.131:11311’)
查看是否连接成功,运行 rostopic list ,结果应该为:
至此,即完成了MATLAB与ROS的通信连接。
ROS的通信方式
ROS主要通过两种方式进行通信:消息机制和服务机制。
消息机制
如图为消息机制的示意图。
大致步骤如下:
1.先定义publisher %chatterpub = rospublisher(’/chatter’, ‘std_msgs/String’)
2.再定义消息;%chattermsg = rosmessage(chatterpub);%chattermsg.Data = ‘hello world’
3.再定义subscriber;%chattersub = rossubscriber(’/chatter’, @exampleHelperROSChatterCallback)
4.再发送消息send(chatterpub,chattermsg)
5.通过receive或者subscriber的回调函数就可以获取消息
服务机制
如图为服务机制的示意图。
大致步骤如下:
1.先定义sever(接受者),并通过接受者定义相关信息;%sumserver = rossvcserver(’/sum’, ‘roscpp_tutorials/TwoInts’, @exampleHelperROSSumCallback)
2.再定义client,%sumclient = rossvcclient(’/sum’)
3.再定义消息,%sumreq = rosmessage(sumclient);
4.利用call函数获取response
示例–TurtleBot的简单控制
此处主要参考了MATLAB控制Turtle的基础实例。
连接
clear
rosshutdown;%先关闭之前的ROS节点
IP_ros='192.168.152.132';
rosinit(IP_ros,11311); %运行此行命令之前需要打开ROS和示例
建立publisher和messgae
robot = rospublisher('/cmd_vel');
velmsg = rosmessage(robot);
接收扫描信号
laser = rossubscriber('/scan');
scan = receive(laser,3)
figure
plot(scan);
结果图如下:
设置角速度使得图像可以更新
velmsg.Angular.Z = 0.1;
send(robot,velmsg)
tic;
while toc < 10scan = receive(laser,3);plot(scan);
end
停止小车
velmsg.Angular.Z = 0;
send(robot,velmsg)
简单避障
设置基本参数
spinVelocity = 0.6; % Angular velocity (rad/s)
forwardVelocity = 0.1; % Linear velocity (m/s)
backwardVelocity = -0.2; % Linear velocity (reverse) (m/s)
distanceThreshold = 0.5; % Distance threshold (m) for turning
运行机器人
tic;while toc < 100% Collect information from laser scanscan = receive(laser);plot(scan);data = readCartesian(scan);x = data(:,1);y = data(:,2);% Compute distance of the closest obstacledist = sqrt(x.^2 + y.^2);minDist = min(dist); % Command robot actionif minDist < distanceThreshold% If close to obstacle, back up slightly and spinvelmsg.Angular.Z = spinVelocity;velmsg.Linear.X = backwardVelocity;else% Continue on forward pathvelmsg.Linear.X = forwardVelocity;velmsg.Angular.Z = 0;end send(robot,velmsg);endvelmsg.Angular.Z = 0;
velmsg.Linear.X = 0;
send(robot,velmsg)
关闭连接
clear
rosshutdown
至此已经完成了ROS与MATLAB的简单仿真。
更多推荐
ROS与MATLAB联合控制
发布评论