无人机/飞控--ArduPilot、PX4学习记录(5)

这几天看dronekit,做无人机失控保护。


PX4官网上的经典案例,我做了很多注解,把代码过了一遍。

无人机具体执行了: 先起飞,飞至正上空10m->向北移动10m->向东移动10m->向南移动10m->向西移动10m->回到初始起飞点(即home点),降落。

具体执行之前,要打开JMAVSim,接下来会在JMAVSim上看到无人机仿真效果:

代码+详细注解:

#####################################
# @File DroneKitPX4.py
# Example usage of DroneKit with PX4
# @author Sander Smeets <sander@droneslab.com>
# Code partly based on DroneKit (c) Copyright 2015-2016, 3D Robotics.
################################# Import DroneKit-Python
#库:提供与无人机通信、解析命令行参数、进行数学运算功能#dronekit:通过MAVLink协议与自动驾驶系统(如PX4)进行通信,控制无人机
from dronekit import connect, Command, LocationGlobal#pymavlink:用于解析和生成MAVLink消息
from pymavlink import mavutil#分别用于时间处理、系统调用、命令行参数解析、数学运算
import time, sys, argparse, math#----------------------------------------------------
# Settings设置
connection_string = '127.0.0.1:14540' #字符串:连接到无人机的地址和端口MAV_MODE_AUTO = 4 #定义无人机自动飞行模式的代码,设置为4
MAV_MODE_POSHOLD = 5 #定点模式,设置为5
MAV_MODE_STABILIZE = 6 #自稳模式,设置为6# https://github.com/PX4/Firmware/blob/master/Tools/mavlink_px4.py#------------------------------------------------------------
# Parse connection argument解析命令行参数
#使用argparse库,允许用户通过过命令行参数来指定连接字符串。
parser = argparse.ArgumentParser()
parser.add_argument("-c", "--connect", help="connection string")
args = parser.parse_args()#若用户提供-c或--connect参数,那么connection_string会被更新为用户的输入
if args.connect:connection_string = args.connect#------------------------------------------------------------
# Init 初始化  ;Connect to the Vehicle 连接到无人机
print ("Connecting")# 使用dronekit中的connect函数连接到无人机
# wait_ready=True表示在继续执行代码前,程序会等待无人机准备好
vehicle = connect(connection_string, wait_ready=True)#PX4setMode(mavMode):设置无人机模式 使用MAVLink协议向无人机发送命令
def PX4setMode(mavMode):# 使用 pymavlink 的 command_long_send 方法向无人机发送一个 MAV_CMD_DO_SET_MODE 命令# 告诉无人机切换到指定的飞行模式(由 mavMode 参数指定)'''vehicle._master.target_system:MAVLink消息的目标系统ID,对于连接到本地地面站的无人机,通常为1vehicle._master.target_component:MAVLink消息的目标组件ID,向无人机的某个特定组件发送命令。通常为0mavutil.mavlink.MAV_CMD_DO_SET_MODE:MAVLink命令的ID,表示要执行的具体操作,用于请求无人机切换到指定的飞行模式0:确认标志,0表示不需要任何确认mavMode:想要无人机进入的飞行模式,是PX4setMode函数的输入参数,表示想要设置的飞行模式代码(手动、稳定、自动模式等)(0, 0, 0, 0, 0, 0):额外的参数对于MAV_CMD_DO_SET_MODE命令不是必需的,这些参数可能包含额外的信息如目标位置、速度或方向'''vehicle._master.mav.command_long_send(vehicle._master.target_system, vehicle._master.target_component,mavutil.mavlink.MAV_CMD_DO_SET_MODE, 0,mavMode,0, 0, 0, 0, 0, 0)#计算偏移位置--------------------------------------------------------------------
#根据给定原始位置、北偏移量、东偏移量和高度,计算新的全球位置。使用地球的半径来计算偏移量
def get_location_offset_meters(original_location, dNorth, dEast, alt):"""original_location:原始位置,包括经度 纬度 高度dNorth:向北偏移量(以米为计算单位)dEast:向东偏移量alt:高度Returns a LocationGlobal object containing the latitude/longitude `dNorth` and `dEast` metres from thespecified `original_location`. The returned Location adds the entered `alt` value to the altitude of the `original_location`.The function is useful when you want to move the vehicle around specifying locations relative tothe current vehicle position.The algorithm is relatively accurate over small distances (10m within 1km) except close to the poles.For more information see:http://gis.stackexchange.com/questions/2951/algorithm-for-offsetting-a-latitude-longitude-by-some-amount-of-meters"""earth_radius=6378137.0 #Radius of "spherical" earth 地球半径的近似值#Coordinate offsets in radians#计算纬度、经度偏移量dLat = dNorth/earth_radius #将向北的偏移量除以地球半径,将米转换为弧度dLon = dEast/(earth_radius*math.cos(math.pi*original_location.lat/180))#计算向东的偏移量#New position in decimal degrees计算新的纬度和经度# 将弧度偏移量转换回十进制度,并加到原始位置的纬度和经度上newlat = original_location.lat + (dLat * 180/math.pi)newlon = original_location.lon + (dLon * 180/math.pi)#使用新的纬度和经度以及调整后的高度(原始高度加上输入的高度)来创建一个新的LocationGlobal对象,并返回return LocationGlobal(newlat, newlon,original_location.alt+alt)
#-----------------------------------------------------------------------------#---------------------------------------------------------
# Listeners  设置监听器
#定义全局变量home_position_set 标记是否已经收到无人机home位置的信息
home_position_set = False#Create a message listener for home position fix
@vehicle.on_message('HOME_POSITION') #使用装饰器 创建一个监听器#该监听器(装饰器)会在收到HOME_POSITION消息时被调用
def listener(self, name, home_position):global home_position_set #全局变量#当接收到此消息时,listener函数会将home_position_set设置为Truehome_position_set = True
#--------------------------------------------------------#--------------------------------------------------------
# Start mission example
# wait for a home position lock 等待home位置锁定
while not home_position_set:#持续循环检查home_position_set是否为Trueprint ("Waiting for home position...")#尚未收到home位置消息,等待一秒钟。确保无人机获得home位置后才能继续执行time.sleep(1)
#--------------------------------------------------------------#--------------------------------------------------------------
# Display basic vehicle state显示无人机状态
print (" Type: %s" % vehicle._vehicle_type) #类型
print (" Armed: %s" % vehicle.armed) #武装状态
print (" System status: %s" % vehicle.system_status.state)#系统状态
print (" GPS: %s" % vehicle.gps_0)#GPS状态
print (" Alt: %s" % vehicle.location.global_relative_frame.alt) #海拔高度
#--------------------------------------------------------------#--------------------------------------------------------------
# Change to AUTO mode 切换到自动模式/定点模式/自稳模式
#使用先前定义的PX4setMode函数将无人机切换到自动飞行模式MAV_MODE_AUTO
PX4setMode(MAV_MODE_AUTO)#PX4setMode(MAV_MODE_POSHOLD) #设置为定点模式#PX4setMode(MAV_MODE_STABILIZE) #设置为自稳模式time.sleep(1) #为确保模式切换生效,程序暂停一秒
#-----------------------------------------------------------------#---------------------------------------------------------------
# Load commands 清楚飞行命令并获取home位置
cmds = vehicle.commands #获取无人机的飞行命令对象
cmds.clear() #清除之前所有的命令 为准备加载新的飞行计划#获取无人机当前home位置(起飞点或归位点)
home = vehicle.location.global_relative_frame
#---------------------------------------------------------------#-----------------------------------------------------------------
# 设置无人机飞行任务-起飞、移动、降落 并上传这些任务到无人机# 1.takeoff to 10 meters 起飞至10米
# get_.._meters函数根据home位置(起飞点),计算新位置 偏移量为向东0米、向北0米、向上10米。这将是无人机起飞的目标位置
wp = get_location_offset_meters(home, 0, 0, 10);#Command创建一个无人机命令对象,用于指示无人机起飞。
#这里使用了MAV_CMD_NAV_TAKEOFF命令,并指定了目标位置的经纬度和高度
'''
0: Command 的序列号,通常情况下可以将其设置为 0。
0: 系统 ID,表示指令发送者的系统 ID。
0: 组件 ID,表示指令发送者的组件 ID。
mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT: 定义了航点的参考坐标系,此处为全球相对高度坐标系。
mavutil.mavlink.MAV_CMD_NAV_TAKEOFF: 起飞命令的 ID,指示无人机执行起飞动作。
0: 确认/重发标志位,通常设置为 0。
1: 参数 1,此处表示起飞的最小高度(单位:米)。
0,0,0,0,0: 参数 2-6,通常设置为 0。
wp.lat: 航点的纬度坐标
wp.lon: 航点的经度坐标
wp.alt: 航点的高度
'''
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)cmds.add(cmd) #将起飞命令添加到飞行命令列表中# 2.move 10 meters north向北移动10米
#根据前一个命令的结束位置计算新的位置wp:偏移量为向北10m,向东0m,向上0m   (wp,北,东,上)
wp = get_location_offset_meters(wp, 10, 0, 0);#创建无人机命令对象MAV_CMD_NAV_WAYPOINT,指示无人机移动到新的位置
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)#将移动命令添加到飞行命令列表中# 3.move 10 meters east向东移动10米
wp = get_location_offset_meters(wp, 0, 10, 0);
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)#将移动命令添加到飞行命令列表中# 4.move 10 meters south向南移动10米
wp = get_location_offset_meters(wp, -10, 0, 0);
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)#将移动命令添加到飞行命令列表中# 5.move 10 meters west向西移动10米
#根据前一个命令的结束位置计算新位置:偏移量为向东0m,向北-10(向南10米),向上0米
wp = get_location_offset_meters(wp, 0, -10, 0);#创建无人机命令对象,指示无人机向西移动
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)#将移动命令添加到飞行命令列表中# 6.land 降落 先回到起始home位置
#计算降落位置,偏移量为相对于起飞点home:向东0m,向北0m,向上10m.实际上是在起飞点上方10米处降落
wp = get_location_offset_meters(home, 0, 0, 10);#创建无人机命令对象,指示无人机降落。使用的是MAV_CMD_NAV_LAND命令
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_LAND, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)#将移动命令添加到飞行命令列表中
#----------------------------------------------------------------------------------------#----------------------------------------------------------------# Upload mission 上传任务
cmds.upload() #将命令列表上传到无人机
time.sleep(2) #等待两秒,确保无人机有足够的时间来处理上传的飞行任务# Arm vehicle 武装无人机
vehicle.armed = True #True意味着无人机现在处于武装状态,可执行飞行任务# monitor mission execution监控无人机执行任务的过程
nextwaypoint = vehicle.commands.next #初始化nextwaypoint变量为当前无人机正在执行的命令的索引#此循环会一直运行 直到无人机完成了所有的飞行命令
while nextwaypoint < len(vehicle.commands):#检查无人机是否已经开始执行下一个命令if vehicle.commands.next > nextwaypoint:#计算并显示无人机将要移动到的命令的序号(从1开始记号)display_seq = vehicle.commands.next+1#打印无人机将要移动到的命令序号print ("Moving to waypoint %s" % display_seq)#更新nextwaypoint变量为无人机当前正在执行的命令的索引nextwaypoint = vehicle.commands.nexttime.sleep(1) #每次循环后等待1s,避免过度占用处理器资源,允许无人机有时间执行命令# wait for the vehicle to land 等待无人机降落
while vehicle.commands.next > 0: #循环结束至无人机完成了最后一个命令time.sleep(1)  #每次循环后等待1s,允许无人机有时间执行命令# Disarm vehicle 接触无人机武装
vehicle.armed = False#将无人机armed属性设为False,无人机现处于非武装状态,不能执行飞行任务#这通常是在无人机完成任务并安全降落后进行的
time.sleep(1) #等待1s,允许无人机有时间处理武装状态的改变# Close vehicle object before exiting script关闭无人机
vehicle.close() #关闭与无人机的连接,释放相关资源
time.sleep(1) #等待一秒,确保关闭过程完成

