使用MATLAB绘制Gazebo中的仿真小车的运动轨迹

2023-05-16

   虽然,Gazebo中自带了绘图工具,当需要绘制一些简单的图像时,非常的方便,但是当需要绘制复杂的图像时,还是MATLAB更加合适一些。
   当我们仅仅使用MATLAB以可视化图像的形式去观察Gazebo中小车的运动轨迹,并不参与小车的控制时,完全没有必要以栅格地图的形式去复现gazebo中的仿真环境,当环境较复杂或需要多变的时候往往需要很大的工作量,本文通过图片的形式,将gazebo中仿真环境
   本文介绍一种通过图片的形式,将gazebo中仿真环境快速复现到MATLAB中,并在此基础上叠加显示仿真小车运动轨迹的方法


一、计算两幅地图间的变换比例

   (1)首先确定gazebo中仿真环境的长度及宽度,先通过工具栏中的工具,将视野调至俯视图

   依次选中gazebo的仿真环境的上下左右边界,并在左侧的pose栏中查看其坐标值,比如本文所用的例子中上边界为的X值为9.925000,下边界为-9.925,即在gazebo的仿真环境中,其在X轴上长度为19.85m。左边界的Y值为10.1235,右边界的Y值为-10.2265,即仿真环境在Y轴上长度为20.35


   (2)将俯视图下的仿真环境,截图并保存,作为MATLAB中的地图使用,截图前,可在view菜单栏,取消Origin坐标轴的显示

   本例中的截图如下所示

   在属性中可查看其像素值,也就是在MATLAB中以图片显示的地图的长度和宽度分别为666和656

   (3)现在拿到了两幅地图的长度和宽度,但是在计算两幅地图的比例变换系数前,还要注意一个特别特别重要的问题,坐标系的变换问题,在MATLAB读取照片的时候,其坐标系的原点在左上角,而不是左下角,如下所示:

   也就是说我们得到的gazebo中X轴长度应该对应MALTAB中的Y轴的长度,gazebo中Y轴长度应该对应MALTAB中的X轴的长度,因此我们得到MATLAB中地图与gazebo中地图的比例为 X轴(以MATLAB为准)=666/20.35=32.72727,Y轴(以MATLAB为准)=656/19.85=33.04786
   到这里我们就得到了两幅地图间的变换比例,也就是说在gazebo中小车沿着gazebo的的坐标系的X轴正方向移动1m,对应在MATLAB的地图中就是沿着Y轴的负方向移动了33.04786个像素点,同理,gazebo中小车沿着gazebo的的坐标系的Y轴正方向移动1m,对应在MATLAB的地图中就是沿着X轴的负方向移动了32.72727个像素点


二、调试获取两幅地图间的原点偏移量

   (1)首先我们在MATLAB的命令行窗口,通过imread函数读取我们刚才保存的截图,最好是jpg格式,在MATLAB的命令行中png等格式也可以,但是在simulink的MATLAB Function模块中只允许使用jpg格式,如下图所示:

   刚才的照片我保存为gazebomap.jpg,在MALTAB的命令行输入以下语句将其读取,imread是读取图像,im2gray是将其转换成灰度图像(不转也可以),并命名为Image1

     Image1=im2gray(imread('gazebomap.jpg'));

   在工作空间使用imshow函数将其显示出来,如下图所示:

    imshow(Image1);

   (2)建立MATLAB与ROS的通讯,并通过subscribe模块订阅gazebo中发布的小车的位置信息,本部分内容在前面的文章中已经介绍过了,这里不再缀叙
   (3)使用MATLAB Function模块来编写程序,在刚才MALTAB显示的图片基础上绘制小车的实时位置,其代码如下:

