获取相机类型
CAMERA_TYPE
mavlink消息:
接收PARAM_REQUEST_READ
发送PARAM_VALUE
参数:E_DjiCameraType
| 名称 | 枚举值 | 说明 |
|---|---|---|
| DJI_CAMERA_TYPE_UNKNOWN | 0 | 未知相机类型 |
| DJI_CAMERA_TYPE_Z30 | 20 | Z30 相机 |
| DJI_CAMERA_TYPE_XT2 | 26 | XT2 相机 |
| DJI_CAMERA_TYPE_PSDK | 31 | 基于 PSDK 的第三方相机 |
| DJI_CAMERA_TYPE_XTS | 41 | XTS 相机 |
| DJI_CAMERA_TYPE_H20 | 42 | H20 相机 |
| DJI_CAMERA_TYPE_H20T | 43 | H20T 相机 |
| DJI_CAMERA_TYPE_P1 | 50 | P1 相机 |
| DJI_CAMERA_TYPE_L1 | 51 | L1 相机 |
| DJI_CAMERA_TYPE_M30 | 52 | M30 相机 |
| DJI_CAMERA_TYPE_M30T | 53 | M30T 相机 |
| DJI_CAMERA_TYPE_H20N | 61 | H20N 相机 |
| DJI_CAMERA_TYPE_M3E | 66 | M3E 相机 |
| DJI_CAMERA_TYPE_M3T | 67 | M3T 相机 |
| DJI_CAMERA_TYPE_M3TA | 68 | M3TA 相机 |
| DJI_CAMERA_TYPE_M3D | 80 | Matrice 3D 相机 |
| DJI_CAMERA_TYPE_M3TD | 81 | Matrice 3TD 相机 |
| DJI_CAMERA_TYPE_H30 | 82 | H30 相机 |
| DJI_CAMERA_TYPE_H30T | 83 | H30T 相机 |
| DJI_CAMERA_TYPE_L2 | 84 | L2 相机 |
| DJI_CAMERA_TYPE_M4T | 89 | M4T 相机 |
| DJI_CAMERA_TYPE_M4TD | 90 | M4TD 相机 |
| DJI_CAMERA_TYPE_M4D | 91 | M4D 相机 |
| DJI_CAMERA_TYPE_L3 | 117 | L3 相机 |
| DJI_CAMERA_TYPE_M4E | 891 | M4E 相机 |
示例
import time
import sys
from pymavlink import mavutil
def connect_to_vehicle():
"""建立 UDP 监听连接(默认监听所有接口的 14550 端口)"""
connection_string = "udpin:0.0.0.0:14550"
print(f"Listening for MAVLink on: {connection_string}")
vehicle = mavutil.mavlink_connection(connection_string)
print("Waiting for HEARTBEAT (timeout: 10s)...")
try:
vehicle.wait_heartbeat(timeout=10)
print(f"✅ Heartbeat received from system {vehicle.target_system}, component {vehicle.target_component}")
return vehicle
except Exception as e:
print(f"❌ Connection failed: {str(e)}")
print("Ensure your vehicle is sending MAVLink messages to 14550 port")
print("Example QGroundControl setup: Settings > General > MAVLink > Listening Port = 14550")
sys.exit(1)
def format_param_id(param_id):
"""格式化16字节参数ID(符合MAVLink协议要求)"""
if len(param_id) > 16:
raise ValueError("param_id cannot exceed 16 characters")
param_id_bytes = bytearray(16)
for i in range(min(len(param_id), 16)):
param_id_bytes[i] = ord(param_id[i])
# 长度<16时添加NULL终止符
if len(param_id) < 16:
param_id_bytes[len(param_id)] = 0
return param_id_bytes
def send_param_set(vehicle, param_id, param_value, param_type):
"""发送参数设置请求"""
vehicle.mav.param_set_send(
vehicle.target_system,
vehicle.target_component,
format_param_id(param_id),
param_value,
param_type
)
print(f"📤 Sent PARAM_SET for '{param_id}' = {param_value} (type: {param_type})")
def send_param_request_read(vehicle, param_id=None, param_index=-1):
"""发送参数读取请求"""
param_id_bytes = format_param_id(param_id) if param_id else bytearray(16)
vehicle.mav.param_request_read_send(
vehicle.target_system,
vehicle.target_component,
param_id_bytes,
param_index
)
target = f"index {param_index}" if param_index >= 0 else f"ID '{param_id}'"
print(f"📤 Sent PARAM_REQUEST_READ for {target}")
def send_param_request_list(vehicle):
"""发送请求所有参数列表"""
vehicle.mav.param_request_list_send(
vehicle.target_system,
vehicle.target_component
)
print(f"📤 Sent PARAM_REQUEST_LIST to system {vehicle.target_system}, component {vehicle.target_component}")
def receive_param_value(vehicle, timeout=5.0):
"""接收参数值响应"""
print(f"⏳ Waiting for PARAM_VALUE ({timeout}s timeout)...")
msg = vehicle.recv_match(type='PARAM_VALUE', blocking=True, timeout=timeout)
if not msg:
print("❌ Timeout: No PARAM_VALUE received")
return None
# 解析参数ID
param_id = msg.param_id
# 解析参数值
param_value = msg.param_value
# 参数类型映射
type_names = {
0: "INT8", 1: "UINT8", 2: "INT16", 3: "UINT16", 4: "INT32",
5: "UINT32", 6: "INT64", 7: "UINT64", 8: "FLOAT", 9: "DOUBLE"
}
param_type = type_names.get(msg.param_type, f"UNKNOWN({msg.param_type})")
print("\n📥 Received PARAM_VALUE:")
print(f" 🆔 ID: {param_id}")
print(f" 🔢 Value: {param_value}")
print(f" 🧾 Type: {param_type}")
print(f" 📊 Index/Total: {msg.param_index}/{msg.param_count}")
return {
'id': param_id,
'value': param_value,
'type': param_type,
'index': msg.param_index,
'count': msg.param_count
}
def receive_all_param_values(vehicle, timeout=10.0):
"""接收所有参数值,直到收到 param_count 条消息后退出循环"""
received_params = []
expected_count = None
print(f"⏳ Waiting for all PARAM_VALUE messages...")
while True:
msg = vehicle.recv_match(type='PARAM_VALUE', blocking=True, timeout=timeout)
if not msg:
print(f"❌ Timeout: Received {len(received_params)} parameters (expected {expected_count if expected_count else 'unknown'})")
break
param_id = msg.param_id
param_value = msg.param_value
# 参数类型映射
type_names = {
0: "INT8", 1: "UINT8", 2: "INT16", 3: "UINT16", 4: "INT32",
5: "UINT32", 6: "INT64", 7: "UINT64", 8: "FLOAT", 9: "DOUBLE"
}
param_type = type_names.get(msg.param_type, f"UNKNOWN({msg.param_type})")
# 首次收到消息时记录总参数数量
if expected_count is None:
expected_count = msg.param_count
print(f"📊 Total parameters to receive: {expected_count}")
print(f" [{msg.param_index}/{expected_count}] {param_id} = {param_value} ({param_type})")
received_params.append({
'id': param_id,
'value': param_value,
'type': param_type,
'index': msg.param_index,
'count': msg.param_count
})
# 当已接收数量达到预期总数时退出循环
if len(received_params) >= expected_count:
print(f"\n✅ Successfully received all {expected_count} parameters")
break
return received_params
def main():
print("🚀 Starting MAVLink PARAM_SET Tool (UDP Listening Mode)")
print("-----------------------------------------------------")
print("This script listens for MAVLink on ALL interfaces:14550")
print("Ensure your vehicle is configured to send to this port")
print("-----------------------------------------------------\n")
vehicle = connect_to_vehicle()
# 操作选择
print("\nAvailable operations:")
print("1. Set parameter value")
print("2. Read parameter value (by ID or index)")
print("3. Request all parameters (PARAM_REQUEST_LIST)")
choice = input("\nSelect operation [1-3]: ").strip()
if choice == '1':
param_id = input("Enter parameter ID to set: ").strip()
param_value = float(input("Enter new value: ").strip())
print("\nParameter types:")
print(" 8 = FLOAT (most common)")
print(" 9 = DOUBLE")
print(" 4 = INT32")
print(" 1 = UINT8")
param_type = int(input("Enter type number [8]: ").strip() or 8)
send_param_set(vehicle, param_id, param_value, param_type)
receive_param_value(vehicle)
elif choice == '2':
# mode = input("Read by [id/index]: ").lower()
mode = 'id'
if mode == 'id':
param_id = input("Enter parameter ID: ").strip()
send_param_request_read(vehicle, param_id=param_id)
receive_param_value(vehicle)
elif mode == 'index':
param_index = int(input("Enter parameter index: "))
send_param_request_read(vehicle, param_index=param_index)
receive_param_value(vehicle)
else:
print("Invalid mode. Use 'id' or 'index'")
elif choice == '3':
print("\n📤 Requesting all parameters...")
send_param_request_list(vehicle)
all_params = receive_all_param_values(vehicle)
print(f"\n📋 Total parameters received: {len(all_params)}")
else:
print("Invalid choice. Select 1, 2, or 3.")
if __name__ == "__main__":
main()示例使用说明
运行后,成功建立连接
输入“2”选择读取参数
输入对应参数“CAMERA_TYPE”
成功返回该参数对应的数值
获取相机固件版本
FIRMWARE_VERSION
mavlink消息:
接收PARAM_REQUEST_READ
发送PARAM_VALUE
参数:T_DjiCameraManagerFirmwareVersion
| 字段名 | 类型 | 说明 |
|---|---|---|
| firmware_version | foat | 固件版本号 |
示例
import time
import sys
from pymavlink import mavutil
def connect_to_vehicle():
"""建立 UDP 监听连接(默认监听所有接口的 14550 端口)"""
connection_string = "udpin:0.0.0.0:14550"
print(f"Listening for MAVLink on: {connection_string}")
vehicle = mavutil.mavlink_connection(connection_string)
print("Waiting for HEARTBEAT (timeout: 10s)...")
try:
vehicle.wait_heartbeat(timeout=10)
print(f"✅ Heartbeat received from system {vehicle.target_system}, component {vehicle.target_component}")
return vehicle
except Exception as e:
print(f"❌ Connection failed: {str(e)}")
print("Ensure your vehicle is sending MAVLink messages to 14550 port")
print("Example QGroundControl setup: Settings > General > MAVLink > Listening Port = 14550")
sys.exit(1)
def format_param_id(param_id):
"""格式化16字节参数ID(符合MAVLink协议要求)"""
if len(param_id) > 16:
raise ValueError("param_id cannot exceed 16 characters")
param_id_bytes = bytearray(16)
for i in range(min(len(param_id), 16)):
param_id_bytes[i] = ord(param_id[i])
# 长度<16时添加NULL终止符
if len(param_id) < 16:
param_id_bytes[len(param_id)] = 0
return param_id_bytes
def send_param_set(vehicle, param_id, param_value, param_type):
"""发送参数设置请求"""
vehicle.mav.param_set_send(
vehicle.target_system,
vehicle.target_component,
format_param_id(param_id),
param_value,
param_type
)
print(f"📤 Sent PARAM_SET for '{param_id}' = {param_value} (type: {param_type})")
def send_param_request_read(vehicle, param_id=None, param_index=-1):
"""发送参数读取请求"""
param_id_bytes = format_param_id(param_id) if param_id else bytearray(16)
vehicle.mav.param_request_read_send(
vehicle.target_system,
vehicle.target_component,
param_id_bytes,
param_index
)
target = f"index {param_index}" if param_index >= 0 else f"ID '{param_id}'"
print(f"📤 Sent PARAM_REQUEST_READ for {target}")
def send_param_request_list(vehicle):
"""发送请求所有参数列表"""
vehicle.mav.param_request_list_send(
vehicle.target_system,
vehicle.target_component
)
print(f"📤 Sent PARAM_REQUEST_LIST to system {vehicle.target_system}, component {vehicle.target_component}")
def receive_param_value(vehicle, timeout=5.0):
"""接收参数值响应"""
print(f"⏳ Waiting for PARAM_VALUE ({timeout}s timeout)...")
msg = vehicle.recv_match(type='PARAM_VALUE', blocking=True, timeout=timeout)
if not msg:
print("❌ Timeout: No PARAM_VALUE received")
return None
# 解析参数ID
param_id = msg.param_id
# 解析参数值
param_value = msg.param_value
# 参数类型映射
type_names = {
0: "INT8", 1: "UINT8", 2: "INT16", 3: "UINT16", 4: "INT32",
5: "UINT32", 6: "INT64", 7: "UINT64", 8: "FLOAT", 9: "DOUBLE"
}
param_type = type_names.get(msg.param_type, f"UNKNOWN({msg.param_type})")
print("\n📥 Received PARAM_VALUE:")
print(f" 🆔 ID: {param_id}")
print(f" 🔢 Value: {param_value}")
print(f" 🧾 Type: {param_type}")
print(f" 📊 Index/Total: {msg.param_index}/{msg.param_count}")
return {
'id': param_id,
'value': param_value,
'type': param_type,
'index': msg.param_index,
'count': msg.param_count
}
def receive_all_param_values(vehicle, timeout=10.0):
"""接收所有参数值,直到收到 param_count 条消息后退出循环"""
received_params = []
expected_count = None
print(f"⏳ Waiting for all PARAM_VALUE messages...")
while True:
msg = vehicle.recv_match(type='PARAM_VALUE', blocking=True, timeout=timeout)
if not msg:
print(f"❌ Timeout: Received {len(received_params)} parameters (expected {expected_count if expected_count else 'unknown'})")
break
param_id = msg.param_id
param_value = msg.param_value
# 参数类型映射
type_names = {
0: "INT8", 1: "UINT8", 2: "INT16", 3: "UINT16", 4: "INT32",
5: "UINT32", 6: "INT64", 7: "UINT64", 8: "FLOAT", 9: "DOUBLE"
}
param_type = type_names.get(msg.param_type, f"UNKNOWN({msg.param_type})")
# 首次收到消息时记录总参数数量
if expected_count is None:
expected_count = msg.param_count
print(f"📊 Total parameters to receive: {expected_count}")
print(f" [{msg.param_index}/{expected_count}] {param_id} = {param_value} ({param_type})")
received_params.append({
'id': param_id,
'value': param_value,
'type': param_type,
'index': msg.param_index,
'count': msg.param_count
})
# 当已接收数量达到预期总数时退出循环
if len(received_params) >= expected_count:
print(f"\n✅ Successfully received all {expected_count} parameters")
break
return received_params
def main():
print("🚀 Starting MAVLink PARAM_SET Tool (UDP Listening Mode)")
print("-----------------------------------------------------")
print("This script listens for MAVLink on ALL interfaces:14550")
print("Ensure your vehicle is configured to send to this port")
print("-----------------------------------------------------\n")
vehicle = connect_to_vehicle()
# 操作选择
print("\nAvailable operations:")
print("1. Set parameter value")
print("2. Read parameter value (by ID or index)")
print("3. Request all parameters (PARAM_REQUEST_LIST)")
choice = input("\nSelect operation [1-3]: ").strip()
if choice == '1':
param_id = input("Enter parameter ID to set: ").strip()
param_value = float(input("Enter new value: ").strip())
print("\nParameter types:")
print(" 8 = FLOAT (most common)")
print(" 9 = DOUBLE")
print(" 4 = INT32")
print(" 1 = UINT8")
param_type = int(input("Enter type number [8]: ").strip() or 8)
send_param_set(vehicle, param_id, param_value, param_type)
receive_param_value(vehicle)
elif choice == '2':
# mode = input("Read by [id/index]: ").lower()
mode = 'id'
if mode == 'id':
param_id = input("Enter parameter ID: ").strip()
send_param_request_read(vehicle, param_id=param_id)
receive_param_value(vehicle)
elif mode == 'index':
param_index = int(input("Enter parameter index: "))
send_param_request_read(vehicle, param_index=param_index)
receive_param_value(vehicle)
else:
print("Invalid mode. Use 'id' or 'index'")
elif choice == '3':
print("\n📤 Requesting all parameters...")
send_param_request_list(vehicle)
all_params = receive_all_param_values(vehicle)
print(f"\n📋 Total parameters received: {len(all_params)}")
else:
print("Invalid choice. Select 1, 2, or 3.")
if __name__ == "__main__":
main()示例使用说明
运行后,成功建立连接
输入“2”选择读取参数
输入对应参数“FIRMWARE_VERSION”
成功返回该参数对应的数值
切换相机工作模式
CAMERA_MODE
设置
通过QGC图形界面切换相机工作模式

