• 【全网首发】【Python】Python控制parrot ARDrone 2.0无人机


    🎉欢迎来到Python专栏~Python控制parrot ARDrone 2.0无人机


    • ☆* o(≧▽≦)o *☆~我是小夏与酒🍹
    • 博客主页:小夏与酒的博客
    • 🎈该系列文章专栏:Python学习专栏
    • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
    • 📜 欢迎大家关注! ❤️
      图标

    CSDN

    遇见未来

    一、前言

    本篇文章主要讲解如何使用Python来对parrot ARDrone 2.0无人机进行操作控制。

    在网上查找过许多关于ARDrone的SDK资料,但大部都是使用C++来进行开发,有一部分使用Python开发的资料中却没有包含完整且正确的库。为了解析无人机发送的UDP数据信息,我个人觉得使用Python来实现是相对简单的,于是查找了大量的资料之后,终于可以使用Python来控制无人机了!

    Python技能树:Python入门技能树
    版本:Python 3.10。
    IDE:PyCharm。


    二、效果演示

    在调试和测试的过程中,我使用PyCharm进行开发:

    【Python控制ARDrone 2.0无人机】演示视频


    三、ARDrone 2.0无人机介绍

    Parrot AR.Drone四轴遥控飞机是世界知名无线通信厂商Parrot出品的高级玩物,与第一产品时隔两年多, Parrot公司研发了2.0版本,即这次数字尾巴收到的AR.Drone 2.0 Power Edition。拥有极高精度的3轴MEMS陀螺仪、3轴加速度计、3轴磁强计、压力传感器和超声波传感器的AR.Drone 2.0,提供了自动起飞、降落、悬停的功能。

    ARDrone 2.0无人机的官网和官方提供的sdk获取:ARDrone 2.0
    获取官方的sdk界面:
    官网界面
    目前项目中使用的ARDrone 2.0无人机整体展示:
    整体
    去除保护外壳的正面和背面:
    正面
    背面


    四、环境搭建

    一开始选择使用Python来进行开发,就是因为Python有着强大的编程生态,能极大地提高开发效率。

    开发中主要使用的库是:pyardrone。需要先获取到这个库,才可以轻松地开发无人机。

    如果你当前的环境比较好的话,直接使用pip下载:

    pip install pyardrone
    
    • 1

    或者

    pip3 install pyardrone
    
    • 1

    📜当然了,为了提高下载速度和下载成功率,还是需要使用国内镜像源下载:

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyardrone
    
    • 1

    或者

    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pyardrone
    
    • 1

    尝试过很多的方法,从github上看了好多大佬项目中的pyardrone包,都存在代码不完整且有错误的情况。上述pyardrone的安装方法是目前最OK的。


    五、讲解示例代码

    下面展示基本的示例代码,连接无人机的WIFI,控制无人机飞到1m的高度,悬停一段时间后降落

    from pyardrone import ARDrone
    
    def fly_to_height(target_height):
        drone = ARDrone()
        if not drone.connected:
            drone.connect()
        
        # 根据目标高度执行相应操作
        drone.takeoff()
        drone.move(target_height)
        # 其他飞行操作
        drone.hover()
        drone.land()
        
        if drone.connected:
            drone.disconnect()
    
    # 主程序入口
    if __name__ == "__main__":
        target_height = 1  # 设置目标高度为1
        fly_to_height(target_height)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    定义了一个控制飞机飞到固定高度、悬停一段时间并降落的函数:

    def fly_to_height(target_height):
        drone = ARDrone()
        if not drone.connected:
            drone.connect()
        
        # 根据目标高度执行相应操作
        drone.takeoff()
        drone.move(target_height)
        # 其他飞行操作
        drone.hover()
        drone.land()
        
        if drone.connected:
            drone.disconnect()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    上述代码即能实现对无人机的简单控制。

    同时,在pyardrone中,包含了UDP的ip地址和端口配置

    class ARDroneBase(BaseClient):
    
        def __init__(
            self,
            *,
            host='192.168.1.1',
            at_port=5556,
            navdata_port=5554,
            video_port=5555,
            watchdog_interval=0.5,
            timeout=0.01,
            bind=True,
            connect=True
        ):
            self.host = host
            self.at_port = at_port
            self.navdata_port = navdata_port
            self.video_port = video_port
            self.watchdog_interval = watchdog_interval
            self.timeout = timeout
            self.bind = bind
    
            if connect:
                self.connect()
    ...            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    对控制最有用的代码如下,包括起飞、降落、升高和悬停等

    class HelperMixin:
    
        def takeoff(self):
            '''
            Sends the takeoff command.
            '''
            self.send(at.REF(at.REF.input.start))
    
        def land(self):
            '''
            Sends the land command.
            '''
            self.send(at.REF())
    
        def emergency(self):
            '''
            Sends the emergency command.
            '''
            self.send(at.REF(at.REF.input.select))
    
        def _move(self, roll=0, pitch=0, gaz=0, yaw=0):
            '''
            Same as sending :py:class:`~pyardrone.at.PCMD` command with progressive
            flag.
            '''
            self.send(at.PCMD(at.PCMD.flag.progressive, roll, pitch, gaz, yaw))
    
        def move(
                self, *,
                forward=0, backward=0,
                left=0, right=0,
                up=0, down=0,
                cw=0, ccw=0):
            '''
            Moves the drone.
    
            To move the drone forward at 0.8x speed:
    
            >>> drone.move(forward=0.8)
    
            To move the drone right at 0.5x speed and upward at full speed:
    
            >>> drone.move(right=0.5, up=1)
    
            To rotate clockwise at 0.7x speed:
    
            >>> drone.move(cw=0.7)
    
            :param forward:  speed for moving forward
            :param backward: speed for moving backward
            :param left:     speed for moving left
            :param right:    speed for moving right
            :param up:       speed for moving up
            :param down:     speed for moving down
            :param cw:       speed for rotating clockwise
            :param ccw:      speed for rotating counter-clockwise
            '''
            self._move(
                roll=right-left,
                pitch=backward-forward,
                gaz=up-down,
                yaw=cw-ccw
            )
    
        def hover(self):
            '''
            Sends the hover command.
            '''
            self.send(at.PCMD(flag=0))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    其中,向无人机发送控制指令的部分如下:

    class ARDroneBase(BaseClient):
    ...
            def send(self, command):
            '''
            :param ~pyardrone.at.base.ATCommand command: command to send
    
            Sends the command to the drone,
            with an internal increasing sequence number.
            this method is thread-safe.
            '''
            self.at_client.send(command)
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    对于向无人机发送的具体指令,可以参考官方提供的sdk手册(AT Commands部分),或者从pyardrone.at中查看。手册中的部分AT指令展示如下:
    部分AT指令

    除了上述内容之外,pyardrone中还提供了opencv(cv2)相关的开发,部分展示如下:

    # import VideoMixin only if opencv is available
    try:
        import cv2
    except ImportError:
        class DummyVideoMixin:
            pass
        VideoMixin = DummyVideoMixin
        VIDEO = False
    else:
        del cv2
        from pyardrone.video import VideoMixin
        VIDEO = True
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    六、后记

    使用Python开发ARDrone 2.0无人机,同时还便于使用PyQt5开发对应的UI操作界面,界面部分展示如下(未完工):
    ui开发


    csdn

    🧸结尾


    Tips

    1. 您发布的文章将会展示至 里程碑专区 ,您也可以在 专区 内查看其他创作者的纪念日文章
    2. 优质的纪念文章将会获得神秘打赏哦
  • 相关阅读:
    LeetCode107. Binary Tree Level Order Traversal II
    okhttp
    遵循开源软件安全路线图
    AC修炼计划(AtCoder Beginner Contest 329)
    小程序中如何查看会员的积分和变更记录
    什么是视觉特效师,我如何才能成为一名艺术家?
    面试问JUC(java.util.concurrent)的常见类你能答出来几句?
    c++ 条件变量使用详解 wait_for wait_unitl 虚假唤醒
    【湍流】基于matlab kolmogorov结合次谐波补偿大气湍流相位屏【含Matlab源码 2178期】
    一周侃 | 周末随笔
  • 原文地址:https://blog.csdn.net/m0_56262476/article/details/134340915