Pixhawk无人机扩展教程(4)---使用Dronekit编写一个控制程序_from dronekit import connect, vehiclemode, locatio-程序员宅基地

技术标签: 无人机-苍穹四轴  

摘自:https://mp.weixin.qq.com/s/P1EVjYiZ_bS_Mmm9EyEX3g

Pixhawk无人机扩展教程(4)---使用Dronekit编写一个控制程序

原创 CJKK 苍穹四轴DIY 2020-02-12

上节教程使用Dronekit编写了第一个脚本,运行并读取飞控当前状态参数,详细请参考 《树莓派安装Dronekit及读取飞控数据》。有同学留言不太清楚每行脚本的意思,这节有必要先做个注释补充解释一下:

 


# 飞控软件版本

print "Autopilot Firmware version: %s" % vehicle.version

 

# 全球定位信息(经纬度,高度相对于平均海平面)

print "Global Location: %s" % vehicle.location.global_frame

 

# 全球定位信息(经纬度,高度相对于home点)

print "Global Location (relative altitude): %s" % vehicle.location.global_relative_frame

 

# 相对home点的位置信息(向北、向东、向下);解锁之前返回None

print "Local Location: %s" % vehicle.location.local_frame

 

# 无人机朝向(欧拉角:roll,pitch,yaw,单位为rad,范围-π到+π)

print "Attitude: %s" % vehicle.attitude

 

# 三维速度(m/s)

print "Velocity: %s" % vehicle.velocity

 

# GPS信息

print "GPS: %s" % vehicle.gps_0

 

# 地速(m/s)

print "Groundspeed: %s" % vehicle.groundspeed

 

# 空速(m/s)

print "Airspeed: %s" % vehicle.airspeed

 

# 云台信息(得到的为当前目标的roll, pitch, yaw,而非测量值。单位为度)

print "Gimbal status: %s" % vehicle.gimbal

 

# 电池信息

print "Battery: %s" % vehicle.battery

 

# EKF(拓展卡曼滤波器)状态

print "EKF OK?: %s" % vehicle.ekf_ok

 

# 超声波或激光雷达传感器状态

print "Rangefinder: %s" % vehicle.rangefinder

 

# 无人机朝向(度)

print "Heading: %s" % vehicle.heading

 

# 是否可以解锁

print "Is Armable?: %s" % vehicle.is_armable

 

# 系统状态

print "System status: %s" % vehicle.system_status.state

 

# 当前飞行模式

print "Mode: %s" % vehicle.mode.name

 

# 解锁状态

print "Armed: %s" % vehicle.armed

 

 


设置属性


少数的属性变量可以被设置,通过设置这些属性变量,可以控制无人机的运行状态。可设置的属性变量如下:

Vehicle.home_location

Vehicle.gimbal

Vehicle.airspeed

Vehicle.groundspeed

Vehicle.mode

Vehicle.armed

vehicle.disarmed

 

设置示例:

1.锁定无人机:

vehicle.disarmed = False

 

2.切换到GUIDED模式:

vehicle.mode = VehicleMode("GUIDED")

 

3.设置航点模式下,无人机飞行的地速为3.2m/s(注意:读、写groundspeed的意义不同)

vehicle.groundspeed = 3.2

 


读取参数


参数以字典(dictionary)的形式,存储在vehicle.parameters变量中。具体参数的名称即为相应的键值(key)。

 

例如,在屏幕上显示THR_MIN参数(THR_MIN代表油门处于最低时的电机怠速,以PWM值表示):

print "Param: %s" % vehicle.parameters['THR_MIN']

 

显示全部参数:

print "\nPrint all parameters (iterate `vehicle.parameters`):"

for key, value in vehicle.parameters.iteritems():

    print " Key:%s Value:%s" % (key,value)

 


设置参数


使用读取参数类似的方法,即可设置参数:

vehicle.parameters['THR_MIN']=100

 

以上只是截取了部分使用较多的知识点进行介绍,大家可以到官网查看详细的Dronekit教程。

 

 


下面我们根据官方示例编写一个程序,展示如何连接到无人机,控制无人机解锁后升空到10m,依次朝两个方向飞行30s,最后返回出发点并降落。

 

  1. 笔记本端通过ssh命令连接树莓派,在test文件夹下,新建example1.py文件:

     