保存几个网站:

px4官方文档:安全配置(故障保护) | PX4 自动驾驶用户指南 (v1.12)

雷迅教程:遥控器失控保护 · copter (cuav.net)

pix2.4.8教程:配件接线 · GitBook

阿木实验室 疑难杂症:pixhawk飞控使用及常见问题解决方法 持续更新-硬件产品-Amovlab阿木实验室-让机器人研发更高效! -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql题目5

tj11&#xff1a; select max(c.teacher_age) 最大的年龄 from tb_teacher c tj12: select a.class_name 班级名称,b.student_name 学生姓名,b.gender 学生性别 from tb_class a join tb_student b on a.class_idb.class_id join tb_teacher c on a.teacher_idc.teacher_id w…

kubekey 离线安装harbor、k8s、kubesphere

目录 参考文献 了解kubekey 英文和中文 前提条件 部署准备 下载kubukey 离线包配置和制作 配置离线包 制作离线包 离线安装集群 复制KubeKey 和制品 artifact到离线机器 创建初始换、安装配置文件 安装镜像仓库harbor 初始化harbor 项目 修改配置文件 安装k8s集…

实战--------部署搭建ELFK+zookeeper+kafka架构

目录 一、部署jdk环境 二、搭建Elasticsearch 三、搭建logstash 四、搭建kibana服务 五、搭建filebeat服务 六、搭建zookeeper与kafka服务 七、部署ELFKzookeeperkafka Filebeat/Fluentd&#xff1a;负责从各服务器节点上实时收集日志数据&#xff0c;Filebeat轻量级&am…

