电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

854

主题

854

帖子

8396

积分

高级会员

Rank: 5Rank: 5

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

1inmvfs13jo64015957912.gif

1inmvfs13jo64015957912.gif
' `, @8 M! m, e7 W3 l2 o: j/ s
点击上方蓝色字体,关注我们
  p! s) J$ K" z1 Y+ l" w% C) m" I+ l9 z' T7 y
v5.x版本的功能与v4.x基本相同,都是获取飞机的姿态信息、获取无人机多媒体文件、操作多媒体文件、航线规划等。不过在上一章节中也大致说了一些两个版本的中API的差别,下面是根据一些API使用所完成的一些功能,因为项目原因只能提供部分代码供参考,后续如果有这方面需求的小伙伴可以对其进行开发指导。
' z, E' x. W1 o" ^1
5 @. J7 E  r  v7 c. t获取姿态信息8 t- T+ ?/ u3 M1 T9 A0 C
1、KeyManager调用! n  d0 A# c- ~( U
7 s$ e  H3 B1 {" K
KeyManager类提供了一组方法来访问硬件模块的参数和控制硬件模块的行为,包括DJIKey的Value设置,Value获取,Value监听和Action执行。通过KeyTools类提供的createKey方法可以更加方便的创建DJIKey实例。4 L; P, o9 w: h0 d
下图展示了使用KeyManager的接口判断飞控正常连接并且GPS信号等级大于等于2级,然后给飞行器设置返航点,最后执行返航操作的调用流程。+ [  _" b6 s/ c8 X; F

j4djlphjkqv64015958012.png

j4djlphjkqv64015958012.png

% J1 @, m; X! c9 Q此处是示例的操作方式,后面有在项目中使用的过程。, {: ]! U( v" ~/ R6 o! k

8 A  V7 k0 a* Q2、示例
/ I" T% n! s9 m) \) P5 N7 j
% F8 e$ y' B: {//获取飞机信息、云台信息" T( ~( s  k8 M' M' z3 n: q0 t. V, R
    private void get3DLocation() {/ U; M* U- ?' I/ j# z2 C
        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftLocation3D), this, new CommonCallbacks.KeyListener() {
. }  A8 Q% ]# j  l            @Override7 W; x1 q" G+ L& U+ \. q% c
            public void onValueChange(@Nullable LocationCoordinate3D oldValue, @Nullable LocationCoordinate3D newValue) {
* H. ^" U0 q) y' n! J7 Y6 b                if (newValue!=null){/ D9 X( W) k7 m( r
                    lat = newValue.latitude;
$ U! `& ^% A. n( M                    lon = newValue.longitude;
$ q) E. i3 l- G+ E. l                    high = newValue.altitude;
  |0 |2 Q( ?" T                }! E  i- z. v. W( L5 _
            }
0 {- `2 y/ g( ]* c4 j        });
2 K/ _1 d" {) l9 L. y% X) d% r    }
9 [6 u2 w  L' J" `" U8 e7 V: c8 o    private void getAttitude() {
8 t1 t1 h' @7 x* M. Q; R. |2 v        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftAttitude), this, new CommonCallbacks.KeyListener() {
) y3 B' d  d% a  H            @Override4 _7 U/ Z* i. ^# ~4 U  x" Z; g% q' @
            public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {
) P6 N1 P) s: a1 [" b! b9 e                if (newValue!=null){+ ~0 V: o* Z1 q" Y0 _4 I/ }" p
                    pitch = newValue.pitch;
& k+ ^  W- p$ E                    roll = newValue.roll;
: D5 {0 D* [, f* w                    yaw = newValue.yaw;
6 m6 i, p3 d0 x3 r7 r- w# B                }; _# `7 ]5 P8 |* B5 U( f4 ^4 f
            }
/ Q6 e- T1 S; m! w# L        });" T8 @6 \$ d4 g; q4 C" P; ?& {
    }
