150 lines
6.6 KiB
Python
150 lines
6.6 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
Intelligent scripting: Simplified operation process, detailed instructions can help flight control better take-off.
|
||
此脚本可设置精准航点,使无人机连续飞行到达指定目的地
|
||
|
||
"""
|
||
|
||
from __future__ import print_function
|
||
import time
|
||
from dronekit import connect, VehicleMode, LocationGlobalRelative
|
||
|
||
print("""
|
||
此脚本可设置精准航点,使无人机按照配置连续飞行到达指定目的地
|
||
|
||
version==1.0
|
||
|
||
/$$ /$$$$$$$$ /$$
|
||
| $$ | $$_____/| $$
|
||
/$$$$$$ /$$ /$$ /$$$$$$ /$$$$$$ | $$ | $$ /$$ /$$
|
||
|____ $$| $$ | $$|_ $$_/ /$$__ $$| $$$$$ | $$| $$ | $$
|
||
/$$$$$$$| $$ | $$ | $$ | $$ \ $$| $$__/ | $$| $$ | $$
|
||
/$$__ $$| $$ | $$ | $$ /$$| $$ | $$| $$ | $$| $$ | $$
|
||
| $$$$$$$| $$$$$$/ | $$$$/| $$$$$$/| $$ | $$| $$$$$$$
|
||
\_______/ \______/ \___/ \______/ |__/ |__/ \____ $$
|
||
/$$ | $$
|
||
| $$$$$$/
|
||
\______/
|
||
|
||
by:wwy
|
||
"""
|
||
|
||
)
|
||
|
||
# 通过本地的14551端口,使用UDP连接到SITL模拟器
|
||
connection_string ='127.0.0.1:14550' #'tcp:127.0.0.1:5760' #
|
||
print('正在连接无人机: %s' % connection_string)
|
||
# connect函数将会返回一个Vehicle类型的对象,即此处的vehicle
|
||
# 即可认为是无人机的主体,通过vehicle对象,我们可以直接控制无人机
|
||
vehicle = connect(connection_string, wait_ready=True)
|
||
|
||
# 定义arm_and_takeoff函数,使无人机解锁并起飞到目标高度
|
||
# 参数aTargetAltitude即为目标高度,单位为米
|
||
def arm_and_takeoff(aTargetAltitude):
|
||
# 进行起飞前检查
|
||
print("正在进行起飞前检查......")
|
||
# vehicle.is_armable会检查飞控是否启动完成、有无GPS fix、卡曼滤波器
|
||
# 是否初始化完毕。若以上检查通过,则会返回True
|
||
while not vehicle.is_armable:
|
||
print(" 无人机正在初始化,请等待......")
|
||
time.sleep(1)
|
||
|
||
# 解锁无人机(电机将开始旋转)
|
||
print("无人机初始化完毕,电机开始旋转")
|
||
# 将无人机的飞行模式切换成"GUIDED"(一般建议在GUIDED模式下控制无人机)
|
||
vehicle.mode = VehicleMode("GUIDED")
|
||
# 通过设置vehicle.armed状态变量为True,解锁无人机
|
||
vehicle.armed = True
|
||
|
||
# 在无人机起飞之前,确认电机已经解锁
|
||
while not vehicle.armed:
|
||
print(" 正在为无人机供电,请等待......")
|
||
time.sleep(1)
|
||
|
||
# 发送起飞指令
|
||
print("起飞!")
|
||
# simple_takeoff将发送指令,使无人机起飞并上升到目标高度
|
||
vehicle.simple_takeoff(aTargetAltitude)
|
||
|
||
# 在无人机上升到目标高度之前,阻塞程序
|
||
while True:
|
||
print(" 上升高度: ", 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("无人机已达到目标上升高度,随时准备行动")
|
||
break
|
||
# 等待1s
|
||
time.sleep(1)
|
||
|
||
# 调用上面声明的arm_and_takeoff函数,目标高度10m
|
||
takeoff_high = input("请输入飞行高度m: ")
|
||
arm_and_takeoff(float(takeoff_high))
|
||
|
||
# 设置在运动时,默认的空速为3m/s
|
||
air_speed = input("请设置无人机空中运行速度m/s: ")
|
||
# vehicle.airspeed变量可读可写,且读、写时的含义不同。
|
||
# 读取时,为无人机的当前空速;写入时,设定无人机在执行航点任务时的默认速度
|
||
vehicle.airspeed = float(air_speed)
|
||
|
||
# 发送指令,让无人机前往第一个航点
|
||
#time_fly = input("请设置飞行时间/秒: #无人机将在此时间过后前往下一处航点")
|
||
ground_speed_Q = input("是否设置地速[y/n]: ")
|
||
|
||
num = 1
|
||
record = []
|
||
while True:
|
||
# LocationGlobalRelative是一个类,它由经纬度(WGS84)和相对于home点的高度组成
|
||
# 这条语句将创建一个位于南纬35.361354,东经149.165218,相对home点高20m的位置
|
||
waypointS = input("请输入第" + str(num) + "个航点纬度,若退出任务请输入E,南纬: ")#则填写35.361354,149.165218,20
|
||
waypointE = input("请输入第" + str(num) + "个航点经度,若退出任务请输入E,东经: ")
|
||
waypointH = input("请输入第" + str(num) + "个航点高度,若退出任务请输入E,高度: ")
|
||
if waypointS == "E" or waypointE == "E" or waypointH == "E" or waypointS == "e" or waypointE == "e" or waypointH == "e":
|
||
break
|
||
point = LocationGlobalRelative(float(waypointS),float(waypointE),float(waypointH))
|
||
|
||
if ground_speed_Q == "y" or ground_speed_Q == "Y":
|
||
ground_speed = input("请设置无人机对地速度m/s: ")
|
||
# simple_goto将目标航点发送给无人机,groundspeed=10设置飞行时的地速为ground_speed
|
||
vehicle.simple_goto(point, groundspeed=float(ground_speed))
|
||
else:
|
||
# simple_goto函数将位置发送给无人机,生成一个目标航点
|
||
vehicle.simple_goto(point)
|
||
record.append(point)
|
||
num += 1
|
||
time.sleep(2)
|
||
#time.sleep(float(time_fly))
|
||
#vehicle.mode = VehicleMode("AUTO")
|
||
# simple_goto函数只发送指令,不判断有没有到达目标航点
|
||
# 它可以被其他后续指令打断,此处延时30s,即让无人机朝向point1飞行30s
|
||
#if time_fly == "n" or time_fly == "N":
|
||
# vehicle.mode = VehicleMode("AUTO")
|
||
#else:
|
||
# time.sleep(time_fly)
|
||
|
||
# 发送"返航"指令
|
||
print("飞行任务退出,无人机返回基地......")
|
||
# 返航,只需将无人机的飞行模式切换成"RTL(Return to Launch)"
|
||
# 无人机会自动返回home点的正上方,之后自动降落
|
||
vehicle.mode = VehicleMode("RTL")
|
||
#防止无人机继续向目的地飞行,将飞行模式调为可控,再返回基地
|
||
time.sleep(3)
|
||
vehicle.mode = VehicleMode("GUIDED")
|
||
vehicle.mode = VehicleMode("RTL")
|
||
|
||
filename = time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime()) + '.txt'
|
||
with open(filename, 'a') as file_object:
|
||
for i in range(len(record)):
|
||
file_object.write(str(i))
|
||
file_object.write(" ")
|
||
file_object.write(str(record[i]))
|
||
file_object.write("\n")
|
||
print("航点记录成功!")
|
||
# 退出之前,清除vehicle对象
|
||
print("......任务结束......")
|
||
vehicle.close()
|
||
|
||
|