function Gazebo_Track_Plotting(xr,yr,r,X_factor,Y_factor,X_Offset,Y_Offset)
hold on
%计算偏移量
rectangle('Position',[(-yr*X_factor+X_Offset)-r,(-xr*Y_factor+Y_Offset)-r,2*r,2*r],'Curvature',[1,1],'LineWidth',3,'FaceColor','y','EdgeColor','r'),axis equal
end

   该函数的输入参数中xr,yr是订阅的小车的位置信息(是在gazebo的坐标系下的),X_factor和Y_factor是我们在第一部分计算出的两幅地图之间的变换比例关系,通过constant模块输入给该函数,即X_factor=32.72727,Y_factor=33.04786,X_Offset和Y_Offset就是本步我们要调试的两幅地图下原点的偏移量,由于本例中在gazebo地图中原点差不多在其地图的中点出,而在MATLAB中其原点在左上角,因此X_Offset和Y_Offset大概为图片像素值的一半,即X_Offset应该在666/2=333附近,Y_Offset应该在656/2=328附近,因此将这两个值作为初始值赋给该函数

   由于matlab绘制单个单独的点不易观察,这里采用rectangle函数以该点为圆心绘制一个小圆的形式来代替了该点,r是该圆的半径

   (4)在gazebo中选中仿真小车,在左侧将其X和Y坐标均设为0,这时,gazebo中小车就会移动至gazebo中地图的零点,如下所示:

   (5)启动Simulink的仿真,观察此时根据大概的偏移量映射出的小车位置,如下所示:

   可以发现其相对gazebo中小车的位置有点偏左和偏下,因此应该适当减少Y轴的偏移量,同时适当增加X轴的偏移量,调节传送给Gazebo_Track_Plotting函数的变量X_Offset和Y_Offset,再次观察红点的位置,如此循环直至红点显示的位置为gazebo中原点的位置,经过调节本例中的X_Offset应该改为341,Y_Offset应该改为324,如下图所示

   到这里偏移量也就是找到了,同时,两个地图间的映射关系也就找到了



三、观察效果

   控制gazebo中小车运动,观察MATLAB绘制的轨迹,如下所示:

在MATLAB中绘制Gazebo中小车的运行轨迹

   虽然由于通讯的原因,轨迹的绘制有一定的延时性,但是大体上满足了预期的设想


本文介绍的内容到这里就结束了,在探索过程中遇到了一个奇怪的问题,在Simulink的MATLAB Function模块中,我曾经成功使用过imread()函数,但是过了一天后同样的内容(或者说同样的文件),再也用不了了,只要在该模块里使用了imread函数,就会报以下错误(点击或拖动查看大图),一直没解决,期望得到大佬的指导


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

使用MATLAB绘制Gazebo中的仿真小车的运动轨迹 的相关文章

  • 如何获取活动对象 MATLAB GUI 的句柄

    我正在尝试使用 MATLAB GUI 创建日历 我有两个Edit Text对象 edittext1 and edittext2 我想做这个 我把光标放在edittext1然后在日历中选择日期 它会进入文本字段edittext1 同样对于ed
  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 通过傅里叶空间填充进行插值

    我最近尝试在 matlab 上实现一个在傅立叶域中使用零填充的插值方法的简单示例 但我无法正常工作 我总是有一个小的频移 在傅里叶空间中几乎不可见 但它在时空上产生了巨大的误差 由于傅里叶空间中的零填充似乎是一种常见 且快速 的插值方法 因
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • MATLAB - GUI 和 OPC 服务器

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

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • for 循环中的绘图没有可见点

    我正在努力解决我想使用 for 循环制作的情节 我知道当我在循环之后添加它时它会起作用 只是一个简单的图 但我想用另一种方式尝试一下 fib ones 1 10 for k 3 10 hold on fib k fib k 1 fib k
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • 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
  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义
  • matlab中更快的插值方法

    我正在使用 interp1 来插值一些数据 temp 4 30 4 rand 365 10 depth 1 10 dz 0 5 define new depth interval bthD min depth dz max depth ne
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • MATLAB - 通过垂直连接子矩阵重新排列矩阵

    我在执行以下任务时遇到问题 假设一个 3x6 矩阵 A 0 2787 0 2948 0 4635 0 8388 0 0627 0 0435 0 6917 0 1185 0 3660 0 1867 0 2383 0 7577 0 6179 0

随机推荐