cd test

touch example1.py

 

可以输入 ls 命令,查看是否新建好这个文件,如下所示:

图片

   

2.用 vim编辑文件:

sudo vim example1.py

 

将以下代码复制到文件中,中文注释也可一并复制:


#!/usr/bin/envpython 

# -*- coding: utf-8-*- 

 

"""

Copyright2015-2016, 3D Robotics.

simple_goto.py:GUIDED mode "simple goto" example (Copter Only)

Demonstrates how toarm and takeoff in Copter and how to navigate to points usingVehicle.simple_goto.

""" 

 

from __future__import print_function 

import time 

from dronekitimport connect, VehicleMode, LocationGlobalRelative 

 

 

# 改为当前连接的pixhawk飞控的端口 

connection_string ='/dev/ttyUSB0' 

print('Connectingto vehicle on: %s' % connection_string) 

# connect函数将会返回一个Vehicle类型的对象,即此处的vehicle 

# 即可认为是无人机的主体,通过vehicle对象,我们可以直接控制无人机 

vehicle =connect(connection_string, wait_ready=True,baud=921600) 

 

# 定义arm_and_takeoff函数,使无人机解锁并起飞到目标高度 

# 参数aTargetAltitude即为目标高度,单位为米 

defarm_and_takeoff(aTargetAltitude): 

    # 进行起飞前检查 

    print("Basic pre-armchecks") 

    # vehicle.is_armable会检查飞控是否启动完成、有无GPS fix、卡曼滤波器 

    # 是否初始化完毕。若以上检查通过,则会返回True

    while not vehicle.is_armable: 

        print(" Waiting for vehicle toinitialise...") 

        time.sleep(1) 

 

    # 解锁无人机(电机将开始旋转) 

    print("Arming motors") 

    # 将无人机的飞行模式切换成"GUIDED"(一般建议在GUIDED模式下控制无人机) 

    vehicle.mode =VehicleMode("GUIDED") 

    # 通过设置vehicle.armed状态变量为True,解锁无人机 

    vehicle.armed = True 

 

    # 在无人机起飞之前,确认电机已经解锁 

    while not vehicle.armed: 

        print(" Waiting forarming...") 

        time.sleep(1) 

 

    # 发送起飞指令 

    print("Taking off!") 

    # simple_takeoff将发送指令,使无人机起飞并上升到目标高度 

   vehicle.simple_takeoff(aTargetAltitude) 

 

    # 在无人机上升到目标高度之前,阻塞程序 

    while True: 

        print(" Altitude: ",vehicle.location.global_relative_frame.alt) 

        # 当高度上升到目标高度的0.95倍时,即认为达到了目标高度,退出循环 

        #vehicle.location.global_relative_frame.alt为相对于home点的高度 

        if vehicle.location.global_relative_frame.alt>= aTargetAltitude * 0.95: 

            print("Reached targetaltitude") 

            break 

        # 等待1s 

        time.sleep(1) 

 

# 调用上面声明的arm_and_takeoff函数,目标高度10m 

arm_and_takeoff(10) 

 

# 设置在运动时,默认的空速为3m/s 

print("Setdefault/target airspeed to 3") 

# vehicle.airspeed变量可读可写,且读、写时的含义不同。 

# 读取时,为无人机的当前空速;写入时,设定无人机在执行航点任务时的默认速度 

vehicle.airspeed =3 

 

# 发送指令,让无人机前往第一个航点 

print("Goingtowards first point for 30 seconds ...") 

#LocationGlobalRelative是一个类,它由经纬度(WGS84)和相对于home点的高度组成 

# 这条语句将创建一个位于南纬35.361354,东经149.165218,相对home点高20m的位置 .注意:如要实际测试,此处的经纬度需要改成你当前测试位置的经纬度,不然飞机飞跑了!!!

point1 =LocationGlobalRelative(-35.361354, 149.165218, 20) 

# simple_goto函数将位置发送给无人机,生成一个目标航点 

vehicle.simple_goto(point1) 

 

# simple_goto函数只发送指令,不判断有没有到达目标航点 

# 它可以被其他后续指令打断,此处延时30s,即让无人机朝向point1飞行30s 

time.sleep(30) 

 