面试八股——Spring——AOP与事务

AOP的定义 事务的实现 事务的失效场景 异常捕获处理 下图中由于②导致异常&#xff1a; 原因&#xff1a; 解决办法&#xff1a;自己抛出一个非检查异常&#xff08;具体原因看“抛出检查异常”&#xff09;。 抛出检查异常 由于①出错&#xff0c;导致抛出了检查异常 原因&…

[通俗易懂:Linux标准输入/输出和重定向]Shell脚本之 > /dev/null 2>1命令详解

目录标题 一、> /dev/null 2>&1 命令解析二、/dev/null 文件浅显理解三、标准输入、标准输出、标准错误输出四、输入重定向、输出重定向五、命令作用与应用场景 如果想看命令意义&#xff0c;可以直接跳到第五部分 一、> /dev/null 2>&1 命令解析 我们在别…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒解密步骤

网络技术的不断应用与发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;利用网络可以开展各项工作业务&#xff0c;可以大大提高企业的生产效率&#xff0c;然而&#xff0c;网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业的数据安全带来…

常见的Linux命令

linux操作系统 ctrl鼠标滚动 放大缩小字体 cd /目录进入目录下 ls查看当前目录下的所有内容 tar -zxvf 压缩包名字 对压缩包进行解压 sync将数据由内存同步到硬盘上 shutdown关机指令 shutdown -h 10 /10 表示十分钟后关机 shutdown -h now 表示现在关机 shutdown -h…