% ^  i9 w+ r  ]$ R( V# ~    private void getVelocity() {$ |1 T0 K9 k) e" ^" e: Q, J3 z
        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyAircraftVelocity), this, new CommonCallbacks.KeyListener() {, U/ P. ~, ?/ A7 M( b
            @Override$ p8 R' C6 A8 D* L# \
            public void onValueChange(@Nullable Velocity3D oldValue, @Nullable Velocity3D newValue) {, u+ C" W/ q& w' V
                if (newValue!=null){8 X) p0 E) Y5 A
                    velocity_X = newValue.x;) E# K% H, {3 r/ s  Y
                    velocity_Y = newValue.y;( x" d2 l2 i$ p- c" k) T
                    velocity_Z = newValue.z;, s1 P3 |% C  ^+ V( l7 V
                }
) x3 C9 L& W0 F$ [            }0 o- t1 I, f1 O4 w6 P
        });6 B, H4 y3 F& r+ S* q* r8 v4 d1 J" w
    }3 \0 ]! F  G. y: k1 J
    private void getIsFly(){
, q" C* F: w/ L$ j+ w4 S        KeyManager.getInstance().listen(KeyTools.createKey(FlightControllerKey.KeyIsFlying), this, new CommonCallbacks.KeyListener[B]() {
7 U+ w. c& I0 `9 Q            @Override
0 N2 F2 _* |3 V! _, J" P5 x3 u+ U            public void onValueChange(@Nullable Boolean oldValue, @Nullable Boolean newValue) {+ r; \/ I  B- a# z# _% k( w
                if (newValue!=null){4 n+ B* j# I4 h! E1 Q$ _% G0 F# ~
                    isFlying = newValue;: ]0 u5 m) H$ ?( c  J
                }
! v& l$ Z4 d7 T4 T5 @3 a            }+ y" t, \7 H# m2 N1 w
        });( }# O4 G7 _5 F$ i
    }/ i& H5 c) `" r( `2 d
    private void getGimbalAttitude() {( W5 }, G6 o: e* t2 U7 }1 T* I
        KeyManager.getInstance().listen(KeyTools.createKey(GimbalKey.KeyGimbalAttitude), this, new CommonCallbacks.KeyListener() {
' `4 e! J6 T+ L            @Override7 I% N5 ~+ C( _: O; {5 n7 |2 N
            public void onValueChange(@Nullable Attitude oldValue, @Nullable Attitude newValue) {5 v2 [# k1 v1 ?8 X8 Y
                if (newValue!=null){6 a+ x( S+ r$ M( n
                    g_pitch = newValue.pitch;$ w8 ~3 e4 s5 z. Z( B5 ]
                    g_roll = newValue.roll;7 ~/ w! p  ^$ H5 j
                    g_yaw = newValue.yaw;+ W, B% M) \& G  c  Y
                }* z6 B  i5 N! ]$ {
            }& z1 {% h+ `+ r  S5 R
        });  H, c9 A4 B. ^" z9 C
    }: P' J& ~8 T0 c$ j
    private void getPower() {
8 @. f) @$ g- F: `* V0 N& P0 {+ @4 h7 Y        KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyChargeRemainingInPercent), this, new CommonCallbacks.KeyListener[I]() {
$ F. ]# r: D9 N" b9 {  g            @Override
4 |! ~% n, `4 H0 v2 g1 h# e9 S( e            public void onValueChange(@Nullable Integer oldValue, @Nullable Integer newValue) {
# ^) S9 k/ R) j! ?9 z                power = newValue;
  M- e  v+ Y/ N3 W) Z2 Y2 _            }* K( c6 g% Z; h
        });
7 _3 m# ^8 m7 M) T8 I: q    }
# l* q# p& B1 _* R' W. R    private void getTemperature() {
$ r9 @. i3 O2 I        KeyManager.getInstance().listen(KeyTools.createKey(BatteryKey.KeyBatteryTemperature), this, new CommonCallbacks.KeyListener() {! @3 S( \5 I) j1 i- \0 ]9 S
            @Override
/ f: N2 W/ e% R6 _* Y7 I% b7 z5 M            public void onValueChange(@Nullable Double oldValue, @Nullable Double newValue) {
2 e$ G7 Y* \/ y; r0 o- `( @0 i                temperature = newValue;
* l+ D& B) [! _8 b            }* ?% M! `# f4 f
        });% a5 S% @/ p6 G, P# Y+ Y0 A
    }9 c. Q& _- F$ {! q5 h" N7 z5 w
  • get3DLocation()方法为获取飞机经纬度信息。
  • getAttitude()方法获取飞机的姿态信息(分别是航偏角、旋转角、俯仰角)。
  • getVelocity()方法获取飞机的飞行速度(分别是X、Y、Z三个方向的速度值)。
  • getIsFly()方法获取当前飞机的状态值(是否正在飞行)。
  • getGimbalAttitude()方法获取镜头的姿态信息(分别是航偏角、旋转角、俯仰角)。
  • getPower()获取飞机的电池电量
  • getTemperature()获取飞机的电池温度onValueChange()方法为1秒执行10次,这个可以根据后续要求进行获取;
    & x6 G, H; \, ~' G# G8 e& z

    6 T  x% r3 n$ c$ v2 a* ~
    5 ^; _# u" b! N) d, O2
    - b# R" I3 J* Z2 H$ X/ f多媒体使用
    3 y% U& b$ d* {- L6 p+ ~: ~8 s1、Sample介绍
    / U( b! Q" s# j7 j/ @- A- ?9 m# q2 C4 S1 p; i; Y
    拍照、录像是无人机的重要功能,对拍摄的照片、视频等多媒体文件进行管理也就必不可少。多媒体文件的管理包括访问飞机存储空间内的多媒体文件资源、获取多媒体文件列表与列表状态、视频文件播放等。4 K& N/ a$ J6 ]' w2 Q& v
    下图为完整的接口展示以及接口调用流程示例。0 |- e, h! N; ^4 G
  • 多媒体文件管理调用流程
    % p  g( w: t' Y% W$ \: o6 F: T+ C' f. f

    fgsd4zol05b64015958112.png

    fgsd4zol05b64015958112.png
  • 视频文件播放调用流程
    4 Z$ P- x0 J3 E. Z# Q
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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