Unity 上智能车赛道仿真
2022-08-31
Unity+智能车=真正的线上赛(狗头)
了解我这次智能车之旅,请参见:十七届智能车——南京之旅
代码已经在 GitHub 上开源:hilookas/Homo_Simulation: Unity Simulation for Smart Car Race
一些使用上的说明,请参考视频:当智能车比赛遇到Unity时会发生什么?Unity辅助AI数据采集_哔哩哔哩_bilibili
引入
采集赛道数据并且标注太麻烦了!!!
最开始是想使用专门用于机器人仿真的开源项目 gazebo ,只是很可惜 gazebo 对于虚拟机的支持并不是特别好(吃驱动),而且支持导出语义分割数据的项目只在新版 gazebo 上提供。
后来我们盯上了 Unity,众所周知 Unity 是一个很成熟的商业游戏引擎,其提供了我们需要的物理功能,并且图像功能也是业界第一梯队的质量。
更棒的是,Unity 官方提供了全中文的开发文档,以及非常容易上手的学习教程!
同时 Unity 官方与其他开发者有给出了类似的案例:
建模和在 Unity 中导入
Unity 可以理解为一个场景编辑器,这也就意味着 Unity 本身只是将不同的模型组合在一起,模型建立本身的过程是用其他软件进行的。
我们采用的是使用 Solidworks 建模,然后利用开源软件 Blender 提供的功能,将 Solidworks 导出的模型转换为 Unity 支持的模型格式。
可能有人会问,为什么不直接使用 Blender 建模。这是因为为了提供更好的仿真效果,赛道以及车辆物理结构是需要非常准确的尺寸。Blender 是面对艺术家们使用的软件,提供的功能多、全,但是并不方便控制尺寸。
模型放在了开源项目里 Modeling 文件夹下。
在使用 Solidworks 建模后,需要将建好的模型转换成 .stl 格式,然后导入到 Blender 中,最后导入到 Unity 中。
Unity 中多渲染输出
实现语义分割图像输出需要自定义 Shader (着色器),简单来说着色器是用于给图像上色的,对于一个像素点填充哪个颜色,是由着色器说了算。
实现不同赛道元素不同填色可以使用 Unity 提供的 Category 和 Tag 功能实现的,在 Shader 代码中通过检测到不同的 ID/Category/Tag,并且根据这些值,给像素点赋上特定的颜色值。
具体可以参见上方视频中灰度图显示部分。
总结
这个程序可以极大的方便赛道数据的采集,但是在测试的时候,发现用仿真图像训练出来的模型在真实图片的预测率并不是特别好,这可能因为 Unity 导出的数据材质平滑导致。虽然我们已经尽量的利用好 Unity 提供的出色的光照效果,但是跟真实世界相比,Unity 的世界可能还是过于简单一些。
对这个项目的继续改进可以放在更加真实的光照和贴图上。光线追踪和法线贴图都可以很好的解决真实度不够的问题。