目录
- 1. 坐标系 coordinate system
- (1) AirSim API的坐标系:NED 坐标系 with SI unit
- (2) Unreal Engine的坐标系
- (3)AirSim全局坐标系=NED坐标系=世界坐标系
- (4) AirSim的机体坐标系:Body Frame
- 2. AirSim APIs for 车辆和无人机的状态
1. 坐标系 coordinate system
(1) AirSim API的坐标系:NED 坐标系 with SI unit
该坐标系也是世界坐标系,world frame。
- 所有AirSim API使用NED坐标系统,即+X是北North,+Y是东East,+Z是下Down。这意味着Z值越高越负:如果原点在地面上,z值是零,地面以上是负的!
- 所有单位都是国际单位制。
- 请注意,不同于Unreal Engine (UE)内部使用的坐标系统。在Unreal Engine中,+Z是向上Up而不是向下Down,长度单位是厘米cm而不是米m。
- AirSim API来完成从Unreal Engine的NEU坐标系到AirSim的NED坐标系的适当转换。在AirSim NED系统中,车辆的起始点总是坐标(0,0,0)。因此,当从UE坐标系转换到AirSim NED坐标系时,我们首先减去起始点偏移量,然后缩放100实现cm到m的转换。
- 在UE环境中,车辆由Player Start component放置的地方生成或衍生而来,在Settings.json配置文件中有一个设置项元素为OriginGeopoint,可以将地理经度、纬度和海拔分配给Player Start Component
OriginGeoPoint这指定了放置在Unreal环境中的Player Start Component的纬度、经度和高度。车辆的原点(home point)是用这个变换计算出来的。请注意,所有通过API采用的坐标都使用了以SI单位表示的NED坐标系统,这意味着每辆车在NED系统中都从(0,0,0)开始启动。—《OriginGeopoint》官网资料
(2) Unreal Engine的坐标系
- AirSim不同于Unreal Engine (UE)内部使用的坐标系统。在Unreal Engine中,+Z是向上Up而不是向下Down,长度单位是厘米cm而不是米m。
- 用户不必特别关系UE坐标系,因为AirSim已经处理好了这个问题,即只需要按照AirSim坐标系设置即可,包括Settings.json中的OriginGeopoint元素,AirSim会帮用户自动转换。
(3)AirSim全局坐标系=NED坐标系=世界坐标系
(4) AirSim的机体坐标系:Body Frame
本部分参考:airsim document
根据Airsim文档提供的说明, 机体坐标系body frame遵循Front Left Up (FLU),右手法则。
Note:图片来源:GAAS
Note2: 上述FLU坐标系为右手坐标系。判断绕某个旋转轴i 的旋转正方向的方法为:右手坐标系: 右手握拳,大拇指伸直指向旋转轴i的正方向(箭头方向),其余四指指尖所朝向的方向即为正方向(等效于从旋转轴i正方向箭头端逆向看过去,或者旋转轴i正方向箭头射进你的眼睛,这时看到的逆时针旋转方向为绕i轴的正方向)。
Note:也有说法是认为FLU坐标系不对,应该是FRD坐标系。即机体坐标系的原点在机体的重心位置,x,y,z三个坐标轴的方向分别指向机体的前方、右方、下方. 点击此。
2. AirSim APIs for 车辆和无人机的状态
本部分内容:Using AirSim>>Core APIs: APIs for Car
Airsim提供了两个API函数来进行车辆的控制、获取车辆状态
设置车辆控制参数 | setCarControls | set throttle, steering, handbrake and auto or manual gear. |
获取车辆状态参数 | getCarState | 获取如下的状态信息: speed, current gear,6 kinematics quantities: position, orientation, linear and angular velocity, linear and angular acceleration. |
设置无人机控制参数 | move* APIs | 1 Multirotor can be controlled by specifying angles, velocity vector, destination position or some combination of these. 2 当进行position control时, 需要path following算法,其中AirSim 默认采用carrot following algorithm,这部分通常被认为是 “high level control” ,因为只需要指定 high level goal,the firmware会自动完成其余功能。 3 当前AirSim提供的底层控制 lowest level control 是API函数: moveByAngleThrottleAsync API. |
获取无人机状态参数 | getMultirotorState | 1 这个API在一个调用中返回车辆的状态。 2 状态包括:collision、estimated kinematics(即通过融合传感器计算的运动学)和timestamp(自每个epoch以来的纳秒时间)。3. 这里的kinematics运动学指的是6个量:position, orientation, linear and angular velocity, linear and angular acceleration。 4请注意,simple_slight目前不支持state estimator,这意味着simple_flight模式下估计运动学值和地面真实运动学值是相同的 |
获取真实vehicle和环境状态 | simGetGroundTruthEnvironment (vehicle_name=‘’ 一般是Ground Truth值) | 该函数返回class airsim.types.EnvironmentState,包含环境状态: -大气密度air_density; -大气压air_pressure; -PlayerStart的起始地理信息geo_point; -重力gravity; -无人机位置in NED position; -温度temperature. Note:gravity是环境的重力,NED坐标系中为z轴正方向一致,因此可得到类似9.8的结果。 |
获取vehicle估计的运动学状态 | simGetGroundTruthKinematics (vehicle_name=‘’) 指的是kinematics估计值 | 该函数返回airsim.types.KinematicsState,包含信息: 1. 角加速度:angular_acceleration 2. 角速度:angular_velocity 3. 加速度:linear_acceleration 4. 速度:linear_velocity 5. 姿态四元数:orientation 6. 位置:position Note:1-2: body frame; 3-6: NED frame |
Note:
- 上述状态量中,只有角速度和加速度的值(angular velocity and accelerations )是定义在Body frame中,其余状态量是在NED坐标系中,并且采用SI单位制。
- kinematics输出的位置信息和simGetGroundTruthEnvironment()接口的位置信息不一定完全相同,kinematics的结果是通过动力学物理引擎计算得到的,具体可以参考AirSim论文