英语新概念2-回译法-lesson6

我刚刚搬家去柏林大街的房子里。昨天一个流浪汉敲我的门,他想我寻求一顿饭和一杯啤酒。未拒绝了这个请求之后,这个流浪汉倒立着唱歌,我给他了一顿饭,他吃了食物并且喝了啤酒,然后他把一片奶酪放到他的口袋里然后走开了。过了一会儿,一个领居告诉我关于这个流浪汉的事情。…

Centos7 K8S 集群 - kubeadm搭建方式

机器准备 搭建环境是centos7, 四核心4G内存四台机器 一个master节点&#xff0c;一个etcd&#xff0c;两台node 机器名称IP 地址master192.168.1.127node1192.168.1.129node2192.168.1.130node3192.168.1.131 机器时间同步 各节点时间要求精确同步&#xff0c;可以直接联网…

算法设计与分析(超详解!) 第二节 递归与分治

1.递归定义 直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。 由分治法产生的子问题往往是原问题的较小模式&#xff0c;这就为使用递归技术提供了方便。在这种情况下&#xff0c;反复应用分治手段&#xff0c;可以使子问题与原问题类型一致…

LeetCode-热题100:226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a; root [4,2,7,1,3,6,9] 输出&#xff1a; [4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a; root [2,1,3] 输出&#xff1a; […

