Controlling Copter via dronekit
Import Require Modules
Connection
Takeoff
GPS
simple_takeoff(alt=None) : 起飛並將無人機飛行到指定的高度(以米為單位)。
- 此功能只能用於Copter。
- 必須是GUIDED模式。
- 當達到正確的高度時沒有通知機制,如果另一個命令在該點之前到達(例如simple_goto()),它將立刻改為運行simple_goto()指令。因此需要阻塞程式,比如利用while True:,確認到達目標才繼續下一個指令。
Without GPS
Go to designated location
simple_goto(位置,空速=無,地速=無)
轉到指定的全局位置(LocationGlobal或LocationGlobalRelative)。
當到達目標位置時沒有通知機制,如果另一個命令在該點之前到達將立即執行。
您可以選擇設置所需的空速或地速(這與設置airspeed或相同 groundspeed)。如果這些值未設置或兩者都設置,車輛將確定使用什麼速度。
- 必須是GUIDED模式,若當前不是GUIDED模式使用此指令將會強制轉換成GUIDED模式。
- 當到達目標位置時沒有通知機制,如果另一個命令在到達目的地前接收則將立即執行新命令。阻塞程序可以使用goto(如下)。
NED
Control the Copter by using (North, East, Down).
- The altitude of Drone positive you have to set the negative value because of the coordinate.
- First need to takeoff.
Set different frames for reference of coordinate.
Frame |
relative location |
Position orientation |
Speed orientation |
MAV_FRAME_LOCAL_NED |
Home |
NED |
NED |
MAV_FRAME_LOCAL_OFFSET_NED |
Vehicle |
NED |
NED |
MAV_FRAME_BODY_NED |
Home |
NED |
FRD |
MAV_FRAME_BODY_OFFSET_NED |
Vehicle |
FRD |
FRD |
- NED : North East Down
- FRD : Front Right Down
MAV_FRAME_LOCAL_NED
Altitude 5 meters
Goto North 5 meters and Altitude 5 meters,絕對座標(5,0)
Goto North 5 meters South 5 meters and Altitude 5 meters,絕對座標(5,-5)
此NED所用的是絕對座標,並不是相對座標,假設無人機到座標北5公尺東0公尺高度5公尺(5,0,-5),接著再給無人機(5,0,-5)是不會往北5公尺的,會停在原地。若要再往北5公尺則需要(10,0,-5)。
MAV_FRAME_LOCAL_OFFSET_NED
Altitude 5 meters
Goto North 5 meters and Altitude 5 meters,相對座標(5,0)
Goto North 5 meters South 5 meters and Altitude 5 meters,相對座標(5,-5)
LocationGlobal
class dronekit.LocationGlobal(lat,lon,alt=None)
緯度和經度是相對於WGS84坐標系的海拔高度與平均海平面 (MSL) 相關。
例如,海拔高度為 30 米:
LocationGlobalRelative
class dronekit.LocationGlobalRelative(lat,lon,alt=None )
緯度和經度是相對於WGS84坐標系的高度是相對於無人機的起始位置。
例如,LocationGlobalRelative高度高於home位置 30 米:
goto Function
前往目的地,計算當前位置與目的地位置的距離來阻塞程序。
Message Factory
Set attitude
設定姿態,我們需要用到歐拉角轉換四元數,來表示三維空間中無人機的姿態 (Roll, Pitch, Yaw)。
- Thrust > 0.5: Ascend
- Thrust = 0.5: Hold the altitude
- Thrust < 0.5: Descend
def send_attitude_target(roll_angle = 0.0, pitch_angle = 0.0,
yaw_angle = None, yaw_rate = 0.0, use_yaw_rate = False,
thrust = 0.5):
if yaw_angle is None:
yaw_angle = vehicle.attitude.yaw
msg = vehicle.message_factory.set_attitude_target_encode(
0,
1,
1,
0b00000000 if use_yaw_rate else 0b00000100,
to_quaternion(roll_angle, pitch_angle, yaw_angle),
0,
0,
math.radians(yaw_rate),
thrust
)
vehicle.send_mavlink(msg)
def set_attitude(roll_angle = 0.0, pitch_angle = 0.0,
yaw_angle = None, yaw_rate = 0.0, use_yaw_rate = False,
thrust = 0.5, duration = 0):
send_attitude_target(roll_angle, pitch_angle,
yaw_angle, yaw_rate, False,
thrust)
start = time.time()
while time.time() - start < duration:
send_attitude_target(roll_angle, pitch_angle,
yaw_angle, yaw_rate, False,
thrust)
time.sleep(0.1)
send_attitude_target(0, 0,
0, 0, True,
thrust)
def to_quaternion(roll = 0.0, pitch = 0.0, yaw = 0.0):
"""
Convert degrees to quaternions
"""
t0 = math.cos(math.radians(yaw * 0.5))
t1 = math.sin(math.radians(yaw * 0.5))
t2 = math.cos(math.radians(roll * 0.5))
t3 = math.sin(math.radians(roll * 0.5))
t4 = math.cos(math.radians(pitch * 0.5))
t5 = math.sin(math.radians(pitch * 0.5))
w = t0 * t2 * t4 + t1 * t3 * t5
x = t0 * t3 * t4 - t1 * t2 * t5
y = t0 * t2 * t5 + t1 * t3 * t4
z = t1 * t2 * t4 - t0 * t3 * t5
return [w, x, y, z]
Here is introduction of Eular Engle and Quaternions.
Yaw
設置偏航(Yaw),將無人機轉向。
- is_relative = 1 代表相對於行駛方向的偏航。
- is_relative = 0 代表絕對角度東西南北,0是北方,90是東方,180是南方。
- direction = 1 , 順時針旋轉
- direction = -1 ,逆時針旋轉
- heading 只有正的角度值
順時針旋轉
逆時針旋轉
一定要先有“移動”才能執行偏航指令否則會被忽略,若是要起飛後原地偏航須先給指令移動到原地的GPS位置。
Reference