Airsim无人机状态获取getMultirotorState
此 API 一次调用即可返回车辆的状态。状态包括碰撞、估计运动学(即通过融合传感器计算的运动学)和时间戳(自纪元以来的纳秒)。这里的运动学意味着 6 个量:位置、方向、线速度和角速度、线速度和角加速度。请注意, 目前不支持状态估计器,这意味着 的估计和地面实况运动学值将相同。但是,除了角加速度外,还可以为 PX4 提供估计的运动学。所有量都在 NED 坐标系中,世界坐标系中的 SI 单位除了角速度和加速度在体坐标系中。
这个状态是由传感器估计的状态,并不是无人机状态的真值。
默认的无人机底层飞控 并不支持状态估计,所以如果是 飞控,此函数得到的状态与真值相同。
使用PX4 飞控可以获取估计的状态
fly_state = client.getMultirotorState()# query vehicle state
def getMultirotorState(self, vehicle_name = ''):"""Args:vehicle_name (str, optional): Vehicle to get the state ofReturns:MultirotorState:"""return MultirotorState.from_msgpack(self.client.call('getMultirotorState', vehicle_name))
getMultirotorState.__annotations__ = {'return': MultirotorState}
class MultirotorState(MsgpackMixin):collision = CollisionInfo() # 碰撞信息kinematics_estimated = KinematicsState() # 状态信息gps_location = GeoPoint() # GPS 信息timestamp = np.uint64(0) # 时间戳landed_state = LandedState.Landed # 是否是降落状态rc_data = RCData() # 遥控器数据ready = Falseready_message = ""can_arm = False
此API获得的是相对于起始位置的无人机状态,其中速度为起始位置xyz方向的速度。
class KinematicsState(MsgpackMixin):position = Vector3r() # 位置orientation = Quaternionr() # 姿态角linear_velocity = Vector3r() # 速度angular_velocity = Vector3r() # 机体角速率linear_acceleration = Vector3r() # 加速度angular_acceleration = Vector3r() # 机体角加速度
相对于全局的速度转换为无人机自身的速度
fly_state = client.getMultirotorState()vel_x = fly_state.kinematics_estimated.linear_velocity.x_valvel_y = fly_state.kinematics_estimated.linear_velocity.y_valvel_z = fly_state.kinematics_estimated.linear_velocity.z_valx = fly_state.kinematics_estimated.orientation.x_valy = fly_state.kinematics_estimated.orientation.y_valz = fly_state.kinematics_estimated.orientation.z_valw = fly_state.kinematics_estimated.orientation.w_valvel_x_self = (1-2*(y**2)-2*(z**2))*vel_x + (2*x*y - 2*z*w)*vel_y + (2*x*z + 2*y*w)*vel_zvel_y_self = (2*x*y + 2*z*w)*vel_x + (1 - 2*(x**2) - 2*(z**2))*vel_y + (2*y*z - 2*x*w)*vel_zvel_z_self = (2*x*z - 2*y*w)*vel_x + (2*y*z + 2*x*w)*vel_y + (1-2*(x**2)-2*(y**2))*vel_zreturn vel_x_self,vel_y_self,vel_z_self