# 发送指令,让无人机前往第二个航点 

print("Goingtowards second point for 30 seconds (groundspeed set to 10 m/s) ...") 

# 与之前类似,这条语句创建了另一个相对home高20m的点。 注意:同理,如要实际测试,此处的经纬度也需要改成你当前测试位置的经纬度!!!

point2 =LocationGlobalRelative(-35.363244, 149.168801, 20) 

# simple_goto将目标航点发送给无人机,groundspeed=10设置飞行时的地速为10m/s 

vehicle.simple_goto(point2,groundspeed=10) 

 

# 与之前一样,延时30s 

time.sleep(30) 

 

# 发送"返航"指令 

print("Returningto Launch") 

# 返航,只需将无人机的飞行模式切换成"RTL(Return to Launch)" 

# 无人机会自动返回home点的正上方,之后自动降落 

vehicle.mode =VehicleMode("RTL") 

 

# 退出之前,清除vehicle对象 

print("Closevehicle object") 

vehicle.close() 

 

图片

 

 


以上代码编辑保存好以后,执行 python example1.py很大程度上是无法正常运行的,主要有以下几个原因:

  1. 如果是在室内,GPS无法定位,也就无法切换到Guided模式(引导),起飞前的自检是不能通过的,就像如下这个样子,会一直等待解锁:

     

    图片结束进程请使用 CTRL+C。

 

 

 

2.注意:如果要在室外测试,请务必修改航点1和航点2的经纬度数据,示例里面的经纬度在堪培拉,否则飞机一去不复返。。。

 

做到这里肯定有同学会问:既然在室内又不能测试,那怎么知道执行效果如何?无人机执行动作是否和设计的初衷一致?怎样安全的验证代码的正确性?要解决这些实际问题,就需要用到SITL在环仿真。下节教程我们就介绍这些内容。

疫情期间大家务必少出门,勤洗手,多通风!也是难得有闲时间可以宅在家里学习一下以上教程。希望疫情尽快结束,回归正常状态。请大家继续关注!

 

 

 


图片

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_16643223/article/details/113793482

智能推荐

南方CASS软件VB二次开发之一安装软件以及调出VB编辑器_cass加载vba-程序员宅基地

文章浏览阅读341次。南方CASS软件VB二次开发之一安装软件_cass加载vba

5个最流行的IFC文件分析工具_bimant ifc viewer-程序员宅基地

文章浏览阅读796次,点赞22次,收藏10次。分析行业基础类 (IFC) 文件是确保建筑信息模型 (BIM) 数据准确性和一致性的关键步骤。在验证这些文件期间需要考虑各个方面,以避免错误并确保项目的最佳运行。在本文中,我们将介绍验证 IFC 文件的五种有效方法,帮助你对 IFC 文件的质量充满信心,这对于设计和施工基础设施管理领域的高效工作至关重要。_bimant ifc viewer

电脑中打不开VMware虚拟机提示权限不足无法访问文件如何解决_虚拟机权限不足怎么解决-程序员宅基地

文章浏览阅读1.4w次。问题描述建立虚拟Ubuntu系统后,可能会需要将Ubuntu系统移植到其他电脑上或拷给客户。会出现在电脑中无法打开VMware虚拟机,会弹出一个提示“权限不足,无法访问文件”。如果遇到上述问题,虚拟机系统无法启动。自己的忘了截了,用网上的图代替解决方案1、右击以管理员身份运行VMware;2、如果弹出提示则点击“是”;3、打开后点击“开启此虚拟机”,或者点击菜单栏中..._虚拟机权限不足怎么解决

二维数组转稀疏矩阵然后以json格式保存文件中,读取之后重新转换成二维数组_json存储矩阵-程序员宅基地

文章浏览阅读581次。1、稀疏矩阵1.1、简介如果要创建一个二维数组保存的话会有无意义数据,所以我们需要创建一个能使用较小的占用空间的稀疏矩阵来存储。稀疏矩阵的处理方法: 记录数组一个共有几行几列,有多少个不同值 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 第一行 6行 7列 8个有效数据 后面的每一行都是一个有效值 1...._json存储矩阵

Xcode上传源码到github_xcode提交github远程库-程序员宅基地

文章浏览阅读485次。命令行结合xcode提交源码到github的详细步骤_xcode提交github远程库