GlusterFS 分布式文件系统 搭建及使用

一、GlusterFS GlusterFS 是一个开源的分布式文件系统&#xff0c;旨在提供高性能、可扩展性和可靠性&#xff0c;适用于现代数据中心和云环境。它以横向扩展的方式设计&#xff0c;可以在多台服务器之间共享文件系统&#xff0c;为应用程序提供统一的文件存储服务。 Gluster…

【C 数据结构】线性表

文章目录 【 1. 线性表 】【 2. 顺序存储结构、链式存储结构 】【 3. 前驱、后继 】 【 1. 线性表 】 线性表&#xff0c;全名为线性存储结构&#xff0c;线性表结构存储的数据往往是可以依次排列的&#xff08;不考虑数值大小顺序&#xff09;。 例如&#xff0c;存储类似 {1…

蓝桥杯-数组分割

问题描述 小蓝有一个长度为 N 的数组 A 「Ao,A1,…,A~-1]。现在小蓝想要从 A 对应的数组下标所构成的集合I 0,1,2,… N-1 中找出一个子集 民1&#xff0c;那么 民」在I中的补集为Rz。记S∑reR 4&#xff0c;S2∑rERA,&#xff0c;我们要求S、和 S,均为偶数&#xff0c;请问在这…

c语言-----数组知识汇总

前言 本文为我学习数组知识点之后&#xff0c;对c语言的数组部分进行的知识点汇总。 简单数组介绍 简单来说&#xff0c;数组就是一个数据组&#xff0c;像一个箱子&#xff0c;里面放有多个数据。 [1,2,3,4,5] 数组的定义 基础定义 语法&#xff1a; 数据类型 数组名[数组…

代码随想录-算法训练营day12【休息,复习与总结】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 ● day 12 周日休息&#xff08;4.14&#xff09; 目录 复习与总结 0417_图论-太平洋大西洋水流问题 0827_图论-最大人工岛 复习与总结 二刷做题速度提升了一大截&#xff0c;ヾ(◍∇◍)&#xff89;&#xff9e;加…

基于SpringBoot实现的在线拍卖系统

系统开发环境 编程语言&#xff1a;Java数据库&#xff1a;MySQL容器&#xff1a;Tomcat工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统实现 管理员功能模块 首页 修改密码 用户管理 商品类型管理 拍卖商品 竞拍公告 轮播图 历史竞拍管理 竞拍订单管理 留言板管理 用户…

多输入多输出 | Matlab实现XGboost多输入多输出预测

多输入多输出 | Matlab实现XGboost多输入多输出预测 目录 多输入多输出 | Matlab实现XGboost多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现XGboost多输入多输出预测 1.data为数据集&#xff0c;10个输入特征&#xff0c;3个输出变量…

使用 vue3-sfc-loader 加载远程Vue文件, 在运行时动态加载 .vue 文件。无需 Node.js 环境,无需 (webpack) 构建步骤

加载远程Vue文件 vue3-sfc-loader vue3-sfc-loader &#xff0c;它是Vue3/Vue2 单文件组件加载器。 在运行时从 html/js 动态加载 .vue 文件。无需 Node.js 环境&#xff0c;无需 (webpack) 构建步骤。 主要特征 支持 Vue 3 和 Vue 2&#xff08;参见dist/&#xff09;仅需…

UDP实现Mini版在线聊天室

实现原理 只有当客户端先对服务器发送online消息的时候&#xff0c;服务器才会把客户端加入到在线列表。当在线列表的用户发消息的时候&#xff0c;服务器会把消息广播给在线列表中的所有用户。而当用户输入offline时&#xff0c;表明自己要下线了&#xff0c;此时服务器把该用…