假如那些slam算法中只有ply文件的话(一般都会有的,发布在global_map一类的全局建图话题上),那就用meshlab进行转化,使用其中的点云简化,计算法线,构建曲面等功能建立出obj模型。
其实刚开始我想用模拟器CARLA等,但是有一个问题,那就是只能主机用,因为它的别的配置不说,光显卡内存就有6G,其他的也差不多,不管是否独显,反正笔记本应该挺难跑的,假如使用远程桌面,那主机上显示的画面传到笔记本这里可是相当掉帧了,我就没有使用相关的自动驾驶模拟器,而是使用unity3d进行构建。
首先是导入那将近两个G的obj模型,导入了半个小时,其实比我想的快,然后直接开始使用unity3d的导航插件(关于这个插件,官网上有,而且相关文档也不少,不做赘述),然后是关闭与开启自动导航以及关闭自动导航后的移动问题,其实移动的相关指令也有很多,这里给出移动与旋转的比较关键的两条指令,相信读者一定能触类旁通:
this.transform.Translate(Vector3.forward * 0.1f, Space.Self);//移动
this.transform.Rotate(Vector3.up, -1);//旋转
以及摄像机的跟随物体移动问题
gameObject.transform.position = Vector3.Lerp(gameObject.transform.position, targetPosition, Time.deltaTime * speed);
其实这里面相对比较麻烦的是小地图,我首先在移动物体(或者说小车)里面放了子对象摄像头,相对位置显然是俯视视角,然后将摄像头的内容渲染为UI内容放到画布上,这里有layer层的利用,可以让移动物体和目标上各套一个很大的物体,但是只在某个特定的层显示,然后让摄像头只拍摄这个特定的层,这样的话就可以只看到那两个物体了。小地图的制作就完成了。
然后我还加了个手势识别的功能,利用RGBD摄像头识别人的动作,当然这个就需要使用主机了,关于识别动作我使用的是depthai,然后使用socket与我的笔记本进行通信,然后可以在关闭物体自动导航的情况下控制物体的旋转与移动。