获取
mavlink消息
接收PARAM_REQUEST_READ
发送PARAM_VALUE
参数:
| 名称 | 枚举值 | 说明 |
|---|---|---|
| DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_SINGLE | 0x01 | 单拍模式(Single Photo) |
| DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_HDR | 0x02 | HDR 拍照模式 |
| DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_BURST | 0x04 | 连拍模式(Burst) |
| DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_AEB | 0x05 | AEB 自动曝光包围拍摄模式 |
| DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_INTERVAL | 0x06 | 定时拍照模式(Interval) |
| DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_UNKNOWN | 0xFF | 未知拍照模式 |
示例
import time
import sys
from pymavlink import mavutil
def connect_to_vehicle():
"""建立 UDP 监听连接(默认监听所有接口的 14550 端口)"""
connection_string = "udpin:0.0.0.0:14550"
print(f"Listening for MAVLink on: {connection_string}")
vehicle = mavutil.mavlink_connection(connection_string)
print("Waiting for HEARTBEAT (timeout: 10s)...")
try:
vehicle.wait_heartbeat(timeout=10)
print(f"✅ Heartbeat received from system {vehicle.target_system}, component {vehicle.target_component}")
return vehicle
except Exception as e:
print(f"❌ Connection failed: {str(e)}")
print("Ensure your vehicle is sending MAVLink messages to 14550 port")
print("Example QGroundControl setup: Settings > General > MAVLink > Listening Port = 14550")
sys.exit(1)
def format_param_id(param_id):
"""格式化16字节参数ID(符合MAVLink协议要求)"""
if len(param_id) > 16:
raise ValueError("param_id cannot exceed 16 characters")
param_id_bytes = bytearray(16)
for i in range(min(len(param_id), 16)):
param_id_bytes[i] = ord(param_id[i])
# 长度<16时添加NULL终止符
if len(param_id) < 16:
param_id_bytes[len(param_id)] = 0
return param_id_bytes
def send_param_set(vehicle, param_id, param_value, param_type):
"""发送参数设置请求"""
vehicle.mav.param_set_send(
vehicle.target_system,
vehicle.target_component,
format_param_id(param_id),
param_value,
param_type
)
print(f"📤 Sent PARAM_SET for '{param_id}' = {param_value} (type: {param_type})")
def send_param_request_read(vehicle, param_id=None, param_index=-1):
"""发送参数读取请求"""
param_id_bytes = format_param_id(param_id) if param_id else bytearray(16)
vehicle.mav.param_request_read_send(
vehicle.target_system,
vehicle.target_component,
param_id_bytes,
param_index
)
target = f"index {param_index}" if param_index >= 0 else f"ID '{param_id}'"
print(f"📤 Sent PARAM_REQUEST_READ for {target}")
def send_param_request_list(vehicle):
"""发送请求所有参数列表"""
vehicle.mav.param_request_list_send(
vehicle.target_system,
vehicle.target_component
)
print(f"📤 Sent PARAM_REQUEST_LIST to system {vehicle.target_system}, component {vehicle.target_component}")
def receive_param_value(vehicle, timeout=5.0):
"""接收参数值响应"""
print(f"⏳ Waiting for PARAM_VALUE ({timeout}s timeout)...")
msg = vehicle.recv_match(type='PARAM_VALUE', blocking=True, timeout=timeout)
if not msg:
print("❌ Timeout: No PARAM_VALUE received")
return None
# 解析参数ID
param_id = msg.param_id
# 解析参数值
param_value = msg.param_value
# 参数类型映射
type_names = {
0: "INT8", 1: "UINT8", 2: "INT16", 3: "UINT16", 4: "INT32",
5: "UINT32", 6: "INT64", 7: "UINT64", 8: "FLOAT", 9: "DOUBLE"
}
param_type = type_names.get(msg.param_type, f"UNKNOWN({msg.param_type})")
print("\n📥 Received PARAM_VALUE:")
print(f" 🆔 ID: {param_id}")
print(f" 🔢 Value: {param_value}")
print(f" 🧾 Type: {param_type}")
print(f" 📊 Index/Total: {msg.param_index}/{msg.param_count}")
return {
'id': param_id,
'value': param_value,
'type': param_type,
'index': msg.param_index,
'count': msg.param_count
}
def receive_all_param_values(vehicle, timeout=10.0):
"""接收所有参数值,直到收到 param_count 条消息后退出循环"""
received_params = []
expected_count = None
print(f"⏳ Waiting for all PARAM_VALUE messages...")
while True:
msg = vehicle.recv_match(type='PARAM_VALUE', blocking=True, timeout=timeout)
if not msg:
print(f"❌ Timeout: Received {len(received_params)} parameters (expected {expected_count if expected_count else 'unknown'})")
break
param_id = msg.param_id
param_value = msg.param_value
# 参数类型映射
type_names = {
0: "INT8", 1: "UINT8", 2: "INT16", 3: "UINT16", 4: "INT32",
5: "UINT32", 6: "INT64", 7: "UINT64", 8: "FLOAT", 9: "DOUBLE"
}
param_type = type_names.get(msg.param_type, f"UNKNOWN({msg.param_type})")
# 首次收到消息时记录总参数数量
if expected_count is None:
expected_count = msg.param_count
print(f"📊 Total parameters to receive: {expected_count}")
print(f" [{msg.param_index}/{expected_count}] {param_id} = {param_value} ({param_type})")
received_params.append({
'id': param_id,
'value': param_value,
'type': param_type,
'index': msg.param_index,
'count': msg.param_count
})
# 当已接收数量达到预期总数时退出循环
if len(received_params) >= expected_count:
print(f"\n✅ Successfully received all {expected_count} parameters")
break
return received_params
def main():
print("🚀 Starting MAVLink PARAM_SET Tool (UDP Listening Mode)")
print("-----------------------------------------------------")
print("This script listens for MAVLink on ALL interfaces:14550")
print("Ensure your vehicle is configured to send to this port")
print("-----------------------------------------------------\n")
vehicle = connect_to_vehicle()
# 操作选择
print("\nAvailable operations:")
print("1. Set parameter value")
print("2. Read parameter value (by ID or index)")
print("3. Request all parameters (PARAM_REQUEST_LIST)")
choice = input("\nSelect operation [1-3]: ").strip()
if choice == '1':
param_id = input("Enter parameter ID to set: ").strip()
param_value = float(input("Enter new value: ").strip())
print("\nParameter types:")
print(" 8 = FLOAT (most common)")
print(" 9 = DOUBLE")
print(" 4 = INT32")
print(" 1 = UINT8")
param_type = int(input("Enter type number [8]: ").strip() or 8)
send_param_set(vehicle, param_id, param_value, param_type)
receive_param_value(vehicle)
elif choice == '2':
# mode = input("Read by [id/index]: ").lower()
mode = 'id'
if mode == 'id':
param_id = input("Enter parameter ID: ").strip()
send_param_request_read(vehicle, param_id=param_id)
receive_param_value(vehicle)
elif mode == 'index':
param_index = int(input("Enter parameter index: "))
send_param_request_read(vehicle, param_index=param_index)
receive_param_value(vehicle)
else:
print("Invalid mode. Use 'id' or 'index'")
elif choice == '3':
print("\n📤 Requesting all parameters...")
send_param_request_list(vehicle)
all_params = receive_all_param_values(vehicle)
print(f"\n📋 Total parameters received: {len(all_params)}")
else:
print("Invalid choice. Select 1, 2, or 3.")
if __name__ == "__main__":
main()示例使用说明
运行后,成功建立连接
输入“2”选择读取参数
输入对应参数“CAMERA_MODE”
成功返回该参数对应的数值
单张拍摄
MAV_CMD_DO_TRIGGER_CONTROL 203
返回消息:COMMAND_ACK
返回值 command 203 执行命令id
返回值 result 0或4 0:执行成功,4:执行失败
python测试脚本
import time
from pymavlink import mavutil
timestamp = int(time.time() * 1000)
millis = int(time.time() * 1000)
master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
master.wait_heartbeat()
boot_time = time.time()
def shoot():
master.mav.command_long_send(
master.target_system,
master.target_component,
mavutil.mavlink.MAV_CMD_DO_DIGICAM_CONTROL,
0,
0, 0, 0, 0, 0, 0, 0
)
shoot()执行脚本
结果
开始录像
MAV_CMD_VIDEO_START_CAPTURE 2500
返回command = MAV_CMD_REQUEST_MESSAGE
返回值 param1 2500 执行命令id
返回值 param2 0或1 是否执行成功
返回值 param3 失败代码
0 无异常
1 无法初始化相机控制
2 设置相机为录像模式
3 获取相机版本失败
4 相机录像执行失败
python测试脚本
import time
from pymavlink import mavutil
timestamp = int(time.time() * 1000)
millis = int(time.time() * 1000)
master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
master.wait_heartbeat()
boot_time = time.time()
def videoStart():
master.mav.command_long_send(
master.target_system,
master.target_component,
mavutil.mavlink.MAV_CMD_VIDEO_START_CAPTURE,
0,
0, 0, 0, 0, 0, 0, 0
)
videoStart()执行脚本
结果
具体录像行为相关信息需用遥控器查看
停止录像
MAV_CMD_VIDEO_STOP_CAPTURE 2501
返回command = MAV_CMD_REQUEST_MESSAGE
返回值 param1 2501 执行命令id
返回值 param2 0或1 是否执行成功
返回值 param3 失败代码
0 无异常
1 无法初始化相机控制
2 设置相机为录像模式
3 获取相机版本失败
4 相机录像执行失败
python测试脚本
import time
from pymavlink import mavutil
timestamp = int(time.time() * 1000)
millis = int(time.time() * 1000)
master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
master.wait_heartbeat()
boot_time = time.time()
def videoStop():
master.mav.command_long_send(
master.target_system,
master.target_component,
mavutil.mavlink.MAV_CMD_VIDEO_STOP_CAPTURE,
0,
0, 0, 0, 0, 0, 0, 0
)
videoStop()执行脚本
结果
具体录像行为相关信息需用遥控器查看
获取间隔拍摄的剩余时间
INT_SHOOT_REM
mavlink消息:
接收PARAM_REQUEST_READ
发送PARAM_VALUE
参数:
| 字段名 | 数据类型 | 含义 | 单位 |
|---|---|---|---|
| remainTime | uint8_t | 剩余时间 | s |
示例
import time
import sys
from pymavlink import mavutil
def connect_to_vehicle():
"""建立 UDP 监听连接(默认监听所有接口的 14550 端口)"""
connection_string = "udpin:0.0.0.0:14550"
print(f"Listening for MAVLink on: {connection_string}")
vehicle = mavutil.mavlink_connection(connection_string)
print("Waiting for HEARTBEAT (timeout: 10s)...")
try:
vehicle.wait_heartbeat(timeout=10)
print(f"✅ Heartbeat received from system {vehicle.target_system}, component {vehicle.target_component}")
return vehicle
except Exception as e:
print(f"❌ Connection failed: {str(e)}")
print("Ensure your vehicle is sending MAVLink messages to 14550 port")
print("Example QGroundControl setup: Settings > General > MAVLink > Listening Port = 14550")
sys.exit(1)
def format_param_id(param_id):
"""格式化16字节参数ID(符合MAVLink协议要求)"""
if len(param_id) > 16:
raise ValueError("param_id cannot exceed 16 characters")
param_id_bytes = bytearray(16)
for i in range(min(len(param_id), 16)):
param_id_bytes[i] = ord(param_id[i])
# 长度<16时添加NULL终止符
if len(param_id) < 16:
param_id_bytes[len(param_id)] = 0
return param_id_bytes
def send_param_set(vehicle, param_id, param_value, param_type):
"""发送参数设置请求"""
vehicle.mav.param_set_send(
vehicle.target_system,
vehicle.target_component,
format_param_id(param_id),
param_value,
param_type
)
print(f"📤 Sent PARAM_SET for '{param_id}' = {param_value} (type: {param_type})")
def send_param_request_read(vehicle, param_id=None, param_index=-1):
"""发送参数读取请求"""
param_id_bytes = format_param_id(param_id) if param_id else bytearray(16)
vehicle.mav.param_request_read_send(
vehicle.target_system,
vehicle.target_component,
param_id_bytes,
param_index
)
target = f"index {param_index}" if param_index >= 0 else f"ID '{param_id}'"
print(f"📤 Sent PARAM_REQUEST_READ for {target}")
def send_param_request_list(vehicle):
"""发送请求所有参数列表"""
vehicle.mav.param_request_list_send(
vehicle.target_system,
vehicle.target_component
)
print(f"📤 Sent PARAM_REQUEST_LIST to system {vehicle.target_system}, component {vehicle.target_component}")
def receive_param_value(vehicle, timeout=5.0):
"""接收参数值响应"""
print(f"⏳ Waiting for PARAM_VALUE ({timeout}s timeout)...")
msg = vehicle.recv_match(type='PARAM_VALUE', blocking=True, timeout=timeout)
if not msg:
print("❌ Timeout: No PARAM_VALUE received")
return None
# 解析参数ID
param_id = msg.param_id
# 解析参数值
param_value = msg.param_value
# 参数类型映射
type_names = {
0: "INT8", 1: "UINT8", 2: "INT16", 3: "UINT16", 4: "INT32",
5: "UINT32", 6: "INT64", 7: "UINT64", 8: "FLOAT", 9: "DOUBLE"
}
param_type = type_names.get(msg.param_type, f"UNKNOWN({msg.param_type})")
print("\n📥 Received PARAM_VALUE:")
print(f" 🆔 ID: {param_id}")
print(f" 🔢 Value: {param_value}")
print(f" 🧾 Type: {param_type}")
print(f" 📊 Index/Total: {msg.param_index}/{msg.param_count}")
return {
'id': param_id,
'value': param_value,
'type': param_type,
'index': msg.param_index,
'count': msg.param_count
}
def receive_all_param_values(vehicle, timeout=10.0):
"""接收所有参数值,直到收到 param_count 条消息后退出循环"""
received_params = []
expected_count = None
print(f"⏳ Waiting for all PARAM_VALUE messages...")
while True:
msg = vehicle.recv_match(type='PARAM_VALUE', blocking=True, timeout=timeout)
if not msg:
print(f"❌ Timeout: Received {len(received_params)} parameters (expected {expected_count if expected_count else 'unknown'})")
break
param_id = msg.param_id
param_value = msg.param_value
# 参数类型映射
type_names = {
0: "INT8", 1: "UINT8", 2: "INT16", 3: "UINT16", 4: "INT32",
5: "UINT32", 6: "INT64", 7: "UINT64", 8: "FLOAT", 9: "DOUBLE"
}
param_type = type_names.get(msg.param_type, f"UNKNOWN({msg.param_type})")
# 首次收到消息时记录总参数数量
if expected_count is None:
expected_count = msg.param_count
print(f"📊 Total parameters to receive: {expected_count}")
print(f" [{msg.param_index}/{expected_count}] {param_id} = {param_value} ({param_type})")
received_params.append({
'id': param_id,
'value': param_value,
'type': param_type,
'index': msg.param_index,
'count': msg.param_count
})
# 当已接收数量达到预期总数时退出循环
if len(received_params) >= expected_count:
print(f"\n✅ Successfully received all {expected_count} parameters")
break
return received_params
def main():
print("🚀 Starting MAVLink PARAM_SET Tool (UDP Listening Mode)")
print("-----------------------------------------------------")
print("This script listens for MAVLink on ALL interfaces:14550")
print("Ensure your vehicle is configured to send to this port")
print("-----------------------------------------------------\n")
vehicle = connect_to_vehicle()
# 操作选择
print("\nAvailable operations:")
print("1. Set parameter value")
print("2. Read parameter value (by ID or index)")
print("3. Request all parameters (PARAM_REQUEST_LIST)")
choice = input("\nSelect operation [1-3]: ").strip()
if choice == '1':
param_id = input("Enter parameter ID to set: ").strip()
param_value = float(input("Enter new value: ").strip())
print("\nParameter types:")
print(" 8 = FLOAT (most common)")
print(" 9 = DOUBLE")
print(" 4 = INT32")
print(" 1 = UINT8")
param_type = int(input("Enter type number [8]: ").strip() or 8)
send_param_set(vehicle, param_id, param_value, param_type)
receive_param_value(vehicle)
elif choice == '2':
# mode = input("Read by [id/index]: ").lower()
mode = 'id'
if mode == 'id':
param_id = input("Enter parameter ID: ").strip()
send_param_request_read(vehicle, param_id=param_id)
receive_param_value(vehicle)
elif mode == 'index':
param_index = int(input("Enter parameter index: "))
send_param_request_read(vehicle, param_index=param_index)
receive_param_value(vehicle)
else:
print("Invalid mode. Use 'id' or 'index'")
elif choice == '3':
print("\n📤 Requesting all parameters...")
send_param_request_list(vehicle)
all_params = receive_all_param_values(vehicle)
print(f"\n📋 Total parameters received: {len(all_params)}")
else:
print("Invalid choice. Select 1, 2, or 3.")
if __name__ == "__main__":
main()示例使用说明
运行后,成功建立连接
输入“2”选择读取参数
输入对应参数“INT_SHOOT_REM”
成功返回该参数对应的数值
注:M3T、M30不支持该功能。
最后编辑:孙渝泓 更新时间:2026-06-18 17:59