ROS与MATLAB联合控制

2023-05-16

虚拟机的下载与使用

版本说明:
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的简单仿真。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS与MATLAB联合控制 的相关文章

  • 如何将Matlab代码库与Android集成?

    我有一个算法和 MATLAB 中的一些其他代码 我想在我的 Android 应用程序中使用它 我怎样才能做到这一点 我可以从 MATLAB 制作 jar 文件以便与 Android 一起使用吗 我必须做点别的事吗 如果您还有其他产品 适用于
  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 在 matlab/octave 中将数据集分成两个子集 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 将数据集分为两个子集 例如 训练 和 测试 其中 训练集包含 80 的数据 测试集包含剩余的 20 分裂的意思是生成一个长度等于的逻辑索引
  • MATLAB 中的抗锯齿线和标记

    您好 我在 MATLAB 中有一张图像 我希望这条线是平滑的 看看从 0 4 到 0 8 的线 这太可怕了 当在图中使用 LineSmoothing on 运算符时 我得到了这个 我在线条上做得很好 但它也使标记变得平滑 而且它们太可怕了
  • 如何在 R 或 MATLAB 中为散点图创建阴影误差条“框”

    我想在 R 或 MATLAB 中创建一个简单的散点图 涉及两个变量 x 和 y 它们有与之相关的错误 epsilon x 和 epsilon y 然而 我不是添加误差线 而是希望在每个 x y 对周围创建一个 阴影框 其中框的高度范围从 y
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • matlab矩阵中求子矩阵的通用方法

    我正在寻找一种 好 方法来在更大的矩阵 任意维数 中找到矩阵 模式 Example total rand 3 4 5 sub total 2 3 1 3 3 4 现在我希望这样的事情发生 loc matrixFind total sub 在
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • 白色像素簇提取

    我正在研究指纹毛孔提取项目 并陷入毛孔 白色像素簇 提取的最后阶段 我有两个输出图像 我们可以从中获取毛孔 但不知道该怎么做 这两个图像的尺寸不同 image1 的尺寸为 240 320 image2 的尺寸为 230 310 这是我的图像
  • 将组合字符串和数字输入的元胞数组写入文本文件

    考虑以下 DateTime 2007 01 01 00 00 2007 02 01 00 00 2007 03 01 00 00 Headers Datetime Data Dat 100 200 300 Data DateTime num
  • 如何以编程方式指定 MATLAB 编辑器键绑定

    我想将键盘键绑定设置为Windows 默认设置我想在启动时使用startup m因为我希望在大量系统上设置此设置 首选项对话框中的等效设置是 MATLAB gt Keyboard gt Shortcuts gt Active Setting
  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以
  • MATLAB 图中轴标签与轴之间的距离

    我正在使用 MATLAB 绘制一些数据 我想调整轴标签与轴本身之间的距离 但是 只需向标签的 位置 属性添加一点即可使标签移出图窗窗口 是否有 保证金 属性或类似的东西 在上图中 我想增加数字和标签 Time s 之间的距离 同时自动扩展数
  • 定义自定义 Mupad 程序的一般相对搜索路径

    假设我有一个 mupad 笔记本myMupadNotebook mn在路径上 C projectFolder ABC abc 它调用程序MyMupadProcedure mu它位于 C DEF GHI 现在我有一个 Matlab 脚本mai
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 我如何编写一个名为 dedbi 的 MATLAB 函数,它将输入 xtx 作为字符串并返回另一个字符串 xtxx 作为输出。

    dedbi 反转单词 即 a 将被 z 替换 b 将被 y 替换 c 将被 x 替换 依此类推 dedbi 将对大写字母执行相同的操作 即将字符串 A 替换为 Z 将 B 替换为 Y 将 C 替换为 X 依此类推 如果我给函数这个字符串 a
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un

随机推荐