airsim局部坐标系转化机体坐标系
airsim官方提供的state不包含机体坐标系的速度等信息,但包含了局部坐标系下的速度和当前机体在初始点的四元数矩阵,因此可通过四元数解算得到机体坐标系下的速度vel_body
一般来说四元矩阵的表示如下所示:
因此构造得到的旋转矩阵如下所示:
但得到的是从机体坐标系到局部坐标系的旋转矩阵,我们想要得到的是从局部坐标系到机体坐标系的旋转矩阵
由于旋转的可逆性和旋转矩阵的本身性质(旋转矩阵的逆即为矩阵的转置)
因此,局部坐标系向机体坐标系转化的旋转矩阵为:
airsim代码示意:
airsim提供了getMultirotorState作为获取无人机飞行状态信息的api函数。
该函数能够获取无人机的参数信息:是否碰撞、无人机的状态(在simple飞行模式下为ue4构建的四旋翼飞行状态,以全局坐标系为基准)、GPS信息、时间戳、是否降落、遥控器状态等信息。
class MultirotorState(MsgpackMixin):
collision = CollisionInfo() # 碰撞信息
kinematics_estimated = KinematicsState() # 状态信息
gps_location = GeoPoint() # GPS 信息
timestamp = np.uint64(0) # 时间戳
landed_state = LandedState.Landed # 是否是降落状态
rc_data = RCData() # 遥控器数据
ready = False
ready_message = ""
can_arm = False
因此通过该api获取无人机的全局速度与四元数,构造上述旋转矩阵即可得到无人机的局部速度(全局)向机体坐标系的转化
fly_state = self.client.getMultirotorState()
vel_x = fly_state.kinematics_estimated.linear_velocity.x_val
vel_y = fly_state.kinematics_estimated.linear_velocity.y_val
vel_z = fly_state.kinematics_estimated.linear_velocity.z_val
x = fly_state.kinematics_estimated