电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

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

l1vvqf0vb4364018791618.gif

l1vvqf0vb4364018791618.gif
1 n: ~+ l5 i: C9 L" _
点击上方蓝色字体,关注我们
$ Z  I0 z' _/ c4 F; y; Z" b4 R  b. s% Q3 ^$ J7 v$ ?5 Y& p
v5.x版本的功能与v4.x基本相同,都是获取飞机的姿态信息、获取无人机多媒体文件、操作多媒体文件、航线规划等。不过在上一章节中也大致说了一些两个版本的中API的差别,下面是根据一些API使用所完成的一些功能,因为项目原因只能提供部分代码供参考,后续如果有这方面需求的小伙伴可以对其进行开发指导。
' I. N. i9 t( K: W. Q3 ~8 ~2 H11 R" V* L$ R5 b" S1 V* i! g* j
获取姿态信息7 f7 G  U- E7 N; p, K( \
1、KeyManager调用
- G3 h' G6 \% Z- P! Y7 _/ j4 Y$ M& [5 `$ J/ Z' E
KeyManager类提供了一组方法来访问硬件模块的参数和控制硬件模块的行为,包括DJIKey的Value设置,Value获取,Value监听和Action执行。通过KeyTools类提供的createKey方法可以更加方便的创建DJIKey实例。
) @/ X$ H4 j* [! s: h, W8 P下图展示了使用KeyManager的接口判断飞控正常连接并且GPS信号等级大于等于2级,然后给飞行器设置返航点,最后执行返航操作的调用流程。! D1 t5 O7 y+ V( I$ I5 p+ p

pc3pusun01464018791719.png

pc3pusun01464018791719.png

0 a3 J. R; Z5 K4 L% W3 r' u8 N此处是示例的操作方式,后面有在项目中使用的过程。3 O9 y& e+ D( s& a

' D7 `, I6 I5 [7 T2、示例! e- P/ a/ e; G% ?# \1 i
  g# O, y: ]1 j) N
//获取飞机信息、云台信息! ^; b" j$ K# Q* p" \/ D4 m" @; g
    private void get3DLocation() {
& k; {& U7 x# z) O        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftLocation3D), this, new CommonCallbacks.KeyListener() {
0 V# n9 j0 m( D, @  y/ W2 r            @Override# I7 _8 P. p6 }- i' p1 V- h
            public void onValueChange(@Nullable LocationCoordinate3D oldValue, @Nullable LocationCoordinate3D newValue) {
5 H0 X: y- _3 A3 |5 b6 W                if (newValue!=null){
5 F. t$ L6 [  d& K3 O                    lat = newValue.latitude;* ^. d9 k7 e6 u. L4 S, p7 c1 X
                    lon = newValue.longitude;, e' `+ b6 l9 k% `# S
                    high = newValue.altitude;6 Y/ i5 ]$ v8 m7 n6 v% o
                }; U# [. e0 ~6 R+ f6 c
            }" X# n) i* i: Y. ?/ p
        });- u9 Y4 A4 e, N3 a" J+ ?
    }; E7 [. H2 R0 n; d, T+ Y
    private void getAttitude() {
1 h4 Y/ _1 E% q, D8 D        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftAttitude), this, new CommonCallbacks.KeyListener() {# d+ c& V+ L4 E$ V  `) Z
            @Override
$ m' n6 P  j0 ], y. O2 r( v2 u8 @            public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {5 I% j/ i* b/ d3 q4 v$ G) h/ L
                if (newValue!=null){
' `! n1 b3 q1 Y1 }( U5 ]# \  f                    pitch = newValue.pitch;
+ x8 B: D3 C" x- J7 s- X                    roll = newValue.roll;
; @8 u4 C0 ?$ c# s8 O% N; a                    yaw = newValue.yaw;- `! g  C; m- e- p6 N5 i
                }
$ N+ |, a3 L" ]$ ~; Q9 @            }
5 A0 Y2 \- E" D# T" K        });* e) t. Z6 _5 p0 k' a& @6 s# w
    }) K0 p$ c6 ~- L: {; f+ f
    private void getVelocity() {
) E$ p6 g( o' @  k/ _        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftVelocity), this, new CommonCallbacks.KeyListener() {- L, I- [$ b2 f" ]  N1 A' X8 Q2 _$ X
            @Override
6 t" }" i: A7 z+ R! k( _            public void onValueChange(@Nullable Velocity3D oldValue, @Nullable Velocity3D newValue) {
4 Q' x4 a. F0 c; b5 \                if (newValue!=null){
3 g; v5 u  D4 E1 z# f3 W& h- V                    velocity_X = newValue.x;
" l4 }0 U1 f2 e4 G                    velocity_Y = newValue.y;
: u/ S  ?' @9 a% s9 k) e                    velocity_Z = newValue.z;
. ]7 K7 s/ H0 A2 V. W                }- A9 I% P( N7 D3 `
            }9 x) Z* w$ `/ f8 [) ?! H& D- U: h
        });
( v% v  b6 ?+ ?! B& w    }( r+ Z7 |7 E/ A+ E  \2 l  F
    private void getIsFly(){, x1 ]& u5 U6 C1 P* G7 l2 m( _7 q
        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyIsFlying), this, new CommonCallbacks.KeyListener[B]() {
, P9 u0 A$ `/ F& _: e            @Override' I# W; |4 C  O2 d
            public void onValueChange(@Nullable Boolean oldValue, @Nullable Boolean newValue) {# g( _. H# t6 D( r" f
                if (newValue!=null){0 p- h% z6 J/ a* s" [- p& ?# z
                    isFlying = newValue;- L1 R" b6 Q# U* V7 }) s5 k% S
                }
* G7 d" a' U8 u8 W6 c: i& N            }* n9 M' p6 s. Z# M) b. d
        });
+ Z( y$ O4 [. d5 t    }0 U) ^7 s7 B8 R' D8 `: {: T
    private void getGimbalAttitude() {: O" R- h. e+ i6 P3 p2 ~
        KeyManager.getInstance().listen(KeyTools.createKey(GimbalKey.KeyGimbalAttitude), this, new CommonCallbacks.KeyListener() {
7 b6 T# X, B3 R4 [- r7 `. V            @Override
8 B9 q& y4 |% X8 d            public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {0 D  z8 a- _3 f# ^" V; b8 ]$ w# Z
                if (newValue!=null){$ J2 Q0 o; W9 v5 N
                    g_pitch = newValue.pitch;% F9 b( U% p* |; X) w# O
                    g_roll = newValue.roll;, K  P5 ^8 G. _8 W8 u  i
                    g_yaw = newValue.yaw;- U3 t1 G5 r" [; G& {
                }  `: a; S6 Y; n1 r
            }  M9 A/ |: C0 A
        });/ y! ]1 B) Q6 j& e, D
    }9 k0 ]7 P' d  k' ]3 p' p7 n
    private void getPower() {# g- k9 w- u, p- D! z) m$ z- q
        KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyChargeRemainingInPercent), this, new CommonCallbacks.KeyListener[I]() {
5 y3 N/ K; f) |3 b) s# Q            @Override4 V; h9 B4 l: d  r) n7 O  f
            public void onValueChange(@Nullable Integer oldValue, @Nullable Integer newValue) {  {' R+ v' `2 z6 `. q, z* e
                power = newValue;
; u4 F) A; r% I% H6 Y' A            }, ]% `4 B: J6 _, S' A
        });
' Q, m6 p$ `! C! ]3 b5 t) ]: @    }3 J$ q$ j: E0 ~$ K' W) D6 B2 n
    private void getTemperature() {- E2 ]7 ^) ]0 d+ z7 g4 W: o
        KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyBatteryTemperature), this, new CommonCallbacks.KeyListener() {
. i' W7 S2 z- e- ]" x0 i9 d            @Override7 x) s( {6 _1 g
            public void onValueChange(@Nullable Double oldValue, @Nullable Double newValue) {) G. s2 I3 X: S% a0 S
                temperature = newValue;7 i. ^/ n7 C  ~2 ]; h! X2 P
            }6 _! F. f$ [7 q* k( W6 B
        });( D4 e: v" C9 V% m1 e
    }" d2 W7 c. o7 E
  • get3DLocation()方法为获取飞机经纬度信息。
  • getAttitude()方法获取飞机的姿态信息(分别是航偏角、旋转角、俯仰角)。
  • getVelocity()方法获取飞机的飞行速度(分别是X、Y、Z三个方向的速度值)。
  • getIsFly()方法获取当前飞机的状态值(是否正在飞行)。
  • getGimbalAttitude()方法获取镜头的姿态信息(分别是航偏角、旋转角、俯仰角)。
  • getPower()获取飞机的电池电量
  • getTemperature()获取飞机的电池温度onValueChange()方法为1秒执行10次,这个可以根据后续要求进行获取;
    5 e6 q% b$ |! r5 C" j
    , d/ s/ N9 Q: C8 r. I9 J% H* q* @/ \
    . ~2 D. C* ?  l4 I  H2 s! H
    23 B4 ~3 _' C! J
    多媒体使用4 }  g( ]. {7 w2 R$ T0 _( s
    1、Sample介绍
    8 R. q/ e- ~5 ?# X! b6 V$ f" }; E1 y; P5 [1 d* _9 r6 I
    拍照、录像是无人机的重要功能,对拍摄的照片、视频等多媒体文件进行管理也就必不可少。多媒体文件的管理包括访问飞机存储空间内的多媒体文件资源、获取多媒体文件列表与列表状态、视频文件播放等。
    : O0 n, N1 e1 f  A5 i" l' p$ k下图为完整的接口展示以及接口调用流程示例。
    8 X6 Y" Y' N* {: i5 @
  • 多媒体文件管理调用流程" ~8 a. j- k3 T/ U+ h

    ln5lcvw2imq64018791819.png

    ln5lcvw2imq64018791819.png
  • 视频文件播放调用流程
    - `' }% B' f3 K' e% ^
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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