ROS与MATLAB联合控制

虚拟机的下载与使用

版本说明:
Windows:MATLAB2020b+VMWare Workstation 15 Player
虚拟机:Ubuntu18.04 +ROS1 melodic+ROS2

虚拟机的下载

MATLAB与ROS联合仿真下载文件提供了MATLAB、ROS联合仿真的相关文件。根据其中的要求,虚拟机应当为VMWARE,VMWARE产品下载列表。依据上述的链接即可安装好虚拟机和已经安装好的ROS的Ubuntu镜像。

tips:MATLAB尽量安装最新版本的,不然有些功能无法使用。

虚拟机的设置和测试

  1. 在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的通讯方式如下:(前两者只有在设置环境变量才可以运行,为了便于例子可以跑通,使用第三种办法即可)

  1. rosinit %该方式似乎也并不可行
  2. 通过hostname %rosinit(‘master_host’) %此种方式似乎并不可行
  3. 通过MATLAB host电脑的IP地址 %rosinit(‘192.168.152.131’) %rosinit(‘192.168.152.131’,11311),rosinit(‘http://192.168.152.131:11311’)

查看是否连接成功,运行 rostopic list ,结果应该为:
rostopic输出结果
至此,即完成了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 < 10
  scan = 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 scan
      scan = receive(laser);
      plot(scan);
      data = readCartesian(scan);
      x = data(:,1);
      y = data(:,2);
      % Compute distance of the closest obstacle
      dist = sqrt(x.^2 + y.^2);
      minDist = min(dist);     
      % Command robot action
      if minDist < distanceThreshold
          % If close to obstacle, back up slightly and spin
          velmsg.Angular.Z = spinVelocity;
          velmsg.Linear.X = backwardVelocity;
      else
          % Continue on forward path
          velmsg.Linear.X = forwardVelocity;
          velmsg.Angular.Z = 0;
      end   
      send(robot,velmsg);
  end

velmsg.Angular.Z = 0;
velmsg.Linear.X = 0;
send(robot,velmsg)

关闭连接

clear
rosshutdown

至此已经完成了ROS与MATLAB的简单仿真。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值