大疆社区

标题: 【转贴】【战术指导】虚拟摇杆使用指南 [打印本页]

作者: DJI-William    时间: 2020-10-27
标题: 【转贴】【战术指导】虚拟摇杆使用指南
转自DJI-Shirley,原帖地址:https://bbs.dji.com/forum.php?mod=viewthread&tid=25054&page=1#pid1665893


1. 水平方向控制是角度或者速度,roll/x, pitch/y可以选择地理坐标系解释或者机体坐标系解释。
删除当水平方向控制是角度模式时,数值一定被解释成Body坐标系下的角度控制。

2. 修改yaw控制内容:角度模式是指地面坐标系下的目标角度角速度模式可以选择不同的坐标系。

Joystick 使用指南


Joystick目的是让开发者使用程序进行飞行控制,可以通过SDK实现遥控器模拟。相比于Waypoint的功能,Joystick显得更加灵活。
在使用这个方法前,请确保你对飞行动力学有一定了解。如果没有,我们也为你准备了一个理论速成指导。如果你已经是专业人士,那么请自动跳到后半部分直接阅读Joystick的使用方法。

理论:基础速成
飞机可以在两种坐标系下运动:地面坐标系(Ground Coordinate System)和机体坐标系(Body Coordinate System),为了区别,可以简单地理解为“绝对”坐标系和“相对”坐标系。“绝对”是指,在地面坐标系下,不管飞机怎么运动,东南西北的方向是“绝对”的,不会变动。而“相对”是指,在机体坐标系下,飞机在运动中机体本身相对地面的姿态改变。

Note:这里讨论的不是严谨的机体坐标系,简单的说,是飞机在水平面上的投影。如果你想知道更详细的内容,可以参考Onboard SDK的文档
图1 机体坐标系(1)

如图1定义机体的坐标系,原点为飞机质心。
图2 机体坐标系(2)

飞机的姿态由坐标系上的三个转动的角度表示。我们又称Y Axis为Pitch Axis,X Axis为Roll Axis,Z Axis 为Yaw Axis,如图2所示,用你的右手,大拇指指向坐标轴(黑色箭头)的方向,想象用剩下四指握住坐标轴,这时四指所指的方向应与红色箭头方向一致,该方向是绕坐标轴转动的正方向。
用上面说的右手定则,分别握住三个坐标轴Pitch Axis, Roll Axis和Yaw Axis,并沿红色箭头转动。 你会发现,pitch控制的是飞机机头上下摆动的角度(图3)。
图3 pitch控制

roll控制的是飞机机翼上下摆动的角度。
图4 roll控制

yaw控制的是飞机机身水平旋转的角度。
图5 yaw控制

控制角度可理解为给飞机相应的加速度。
若是控制飞机的速度,右手定则对于图1依然有效。在图1中,使用右手定则,控制X即让飞机在Y Axis上移动,控制Y即让飞机在X Axis上移动。控制Z依然是控制飞机机身水平的旋转。




该坐标系下,X Axis指向北,Y Axis指向东,至于Z Axis,我们把指向天空作为正方向。三个坐标轴依然满足上面的右手定则(请注意,地面坐标系的X,Y,Z与机体坐标系的X,Y,Z意义不同)。在这个坐标系下,定义航向向北为0,顺时钟到180°,逆时针到-180°。通过这两个数值,我们就可以知道飞机在空间的朝向。


实践:SDK使用
       在Mobile SDK里,一个发送给飞机的指令需要四个参数x或roll,y或pitch,yaw和throttle。x或roll,y或pitch归为水平控制,throttle是竖直控制。水平控制、竖直控制与yaw控制是三个方面的控制,互相不影响,但飞机实际运动的效果是三个方面的效果叠加。这四个参数在不同的模式下有不同的解释。例如x或roll,y或pitch这两个参数,在水平控制机体坐标系角度模式下,就会被解释成pitch和roll, 在速度模式下就会解释成y和x。 throttle可以被解释成高度,也可以被解释成速度。yaw可以被解释为角度,也可以是角速度。所以在发送指令前,必须要明确我们对每一个方面的控制模式。

Horizontal Control Coordinate System(坐标系控制):Ground Coordinate System或者Body Coordinate System。该坐标系只作用于水平控制和yaw控制。
Horizontal Control Mode(水平控制模式):仅作用于x(或roll),y(或pitch)。可以选择角度模式或者速度模式。
Vertical Control Mode:仅作用于z,即飞机在竖直方向(上升、下降)的运动。可以选择速度模式或位置模式。不受坐标系模式影响,都是相对地面。
Yaw Control Mode:仅作用于yaw。角度模式是指地面坐标系下的目标角度。角速度模式可以选择不同的坐标系。请注意坐标系的选择。

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;

参数
模式
数值限制
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:
一定要同时设置。参数x,y,z,yaw是同时传给飞控的指令,如果不设置对应的运动模式,飞机不知道要如何解释参数的值,是速度,角度还是角速度。如果不需要改变yaw,可以设置yaw的模式为角度模式,传值的时候传0,即解释为yaw转动0度。由于SDK本身给四个模式设置了默认值(见上),开发者可以偷懒只改变一个或两个模式的值。但是为了代码质量起见,建议在代码中同时设置好4个模式。






欢迎光临 大疆社区 (https://bbs.dji.com/) Powered by Discuz! X3.2