前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rust 操控大疆可编程无人机 - 远程控制 tello

Rust 操控大疆可编程无人机 - 远程控制 tello

作者头像
niqin.com
发布2022-06-30 16:33:41
1.4K0
发布2022-06-30 16:33:41
举报
文章被收录于专栏:Rust 生态与实践

因为提供了开放的接口,才能和图形化编程进行文本交互,实现用户的编程控制,从而可以支持其它诸如 Rust、python、swift、golang 等……

本文我们介绍 Rust 对大疆可编程无人机 tello 的远程控制——

远程控制

无人机飞行时,具有一个状态码:rc_state。只要无人机联网(无人机联网不限于手机、手柄。如果失联,那就是布朗运动了,结局就是所谓“炸机”),此状态用来操纵 tello 无人机的运动。所以远程控制的原理就是我们通过向 tello 无人机传输或者迭代状态码,来远程控制 tello 无人机的状态和行为。

例如,如果我们需要远程控制无人机下坠,使用:

代码语言:javascript
复制
drone.rc_state.go_down()

如果我们需要远程控制无人机前进或者后退多少单位,使用:

代码语言:javascript
复制
drone.rc_state.go_forward_back(-0.7)

上一篇文章介绍到了和 tello 无人机交互通信的原理和方法。远程控制时,和 tello 无人机的通信中,我们是需要对无人机状态进行轮询的。其不仅包括接收来自无人机的消息,还将发送一些默认设置、回复确认、触发关键帧,或者发送实时移动命令等等,才能远程控制状态。

上面提到,无人机联网不限于手机、手柄。我们可以使用 SDL 打开窗口,处理键盘输入,并显示如何连接游戏板或操纵杆等。

如下例子比较长,但原理如上所述,并不复杂,核心部分就是轮询 tello 无人机状态。

代码语言:javascript
复制
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use tello::{Drone, Message, Package, PackageData, ResponseMsg};
use std::time::Duration;

fn main() -> Result<(), String> {
    let mut drone = Drone::new("192.168.10.1:8889");
    drone.connect(11111);

    let sdl_context = sdl2::init()?;
    let video_subsystem = sdl_context.video()?;
    let window = video_subsystem.window("TELLO drone", 1280, 720).build().unwrap();
    let mut canvas = window.into_canvas().build().unwrap();

    let mut event_pump = sdl_context.event_pump()?;
    'running: loop {
        // draw some stuff
        canvas.clear();
        // [...]

        // handle input from a keyboard or something like a game-pad
        // ue the keyboard events
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit { .. }
                | Event::KeyDown { keycode: Some(Keycode::Escape), .. } =>
                    break 'running,
                Event::KeyDown { keycode: Some(Keycode::K), .. } =>
                    drone.take_off().unwrap(),
                Event::KeyDown { keycode: Some(Keycode::L), .. } =>
                    drone.land().unwrap(),
                Event::KeyDown { keycode: Some(Keycode::A), .. } =>
                    drone.rc_state.go_left(),
                Event::KeyDown { keycode: Some(Keycode::D), .. } =>
                    drone.rc_state.go_right(),
                Event::KeyUp { keycode: Some(Keycode::A), .. }
                | Event::KeyUp { keycode: Some(Keycode::D), .. } =>
                    drone.rc_state.stop_left_right(),
                //...
            }
        }

        // or use a game pad (range from -1 to 1)
        // drone.rc_state.go_left_right(dummy_joystick.axis.1);
        // drone.rc_state.go_forward_back(dummy_joystick.axis.2);
        // drone.rc_state.go_up_down(dummy_joystick.axis.3);
        // drone.rc_state.turn(dummy_joystick.axis.4);

        // the poll will send the move command to the drone
        drone.poll();

        canvas.present();
        ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 20));
    }
}

Rust 操控大疆可编程无人机这两篇文章,在 https://blog.budshome.com 站点有完整的介绍。

需要说明的是此主题仅仅是个人一时兴趣的尝试,并非什么深入或复杂的应用,后续是否继续也不确定。感兴趣的朋友,您如果有更深入的见解和应用,我将十分期待您的指导。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust 生态与实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云小微
腾讯云小微,是一套腾讯云的智能服务系统,也是一个智能服务开放平台,接入小微的硬件可以快速具备听觉和视觉感知能力,帮助智能硬件厂商实现语音人机互动和音视频服务能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档