电子产业一站式赋能平台

PCB联盟网

搜索
查看: 267|回复: 0
收起左侧

基于Mobile SDK V5版固件开发大疆无人机手机端遥控器(5)

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

积分
8805
发表于 2023-7-7 12:01:00 | 显示全部楼层 |阅读模式

z2wzubp2str64015942729.gif

z2wzubp2str64015942729.gif

! p" @7 @  j7 ^+ G0 l2 y: J点击上方蓝色字体,关注我们
; J. o) d% O5 x/ n1 j
  R  Z( Y! ~  G6 K; ?4 g( ]v5.x版本的功能与v4.x基本相同,都是获取飞机的姿态信息、获取无人机多媒体文件、操作多媒体文件、航线规划等。不过在上一章节中也大致说了一些两个版本的中API的差别,下面是根据一些API使用所完成的一些功能,因为项目原因只能提供部分代码供参考,后续如果有这方面需求的小伙伴可以对其进行开发指导。
6 m$ J8 t" q, t8 n15 K$ M6 Q5 @% X& E, U
获取姿态信息
+ R, p6 k2 }& i1、KeyManager调用
; @& L5 ~) V: j# N3 z( s% N
5 L6 ]7 e3 S# @1 a9 U' u" yKeyManager类提供了一组方法来访问硬件模块的参数和控制硬件模块的行为,包括DJIKey的Value设置,Value获取,Value监听和Action执行。通过KeyTools类提供的createKey方法可以更加方便的创建DJIKey实例。
; l+ ]8 G% R% p下图展示了使用KeyManager的接口判断飞控正常连接并且GPS信号等级大于等于2级,然后给飞行器设置返航点,最后执行返航操作的调用流程。1 z& w, T0 z  u4 s6 R2 z) W2 G, ]

vccaqthutua64015942829.png

