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

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


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

🎉 目录-Python控制parrot ARDrone 2.0无人机

一、前言

本篇文章主要讲解如何使用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下载:

python 复制代码
pip install pyardrone

或者

python 复制代码
pip3 install pyardrone

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

python 复制代码
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyardrone

或者

python 复制代码
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pyardrone

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


五、讲解示例代码

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

python 复制代码
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)

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

python 复制代码
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()

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

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

python 复制代码
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()
...            

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

python 复制代码
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))

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

python 复制代码
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)
...

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

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

python 复制代码
# 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
    

六、后记

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


🧸结尾


Tips

  1. 您发布的文章将会展示至 里程碑专区 ,您也可以在 专区 内查看其他创作者的纪念日文章
  2. 优质的纪念文章将会获得神秘打赏哦
相关推荐
小han的日常4 分钟前
pycharm分支提交操作
python·pycharm
乐悠小码5 分钟前
数据结构------队列(Java语言描述)
java·开发语言·数据结构·链表·队列
史努比.7 分钟前
Pod控制器
java·开发语言
敲敲敲-敲代码16 分钟前
游戏设计:推箱子【easyx图形界面/c语言】
c语言·开发语言·游戏
明月清风徐徐23 分钟前
Scrapy爬取豆瓣电影Top250排行榜
python·selenium·scrapy
theLuckyLong24 分钟前
SpringBoot后端解决跨域问题
spring boot·后端·python
ROC_bird..24 分钟前
STL - vector的使用和模拟实现
开发语言·c++
Yongqiang Cheng27 分钟前
Python operator.itemgetter(item) and operator.itemgetter(*items)
python·operator·itemgetter
MavenTalk30 分钟前
Move开发语言在区块链的开发与应用
开发语言·python·rust·区块链·solidity·move
FksLiao42 分钟前
Superset安装
python