ROS与MATLAB联合控制

编程入门 行业动态 更新时间:2024-10-28 00:28:56

<a href=https://www.elefans.com/category/jswz/34/1768665.html style=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尽量安装最新版本的,不然有些功能无法使用。

虚拟机的设置和测试

  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 ,结果应该为:

至此,即完成了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联合控制

本文发布于:2024-02-10 21:02:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1677266.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:ROS   MATLAB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!