vccaqthutua64015942829.png
) Y0 z- J! a/ m& j$ f
此处是示例的操作方式,后面有在项目中使用的过程。
; a, J) L$ T6 t' N1 I6 g# A& L
+ ~, \1 K; l/ U; s2 V2、示例/ o! ?6 e3 X  Z$ X( }( T! j

  ^% \. w8 B" f- |% N7 i0 G//获取飞机信息、云台信息8 t7 T4 ?' J. s
    private void get3DLocation() {
2 I( F, ?3 T: i4 W6 P1 z        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftLocation3D), this, new CommonCallbacks.KeyListener() {/ i: @- q' a$ ?
            @Override
5 q7 E) E5 x6 P4 `6 b2 A; q; S2 u            public void onValueChange(@Nullable LocationCoordinate3D oldValue, @Nullable LocationCoordinate3D newValue) {) E7 J; t: O7 z1 n/ m
                if (newValue!=null){' i7 l% ?5 z6 f/ ?
                    lat = newValue.latitude;1 G- x2 N4 e9 ^* ?% z6 ^
                    lon = newValue.longitude;! E9 @) n  g; g0 `9 {6 {7 O! W
                    high = newValue.altitude;
: U6 C, y, n+ k6 n$ Y% q( N                }9 v& S/ }; v: R! P
            }
9 F1 n- J/ A$ i' ^        });, C/ |  L3 V5 L. a, i% e  p
    }! V3 }2 d4 d/ w( k
    private void getAttitude() {7 j1 @1 z9 p+ j& z$ N! }$ Q6 C9 ^( Q* F
        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftAttitude), this, new CommonCallbacks.KeyListener() {
2 b. w+ [& v. Q; Q            @Override
# O/ P3 x0 O. }' ?* ?            public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {( _3 [: i6 y0 @
                if (newValue!=null){
/ _" ~+ c9 x, D# e0 t/ ~                    pitch = newValue.pitch;, X+ ]/ N0 W! Y
                    roll = newValue.roll;
+ I3 W$ [% t8 Z6 L+ V                    yaw = newValue.yaw;  |7 \8 r1 K* ^
                }  I: G$ w, n. U1 i
            }
* j2 [$ O9 A/ m! g        });$ h2 z5 x+ {* V; E5 K+ D  A
    }9 O0 T& P, u1 S! r( N7 v# d7 e4 b: L+ ~1 v
    private void getVelocity() {
- {, {7 L4 l8 X( [- C& Q        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftVelocity), this, new CommonCallbacks.KeyListener() {9 |8 u$ e3 h1 G4 M7 r% [7 ?( P
            @Override# |8 w/ R. ]1 A. _1 m, e7 B/ Q
            public void onValueChange(@Nullable Velocity3D oldValue, @Nullable Velocity3D newValue) {! E8 ^: F9 h- P! X- |: _/ Z: ^2 q% |
                if (newValue!=null){! C  Y4 t9 u* K  I. a$ i) b
                    velocity_X = newValue.x;- Y6 J. p; {. i) b6 @
                    velocity_Y = newValue.y;# t9 x  o) o+ z, m! S3 ?
                    velocity_Z = newValue.z;
* u4 R9 n2 z, }  |" D8 T5 M: ^; v/ D                }
8 G' }( S: D+ p  @! J' O/ S: |: a: @( ~            }
' K) X2 D2 i( j/ e/ ^        });
- e3 ^8 g- H: t% @% {5 \* q7 |1 ?    }: W4 h* `0 u" \1 [! W
    private void getIsFly(){
8 R0 s+ S5 C3 v2 o: O0 `2 d. l        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyIsFlying), this, new CommonCallbacks.KeyListener[B]() {
+ b; ?, h% S& q, ^            @Override4 W! r% Q3 r' s2 Y! d  ^
            public void onValueChange(@Nullable Boolean oldValue, @Nullable Boolean newValue) {
8 `7 z. a" I- S0 E9 k( L4 v8 Z                if (newValue!=null){
( G% r8 l' h4 N- F8 z                    isFlying = newValue;! [8 |0 L0 I( z! C" [& O9 ]
                }9 h/ A  h4 o$ s! x
            }% \  e" o! p4 c  m
        });
! e  l: ]6 X7 d1 R. e, d% D    }
! d! ^& D8 B5 p    private void getGimbalAttitude() {3 c# ?1 [) a$ N. A( w
        KeyManager.getInstance().listen(KeyTools.createKey(GimbalKey.KeyGimbalAttitude), this, new CommonCallbacks.KeyListener() {
! c' T! k- o; n2 G            @Override
( ?5 h0 m* E& E3 H            public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {$ e3 y; C0 Q" ?
                if (newValue!=null){
3 E* A2 H. e5 M& I4 U3 ]                    g_pitch = newValue.pitch;0 R2 ~7 H% \- y
                    g_roll = newValue.roll;; Q7 i5 {1 x9 Y* R  Y
                    g_yaw = newValue.yaw;# g2 W- L: w8 |
                }
* d+ y! L9 g/ g0 n            }# ^( v$ k" i3 t* n
        });; Y+ ^- p8 e# h5 K# q
    }
/ q$ N7 ~& E: `1 c' Z    private void getPower() {
) g( C1 Z- I$ w1 h        KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyChargeRemainingInPercent), this, new CommonCallbacks.KeyListener[I]() {
, K2 D+ H* w2 Z/ E7 p5 `            @Override
! J3 j. y" P/ `0 Z            public void onValueChange(@Nullable Integer oldValue, @Nullable Integer newValue) {
. e3 L4 t3 h+ D: V! O8 C# P                power = newValue;
+ [4 c# M7 b2 \* L            }
  M4 {( e6 f/ g3 ~2 A        });( h- K! R: L& J, e* \% M) z5 I
    }: R+ g* b+ d2 [4 x8 c
    private void getTemperature() {6 s  D# C- n3 S( \5 y# |: z
        KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyBatteryTemperature), this, new CommonCallbacks.KeyListener() {
# N) d$ j' ~: d+ o            @Override. W" w) E8 i/ ]
            public void onValueChange(@Nullable Double oldValue, @Nullable Double newValue) {
/ ~: M( q9 F9 t                temperature = newValue;
& ^/ I$ B4 b: {) c9 _$ A5 y, Y            }
$ F  C1 V* j% \! f& A        });
9 O5 w; }- b3 N2 `6 |( D& a    }
6 p5 i7 o0 ^( i' I3 V. g
  • get3DLocation()方法为获取飞机经纬度信息。
  • getAttitude()方法获取飞机的姿态信息(分别是航偏角、旋转角、俯仰角)。
  • getVelocity()方法获取飞机的飞行速度(分别是X、Y、Z三个方向的速度值)。
  • getIsFly()方法获取当前飞机的状态值(是否正在飞行)。
  • getGimbalAttitude()方法获取镜头的姿态信息(分别是航偏角、旋转角、俯仰角)。
  • getPower()获取飞机的电池电量
  • getTemperature()获取飞机的电池温度onValueChange()方法为1秒执行10次,这个可以根据后续要求进行获取;5 g( L+ w+ x) e" l& T  V- b
    4 z% x$ X3 B- Z. i
    , o, Q; u8 R0 ]( W+ o. G
    2
    . f9 F) D0 g8 X1 x' a多媒体使用
    , i8 a7 U  i( \" |1、Sample介绍
    5 K" q, x# L; k
    ; F6 O* l! S6 J0 c& C( r拍照、录像是无人机的重要功能,对拍摄的照片、视频等多媒体文件进行管理也就必不可少。多媒体文件的管理包括访问飞机存储空间内的多媒体文件资源、获取多媒体文件列表与列表状态、视频文件播放等。
    4 K; O. f9 D$ W8 F7 K+ m下图为完整的接口展示以及接口调用流程示例。
    / n0 l; e  [# p% V
  • 多媒体文件管理调用流程
    ) l. g' ?9 N( o: i

    qefw131ol4h64015942930.png

    qefw131ol4h64015942930.png
  • 视频文件播放调用流程  [" l. o9 _! w' @5 _. F% a
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表