【调试记录】CARLA车辆actor设置BehaviorAgent自动规划后不沿道路行驶
〇、问题描述
目前的研究需要使用CARLA仿真环境进行数据集的录制,从github上面clone了一份从A点移动到B点的代码,这份代码是在地图中人工选择两个坐标然后进行移动,虽然能够满足数据录制的需求,但是只能沿直线移动。所以我参考carla给的automatic_control.py这个例子对代码进行了修改,基本的修改思路是利用get_spawn_points()从地图中提取点,然后将车辆放置在起点,利用BehaviorAgent对象控制车辆,同时设置终点给BehaviorAgent对象。在代码跑起来之后,车辆能够自主前进,但是完全不按照道路走,相当于给了一个目标,然后车就沿直线冲过去,最后撞到墙上停下。
一、调试流程
遇到的这个问题确实不好描述,所以也不知道怎么搜索。查了许多资料,基本确定可能出错的位置有三个:地图加载错误、车辆出错以及agent对象错误。
地图加载一般不会出错,整个过程使用初始化好的client对象的get_world函数就可以得到一个地图,而地图点又是地图内置的,不太可能出现问题。车辆出错的位置可能是加载或者中间过程中的每一步控制。agent对象出错则可能是规控策略、路标出错等原因。通过不断打断点,最终发现在agent对象创建后,我们需要通过set_destination函数来设置目的地,而在这个函数内,会直接根据起点和终点计算好中间过程的每个路标点,后续在循环过程就会根据计算的路标点对车辆下发控制指令。而在这个位置,我发现代码计算出的终点竟然为坐标原点(0,0,0,)。但是传入进去的时候设置好的起始点是有坐标的。更加离谱的是,就算在这一步将起点和终点设置为同样的,车辆也会开出去撞墙。
进一步排查发现,是在设置目的地时,车辆的自身位置被初始化为了(0,0,0,),所以导致第一个路标点的计算就出错了,所以车辆才会朝着一个方向走直线撞墙。但是对照两个文件的写法,在初始化actor车辆对象的时候是完全一样的,所以不存在车辆设置的问题。
最后通过各种搜索,无意中发现了在carla的github评论区,有一个老哥也遇见了这个问题,并且作者和其他人给出了一些解决方案。个人理解是这个属于系统的一个bug,在初始化车辆后,必须要使用同步系统的tick函数同步一下,否则设置的车辆并不出现在起点,而是出现在原点,所以在将这个车辆actor对象赋值给agent时,车辆自身的初始位置就是错的,进而导致了后续路标点计算的错误。
二、原因分析
估计是carlaAPI内部的bug,作者自己也没有指出问题所在。在初始化actor之后,调用tick函数进行一下同步即可。
修改过后的carla代码放在gitte里面了,链接如下:
https://gitee.com/zhang_zhi_he/carla_toolbox/tree/master