0. 简介

在了解完上面8讲内容后,基本上ROS和Matlab最关键的部分已经介绍完毕。我们最后一讲就来简单的讲述一下如何在Matlab中结合ROS来完成障碍物的识别与检测。

1. 在Matlab中使用CUDA

配置SimulinkCoder以从Simulink模型生成和构建的CUDA的ROS节点是我们这一小节需要讲的内容。以便于将模型完成配置并生成含有ROS节点的CUDA代码。然后将CUDA ROS节点部署到本地或远程设备目标。

首先需要验证您的开发计算机具有GPU代码生成所需的驱动程序、工具、库和配置,这里我们在MATLAB命令窗口中输入以下命令:

gpuEnvObj = coder.gpuEnvConfig;
gpuEnvObj.BasicCodegen = 1;
gpuEnvObj.BasicCodeexec = 1;
gpuEnvObj.DeepLibTarget = "tensorrt";
gpuEnvObj.DeepCodeexec = 1;
gpuEnvObj.DeepCodegen = 1;
results = coder.checkGpuInstall(gpuEnvObj)

下面我们就可以看到类似的输出,即

Compatible GPU : PASSED
CUDA Environment : PASSED
Runtime : PASSED
cuFFT : PASSED
cuSOLVER : PASSED
cuBLAS : PASSED
cuDNN Environment : PASSED
TensorRT Environment : PASSED
Basic Code Generation : PASSED
Basic Code Execution : PASSED
Deep Learning (TensorRT) Code Generation: PASSED
Deep Learning (TensorRT) Code Execution: PASSED
results =
struct with fields:
gpu: 1
cuda: 1
cudnn: 1
tensorrt: 1
basiccodegen: 1
basiccodeexec: 1
deepcodegen: 1
deepcodeexec: 1
tensorrtdatatype: 1
profiling: 0

然后用Simulink完成仿真模型和GPU代码生成,具体分为以下几个步骤:

  1. 打开要配置用于GPU代码生成的Simulink模型。

  2. 首先选择Simulation选项,在Prepare部分,展开图库,在Configuration & Simulation下,选择Model Settings。

  3. 在“配置参数”对话框的左窗格中,选择Hardware Implementation节点。Hardware Board选择Robot Operating System (ROS),并指定硬件的Device Vendor和Device Type。展开“设备详细信息”,确认“Support long long”已选中。

  4. 在Simulation Target节点中,选择GPU acceleration。如果你的模型有深度学习块,那么,在Deep Learning下,选择适当的Target library。

    选择Code Generation节点。在Target selection中选择Language为“c++”,选择Generate GPU代码。

    如果模型有深度学习块,展开 Code Generation节点并选择Interface节点。然后,在Deep Learning中为Target library选择适当的值。

    选择GPU Code节点,在Libraries下启用cuBLAS、cuSOLVER和cuFFT等加速模块

    然后按照Matlab与ROS(1/2)—-Simulink(二)中的配置完成即可输出C++的代码。

2. 深度学习与ROS的跟随机器人

这个例子展示了如何使用Simulink来控制运行在独立的基于ros的模拟器上的模拟机器人。然后演示如何从Simulink模型为ROS节点生成cuda优化代码,并将其部署到本地主机设备。这部分将运行一个实现符号跟踪算法的模型,并控制模拟机器人根据环境中的符号遵循路径。该算法从运行在独立的基于ros的模拟器中的模拟机器人接收位置信息和摄像机信息。该算法使用YOLO v2检测器检测标志的颜色,并根据颜色发送速度命令来转动机器人。在这个例子中,算法被设计为当机器人遇到蓝色标志时左转,当机器人遇到绿色标志时右转。最后,机器人在遇到红色标志时停下来。

如果不存在Mat文件,首先会调用下面这个函数下载来YoloV2DirectionSignRecognitionModel.mat文件。

exampleHelperGetYoloV2DirectionSignRecognitionNetwork()

Downloading pretrained lane detection network (58b MB)…

设置Simulink ROS首选项以与机器人模拟器通信。并打开示例模型。

open_system('signFollowingRobotYOLOv2ROS.slx');

为ROS配置网络设置。从Simulation 选项中选择Prepare然后选择ROS网络。在Gazebo中指定ROS主机的IP地址和端口号。本例中,Gazebo中的ROS主机为192.168.203.128:11311。Hostname/IP address输入“192.168.203.128”,Port Number 输入“11311”。单击OK以应用更改并关闭对话框。

在每个时间步中,算法从摄像机馈送中检测到一个标志,决定转弯并推动它前进。这里的深度学习对象检测子系统使用预先训练好的YOLO v2对象检测器。

open_system('signFollowingRobotYOLOv2ROS/Deep Learning Object Detection');

Sign Tracking Logic子系统实现了Stateflow图表,从深度学习对象检测中获取检测到的图像大小和坐标,并提供线性和角速度来驱动机器人。

open_system('signFollowingRobotYOLOv2ROS/Sign Tracking Logic');

打开signFollowingRobotYOLOv2ROS模型的配置参数对话框。2 .在“模拟目标”区域框中选择GPU acceleration。在Deep Learning组中,选择目标库为“cuDNN”。

set_param('signFollowingRobotYOLOv2ROS','GPUAcceleration','on');
set_param('signFollowingRobotYOLOv2ROS','SimDLTargetLibrary','cudnn');
set_param('signFollowingRobotYOLOv2ROS','DLTargetLibrary','cudnn');

3. 参考链接

https://ww2.mathworks.cn/help/ros/ug/generate-cuda-ros-node-from-simulink.html

https://ww2.mathworks.cn/help/ros/ug/lane-and-vehicle-detection-in-ros-using-yolov2-deep-learning-algorithm.html

https://ww2.mathworks.cn/help/ros/ug/sign-following-robot-using-yolov2-detection-algorithm-with-ros-in-simulink.html

https://ww2.mathworks.cn/help/ros/ug/ros-sign-following.html