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

2022-06-30 16:33:41 浏览数 (1)

因为提供了开放的接口,才能和图形化编程进行文本交互,实现用户的编程控制,从而可以支持其它诸如 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 站点有完整的介绍。

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

0 人点赞