学生休息室

分享技术和现实生活的例子,学生可以如何使用MATLAB和Simulink在他们的日常项目#学生成功万博1manbetx

自主系统如何“看见”?

塞巴斯蒂安·卡斯特罗现在又回到了自主系统中的传感器问题上,该系统由一些示例算法和使用低成本硬件平台的学生竞赛所支持。万博1manbetx

介绍

在使用低成本地面车辆平台学习自主感知和导航方面,世界各地存在许多挑战。以下是我们支持的一些类似的任务:万博1manbetx

我们的以前的博文报道了罗斯-胡曼高中自动驾驶汽车挑战赛。在这篇文章中,我们将深入探讨TurtleBot3 AutoRace.这个学生竞赛包含了一个现成的仿真包和一个套教程

TurtleBot3也被设计成一个低成本的教育平台机器人操作系统(ROS).ROS是一个软件框架,可以让用户在仿真和硬件之间轻松切换。正如我们在a以前的博文, MATLAB和Simu万博1manbetxlink有一个与ROS的接口。这使得我们能够从AutoRace模拟中收集数据,并将一些快速示例整合在一起。

ROS还以包含专门的消息类型而闻名,这些消息类型代表自治系统中使用的常见传感器。同时,MATLAB和Simulink都有相应的工具箱万博1manbetx计算机视觉运动规划,自动驾驶.所以,在接下来的文章中,我将通过一些常见传感器类型的例子来连接这两种工具:

  • 视觉传感器:各种类型的相机(单声道对立体,彩色对红外等)
  • 视线传感器:超声波传感器、雷达和激光雷达。

首先,我们可以下载TurtleBot3 AutoRace软件包,并启动Gazebo模拟器。

$ roslaunch turtlebot3_gazebo turtlebot3_autorace.launch

然后,利用ROS将MATLAB与仿真器连接。由于我使用的是Windows主机和Linux虚拟机,我连接到一个具有特定IP地址的ROS主机,如下所示。

rosinit(“192.168.119.129”);

相机示例:车道检测

让我们从模拟器接收图像。

imgSub = rossubscriber(' /相机/图像');imgMsg =接收(imgSub);rgbImg = readImage (imgMsg);

上面列出的所有学生比赛都有一个车道检测和跟随组件,所以让我们使用图像来尝试检测一些车道。一个典型的工作流是:

  1. 变换图像到鸟瞰图
  2. 部分图片
  3. 检测车道
  4. 创建一个控制算法来遵循(或不遵循)车道

鸟瞰视图通常被用来使车道检测更容易,因为它通过显示图像自上而下的视图来消除摄像机的“透视”效果。为了执行这个变换,我们需要计算一个变换矩阵,它在图像的像素上执行旋转和/或平移。要做到这一点,你可以:

  • 获取相机的固有参数(焦距、畸变等)和外在参数(相机在车辆上的位置),然后计算变换矩阵
  • 通过将图像上的4个点映射到现实世界中已知的4个点来估计变换矩阵

要获得摄像机的固有参数,您可以查看制造商数据表或校准一个已知的模式-通常是棋盘。在这个例子中,我采用了第二种方法手动选择分并将它们映射到鸟瞰图中已知的“真实”值。的estimateGeometricTransform在这一步中,函数是关键。

tform = estimateGeometricTransform(点,真理,“射影”);warpedImg = imwarp (rgbImg tform);次要情节(1、2、1)imshow (rgbImg);次要情节(1、2、2)imshow (flipud (warpedImg));

要分割图像,可以使用颜色阈值.为了让事情变得简单一点,这些学生比赛使用颜色来区分左车道和右车道的界限。在AutoRace中,车道是黄色和白色的,所以我们可以校准并定义两组颜色阈值。

yellowIdx = (warpedImg (:: 1) > 100 & warpedImg (:,:, 3) < 100);whiteIdx = (warpedImg (:: 1) > 100 & warpedImg (:,:, 3) > 100);

最后,您可以使用像素的位置以数学方程(通常是多项式)来近似车道。直线车道可以表示为直线(或1次多项式),但曲线车道受益于二次或三次多项式等高阶多项式。为了减少用于曲线拟合的像素数量,我首先场大病的行使它们的宽度为1像素。

polyOrder = 3;[, cy] =找到(bwskel (yellowIdx));yellowPoly = polyfit (, cy polyOrder);

还有一个问题是图像中有多个车道。因此,您可以使用以下技术,而不是对满足给定颜色阈值的所有像素进行多项式拟合随机抽样一致性以消除异常值,产生更好的结果。

polyOrder = 3;numOutliers = 50;[, cy] =找到(bwskel (yellowIdx));yellowPoly = fitpolynomial ialransac ([ry cy],polyOrder,numOutliers);

用正则多项式拟合检测车道,显示出离群值的影响

用RANSAC检测车道,显示出异常值的消除

对于更高级的车道检测和以下应用程序,你可能想看看自动驾驶系统工具箱中的一些例子:

激光雷达示例:定位和绘图

与图像不同,视线传感器的测量不包含颜色或强度信息。然而,它们更擅长于直接测量车辆与潜在障碍物或地标之间的距离和速度。