Redis的典型应用场景_redis应用场景-程序员宅基地

文章浏览阅读1.6w次,点赞28次,收藏157次。参考博客[1]https://www.toutiao.com/i6636576359931970062/_redis应用场景

随便推点

华为工业云平台:制造业企业数据平台建设最佳实践分享_华为云数字工厂企业平台-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏10次。本文素材来自于华为工业云平台组织的工业数字化大讲堂,本期主题为:制造业企业数据平台建设最佳实践分享。我们将从制造业的发展趋势出发,分享华为云在制造领域里建设数据平台的最佳实践,帮助企业解决在数字化转型中面临的挑战,并结合华为云数据平台架构设计和数据应用等方面的丰富经验,助力企业挖掘数据价值、驱动数字化转型、创造发展新机会。_华为云数字工厂企业平台

python格式化符号、转义字符、结束符号_python格式符号什么意思-程序员宅基地

文章浏览阅读3.9k次,点赞3次,收藏4次。一、格式化符号含义格式符号 转换 %s 字符串 %d 有符号的十进制数 %f 浮点数 %c 字符 %u 无符号的十进制数 %o 八进制整数 %x 十六进制整数(小写ox) %X 十六进制整数(大写OX) %e 科学计数法(小写‘e’) %E 科学计数法(大写‘E’) %g %f和%e的简写 %G %f和%E的简写 ..._python格式符号什么意思

算法设计与分析知识点整理-程序员宅基地

文章浏览阅读1.3w次,点赞73次,收藏730次。本文是针对算法设计与分析这门课的知识点整理,内容多来源于教科书以及我看到的一些优秀博文,其中我最推崇是《labuladong的算法小抄》,它的内容让我眼前一亮,不同于教科书的死板套路,它从不一样的角度去解读学习算法,语言通俗易懂,让我受益匪浅。我特别喜欢其中说的一句话计算机解决问题其实没有任何奇技淫巧,它唯一的解决办法就是穷举,穷举所有可能性。算法设计无非就是先思考“如何穷举”,然后再追求“如何聪明地穷举”。_算法设计与分析

机器学习----第三章线性模型 学习笔记_f(x,θ)=wtx+b 符号是什么意思-程序员宅基地

文章浏览阅读299次。引入线性模型:给定由d个属性描述的示例,线性模型试图学得一个通过属性的线性组合来进行预测的函数。f(x) = wTx+b线性回归试图学得一个线性模型以尽可能准确的预测实值输出标记,公式:f(xi) = wxi + b,使得f(xi) ≈ yi方法我们的任务就是求出w和b,可用均方误差最小化的方法,基于均方误差最小化来进行模型求解的方法称为最小二乘法,在线性回归中,最小二乘法就是试图找到一条直线,使得所有样本到达直线的欧氏距离最小。除了利用线性模型进行回归学习,也可以利用线性模型处理分类任务,我_f(x,θ)=wtx+b 符号是什么意思

ASP.NET编码 _new streamwriter unicode-程序员宅基地

文章浏览阅读1.1k次。乱码-我们心中的痛!• “字符与编码”是一个被经常讨论的话题。即使这样,时常出现的乱码仍然困扰着大家。虽然我们有很多的办法可以用来消除乱码,但我们并不一定理解这些办法的内在原理。而有的乱码产生的原因,实际上由于底层代码本身有问题所导致的。• 因此,不仅是初学者会对字符编码感到模糊,有的底层开发人员同样对字符编码缺乏准确的理解。字符与编码的发展字符串在内存中的存放方法• 在A_new streamwriter unicode

牛客算法题——NC15553 数学考试【所用算法:前缀和】_代码算法题目nc是什么-程序员宅基地

文章浏览阅读201次,点赞2次,收藏4次。链接:https://ac.nowcoder.com/acm/problem/15553来源:牛客网题目描述今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,qwb并不打算把这些题全做完,他想选总共2k道题来做,并且期望他能获得的分数尽可能的大,他准备选2个不连续的长度为k的区间,即[L,L+1,L+2,…,L+k-1],[R,R+1,R+2,…,R+k-1](R >= L+k)。输入描述:第一行一个整数T(T<=10),代表有T组数据接下来一行_代码算法题目nc是什么