在11(2)中已经将人工势场法避障代码迁移至AirSim中,但是有一些待解决问题,这里一并说明后续的解决方案。
之前使用了AirSim中提供的目标识别接口,主要问题在于
在拿到了障碍物检测接口后,对相关部分进行替换,以上问题得到较好的解决。这部分内容不是本人负责,相关代码可参考:https://github.com/Kun-k/airsim_python/tree/main/ObstacleDetection。该接口可实时检测障碍物,并返回box3D
类型的障碍物信息,如下所示:
'box3D': <Box3D> { 'max': <Vector3r> { 'x_val': 4.900000095367432,
'y_val': 0.7999999523162842,
'z_val': 0.5199999809265137},
'min': <Vector3r> { 'x_val': 3.8999998569488525,
'y_val': -0.19999998807907104,
'z_val': 1.5199999809265137}},
box3D
类型提供了8个顶点信息,8个顶点可组成一个立方体,进而得到想要的障碍物信息。
这里取用了 x − y x-y x−y平面内的4个顶点计算斥力。需注意以下两点:
在之前使用LQR方法进行控制,能够较好地控制无人机跟踪目标状态,实现无人机机头朝向与飞行方向的一致。但为了进行速度、加速度限幅,目标状态的速度和加速度并不匹配,控制误差也较大,对无人机的速度限制效果一般。
参考三维航路点跟踪时使用的控制器限幅方法,通过当前速度对控制器输出进行限制,进行如下调整:
# 无障碍物时,三维航路点跟踪的控制器输出
U1 = np.array((K0 * Pt_matrix + K1 * A.dot(Pt_matrix)).T)[0]
if np.linalg.norm(U1, ord=np.inf) > Ul_track:
U1 = U1 * Ul_track / np.linalg.norm(U1, ord=np.inf)
U = -(U1 + V_curr) / K2
# 有障碍物时的控制器输出
U = Fatt + Frep
if np.linalg.norm(U, ord=np.inf) > Ul_avoid:
U = Ul_avoid * U / np.linalg.norm(U, ord=np.inf)
U = (U - V_curr) / K2 # 改进部分
考虑下图所示的情况,无人机由轨迹1-2
切换至轨迹2-3
时,在航路点2处先减速再加速。
此时速度较小,如加速过程中检测到障碍物,会认为满足航路点检测条件,产生不必要的避障动作。
解决方法为,只在加速运动的过程中进行局部极小值检验。
改进APF方法与RRT方法结合进行避障飞行
RRT+APF无人机避障飞行