超声波传感器、雷达和激光雷达基本相似,只是它们分别使用声音、无线电波和光。由于光比声音快得多,激光雷达可以产生更高分辨率的数据,无论是2D还是3D。另一方面,超声波和雷达传感器更便宜,有更长的操作范围,更强的抗天气条件。

视线传感器主要用于两个任务:

  • 障碍检测
  • 本地化和映射

在这个例子中,我们将演示激光雷达。我们先从模拟激光雷达传感器接收扫描信号然后转换成激光雷达扫描对象为了方便。

scanSub = rossubscriber(' /扫描');激光雷达= lidarScan(接收(scanSub));

障碍检测如果需要,通常需要将可驾驶地形与障碍物分离,然后使用聚类等机器学习技术来获得更多有关环境结构的信息。欲了解更多信息,请参阅这个文档页面

%将2D扫描转换为3D点云,并使用欧几里得距离聚类进行障碍分割ptCloud = pointCloud([lidar。笛卡尔0(大小(lidar.Cartesian, 1), 1)]);minDist = 0.25;[标签,numClusters] = pcsegdist (ptCloud minDist);

至于本地化在美国,最简单的方法是“方位推算”,即计算车辆车轮转动的次数。由于这个过程需要集成速度测量来估计位置,它对车轮打滑和传感器噪声/漂移非常敏感。基于激光雷达的定位方法更复杂,在计算上也更昂贵,但因为它们不依赖于传感器读数的整个历史,它们在估计的车辆位置上更能避免漂移。

激光雷达定位取决于地图是否已经存在:

  • 如果地图是已知的,你可以使用概率方法,比如粒子过滤器来找出最有可能产生当前读数的位置。
  • 如果不知道映射,可以使用如下优化方法扫描匹配来计算你在两次连续扫描之间移动了多远。
% Get first scan lidar1 = lidarScan(receive(scanSub));%移动机器人velMsg.Linear.X = 0.1;velMsg.Angular.Z = 0.25;发送(velPub, velMsg);暂停(1);velMsg.Linear.X = 0;velMsg.Angular.Z = 0;发送(velPub, velMsg);% Get第二次扫描lidar2 = lidarScan(receive(scanSub));%执行扫描匹配relPoseScan = matchScans(lidar2,lidar1)

扫描匹配还允许您执行同步定位和映射(SLAM)。通过采用一系列激光雷达测量,您可以估计地图上最有可能产生这些测量结果的车辆轨迹和障碍位置。一种方法是构建和优化机器人姿态(位置和方向)随时间变化的图,这被称为基于图的SLAM在机器人系统工具箱中可用

下面是仅从激光雷达信息收集45秒的数据并估计机器人轨迹和地图的结果。这被称为离线SLAM,与在线SLAM不同,后者在车辆行驶时使用实时数据进行SLAM。

%定义LidarSLAM对象maxRange = 2;%米分辨率= 25;% cells per meter slam = robotics.LidarSLAM(分辨率,maxRange);大满贯。LoopClosureThreshold = 350;大满贯。LoopClosureSearchRadius = 5;%建立和优化姿态图形numters = nummel (scansampled);for idx = 1: numters addScan(slam, scansampled (idx));导出最终结果作为一个占用网格[slamScans, slampose] = scansandpose (slam); map = buildMap(slamScans, slamPoses, resolution, maxRange);

在实践中,执行传感器融合或组合多个传感器的读数是很常见的,使用的技术包括卡尔曼滤波.这使得算法可以利用各种传感器的相对优势,在某些传感器产生不准确读数时提供冗余信息,并允许更可靠地跟踪检测到的物体。

现在你已经有了一个地图,你可以参考下面的例子来了解如何在这个路径中导航:

接下来是什么?

你可以用这些传感器做更多的事情。这里我们没有讨论的一个话题是使用机器学习来分类和定位其他感兴趣的对象,例如交通标志、行人或其他车辆。事实上,其他学生的比赛就像人工智能驾驶奥运会(AI- do)鼓励这样的解决方案而不是上面描述的更“传统万博 尤文图斯”的技术。

在上面的例子中,我们使用ROS将传感器数据流传输到运行MATLAB的独立计算机上——因此处理是在机外完成的。小型、低成本的平台通常不能运行MATLAB的完整安装。根据你创建的算法类型和你的目标硬件,你可以利用MATLAB和Simulink的C/ c++代码生成,以及它的硬件支持包。万博1manbetx万博1manbetx这让您可以使用MATLAB和Simulink进行原型和设计万博1manbetx,而不必稍后用不同的语言重写设计,以便在您的目标系统上运行。

TurtleBot3平台,例如,有一个树莓派3模型B运行Linux和ROS。因此,如果你的算法是用支持代码生成的功能和语法编写的,你可以遵循类似于万博1manbetx这个例子让你的MATLAB代码或Simulink模型在机器人或自万博1manbetx动车辆上独立运行。

如果你对这里讨论的任何问题有任何疑问,请随时给我们留下评论或通过电子邮件脸谱网

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。