Files
RflySimhighschool/基础编程/e7.Offboard模式介绍及控制实验/code/OffboardCircle.py
2025-07-25 17:04:14 +08:00

90 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# import required libraries
# pip3 install pymavlink pyserial
import cv2
import numpy as np
import time
import VisionCaptureApi
import PX4MavCtrlV4 as PX4MavCtrl
import math
import ReqCopterSim
req = ReqCopterSim.ReqCopterSim() # 获取局域网内所有CopterSim程序的电脑IP列表
StartCopterID = 1 # 初始飞机的ID号
TargetIP = req.getSimIpID(StartCopterID) # 获取CopterSim的1号程序所在电脑的IP作为目标IP
# 注意如果是本电脑运行的话那TargetIP是127.0.0.1的本机地址如果是远程访问则是192打头的局域网地址。
# 因此本程序能同时在本机运行,也能在其他电脑运行。
VehilceNum = 1
MavList=[]
# Create MAV instance
for i in range(VehilceNum):
CopterID=StartCopterID+i # 当前配置的飞机序号
TargetIP = req.getSimIpID(CopterID) # 获取对应的电脑IP
req.sendReSimIP(CopterID) # 请求回传数据到本电脑
time.sleep(1)
MavList = MavList+[PX4MavCtrl.PX4MavCtrler(CopterID,TargetIP)] # 初始化并建立i号飞机的MAVLink通信连接
time.sleep(2)
# Start MAV loop with UDP mode: MAVLINK_FULL
for i in range(VehilceNum):
MavList[i].InitMavLoop()
# Enter Offboard mode to start vehicle control
time.sleep(2)
for i in range(VehilceNum):
MavList[i].initOffboard()
# Get the takeoff position of each vehicle to the UE4 Map
# this can be adopted to obtain the global position of a vehicle in swarm simulation
time.sleep(2)
Error2UE4Map=[]
for i in range(VehilceNum):
mav=MavList[i]
Error2UE4Map = Error2UE4Map+[-np.array([mav.uavGlobalPos[0]-mav.uavPosNED[0],mav.uavGlobalPos[1]-mav.uavPosNED[1],mav.uavGlobalPos[2]-mav.uavPosNED[2]])]
# fly to 10m high above its takeoff position
for i in range(VehilceNum):
MavList[i].SendPosNED(0, 0, -10, 0)
time.sleep(10)
lastTime = time.time()
startTime = time.time()
timeInterval = 1/30.0 #here is 0.0333s (30Hz)
while True:
lastTime = lastTime + timeInterval
sleepTime = lastTime - time.time()
if sleepTime > 0:
time.sleep(sleepTime) # sleep until the desired clock
else:
lastTime = time.time()
# The following code will be executed 30Hz (0.0333s)
t=time.time()-startTime
for j in range(VehilceNum):
mav=MavList[j]
# target position in UE4 map global frame
if t<10:
targetPosE=np.array([-0,0,-15]) # fly to 15 meters high in 0 to 10s
else: #fly circle after 10s
targetPosE=np.array([10*math.sin(t/2+math.pi/2)-10,10*math.sin(t/2.0),-15])
# target position in vehilce takeoff frame
targetPosE=targetPosE+Error2UE4Map[j]
mav.SendPosNED(targetPosE[0],targetPosE[1],targetPosE[2],0)
if t>200: # end simulation when 200s
break
for i in range(VehilceNum):
MavList[i].endOffboard()
time.sleep(1)
for i in range(VehilceNum):
MavList[i].stopRun()