Joystick使用逻辑
Android:
1. 开启地面站。
/**
* 使用地面站功能前请先开启地面站
*/
public void openGroundStation(DJIGroundStationExecuteCallBack mCallBack)
2. 请确保以下四个设置是你所需要的:
/**
* 默认值是Body坐标系
*/
public void setHorizontalControlCoordinateSystem(DJIGroundStationTypeDef.DJINavigationFlightControlCoordinateSystem mYawControlCoordinateSystem)
/**
* 默认值是角度模式(控制pitch和row)
*/
public void setHorizontalControlMode(DJIGroundStationTypeDef.DJINavigationFlightControlHorizontalControlMode mHorizontalControlMode)
/**
* 默认值是速度模式
*/
public void setVerticalControlMode(DJIGroundStationTypeDef.DJINavigationFlightControlVerticalControlMode mVerticalControlMode)
/**
* 默认值是角速度模式
*/
public void setYawControlMode(DJIGroundStationTypeDef.DJINavigationFlightControlYawControlMode mYawControlMode)
3. 使用sendFlightControlData(float mYaw, float mPitch, float mRoll, float mThrottle, DJIExecuteResultCallback mCallBack)方法对飞机进行控制。
iOS:
1. 首先调用DJINavigation以下方法开启地面站:
-(void) enterNavigationModeWithResult: (DJIExecuteResultBlock)result;
2. 然后设置以下四个参数值:
/**
* Vertical control mode, 默认值是速度模式。
*/
@property(nonatomic, assign) DJIVerticalControlMode verticalControlMode;
/**
* Horizontal control mode, 默认值是角度模式(控制pitch和row)。
*/
@property(nonatomic, assign) DJIHorizontalControlMode horizontalControlMode;
/**
* Yaw control mode, 默认值是角速度模式。
*/
@property(nonatomic, assign) DJIYawControlMode yawControlMode;
/**
* Horizontal control coordinate system, 默认值是Body坐标系。
*/
@property(nonatomic, assign) DJIFlightCoordinateSystem horizontalCoordinateSystem;
3. 接着创建好DJIFlightControlData结构:
typedef struct
{
/**
* Aircraft's Pitch controlled quantity.
*/
DJIFlightControlledQuantity mPitch;
/**
* Aircraft's Roll controlled quantity.
*/
DJIFlightControlledQuantity mRoll;
/**
* Aircraft's Yaw controlled quantity.
*/
DJIFlightControlledQuantity mYaw;
/**
* Aircraft's Throttle controlled quantity.
*/
DJIFlightControlledQuantity mThrottle;
} DJIFlightControlData;
再使用DJIFlightControl的以下方法对飞机进行控制:
/**
* Send flight control data. The property 'isEnable' should be YES.
*
* @param controlData Flight control data
* @param result Remote execute result callback.
*/
-(void) sendFlightControlData: (DJIFlightControlData)controlData withResult: (DJIExecuteResultBlock)result;
Note:- yaw控制下的角度模式是指地面坐标系下的目标角度;
- 当竖直方向是位置模式时,数值一定是对地的高度;
- 其他模式请注意坐标系的选择。
参数 | 模式 | 数值限制 |
x | 速度模式 | [-10 m/s, +10 m/s] 超过最大值,仍按最大值运动 |
角度模式 | [-30°, +30 °] |
y | 速度模式 | [-10 m/s, +10 m/s] 超过最大值,仍按最大值运动 |
角度模式 | [-30°, +30 °] |
z | 速度模式 | [-4 m/s, +4 m/s] 超过最大值,仍按最大值运动 |
位置模式 | [0m, 100m] |
yaw | 角度模式 | [-180°, +180 °] |
角速度模式 | [-100°/s, +100 °/s] |
请留意指令发送的频率。如果指令只发送一次,飞控视为连接中断进入自动悬停状态。因此,可以用Timer去重复发送指令,建议频率是50Hz,最低5Hz以上。
FAQ:
- 一定要同时设置4个模式吗?(4个模式指setHorizontalControlCoordinateSystem(),setHorizontalControlMode(),setVerticalControlMode()和setYawControlMode())如果我只需要飞机向前飞,不需要改变yaw,我也需要设置yaw的运动模式吗?
一定要同时设置。参数x,y,z,yaw是同时传给飞控的指令,如果不设置对应的运动模式,飞机不知道要如何解释参数的值,是速度,角度还是角速度。如果不需要改变yaw,可以设置yaw的模式为角度模式,传值的时候传0,即解释为yaw转动0度。由于SDK本身给四个模式设置了默认值(见上),开发者可以偷懒只改变一个或两个模式的值。但是为了代码质量起见,建议在代码中同时设置好4个模式。