3 from __future__
import (absolute_import, division,
4 print_function, unicode_literals)
10 from argparse
import ArgumentParser
11 from threading
import Thread
12 from pymavlink
import mavutil
13 from datetime
import datetime, timedelta
18 return tuple(range(0, n))
20 return bytes(range(0, n))
21 if packet ==
'SYS_STATUS':
22 mav.mav.sys_status_send(*a(13))
23 elif packet ==
'SYSTEM_TIME':
24 mav.mav.system_time_send(*a(2))
25 elif packet ==
'PING':
26 args = a(2) + (system, component)
27 mav.mav.ping_send(*args)
28 elif packet ==
'CHANGE_OPERATOR_CONTROL':
29 args = (system,) + a(2) + (b(25),)
30 mav.mav.change_operator_control_send(*args)
31 elif packet ==
'CHANGE_OPERATOR_CONTROL_ACK':
32 mav.mav.change_operator_control_ack_send(*a(3))
33 elif packet ==
'AUTH_KEY':
34 mav.mav.auth_key_send(b(32))
35 elif packet ==
'PARAM_REQUEST_READ':
36 mav.mav.param_request_read_send(system, component, b(16), 1)
37 elif packet ==
'PARAM_REQUEST_LIST':
38 mav.mav.param_request_list_send(system, component)
39 elif packet ==
'PARAM_VALUE':
40 mav.mav.param_value_send(b(16), *a(4))
41 elif packet ==
'PARAM_SET':
42 mav.mav.param_set_send(system, component, b(16), *a(2))
43 elif packet ==
'GPS_RAW_INT':
45 mav.mav.gps_raw_int_send(*a(15))
47 mav.mav.gps_raw_int_send(*a(10))
48 elif packet ==
'GPS_STATUS':
49 mav.mav.gps_status_send(1, b(20), b(20), b(20), b(20), b(20))
50 elif packet ==
'SCALED_IMU':
51 mav.mav.scaled_imu_send(*a(10))
52 elif packet ==
'RAW_IMU':
53 mav.mav.raw_imu_send(*a(10))
54 elif packet ==
'RAW_PRESSURE':
55 mav.mav.raw_pressure_send(*a(5))
56 elif packet ==
'SCALED_PRESSURE':
57 mav.mav.scaled_pressure_send(*a(4))
58 elif packet ==
'ATTITUDE':
59 mav.mav.attitude_send(*a(7))
60 elif packet ==
'ATTITUDE_QUATERNION':
61 mav.mav.attitude_quaternion_send(*a(8))
62 elif packet ==
'LOCAL_POSITION_NED':
63 mav.mav.local_position_ned_send(*a(7))
64 elif packet ==
'GLOBAL_POSITION_INT':
65 mav.mav.global_position_int_send(*a(9))
66 elif packet ==
'RC_CHANNELS_SCALED':
67 mav.mav.rc_channels_scaled_send(*a(11))
68 elif packet ==
'RC_CHANNELS_RAW':
69 mav.mav.rc_channels_raw_send(*a(11))
70 elif packet ==
'SERVO_OUTPUT_RAW':
72 mav.mav.servo_output_raw_send(*a(18))
74 mav.mav.servo_output_raw_send(*a(10))
75 elif packet ==
'MISSION_REQUEST_PARTIAL_LIST':
77 mav.mav.mission_request_partial_list_send(system, component, *a(3))
79 mav.mav.mission_request_partial_list_send(system, component, *a(2))
80 elif packet ==
'MISSION_WRITE_PARTIAL_LIST':
82 mav.mav.mission_write_partial_list_send(system, component, *a(3))
84 mav.mav.mission_write_partial_list_send(system, component, *a(2))
85 elif packet ==
'MISSION_ITEM':
87 mav.mav.mission_item_send(system, component, *a(13))
89 mav.mav.mission_item_send(system, component, *a(12))
90 elif packet ==
'MISSION_REQUEST':
92 mav.mav.mission_request_send(system, component, *a(2))
94 mav.mav.mission_request_send(system, component, 1)
95 elif packet ==
'MISSION_SET_CURRENT':
96 mav.mav.mission_set_current_send(system, component, 1)
97 elif packet ==
'MISSION_CURRENT':
98 mav.mav.mission_current_send(1)
99 elif packet ==
'MISSION_REQUEST_LIST':
101 mav.mav.mission_request_list_send(system, component, 1)
103 mav.mav.mission_request_list_send(system, component)
104 elif packet ==
'MISSION_COUNT':
106 mav.mav.mission_count_send(system, component, *a(2))
108 mav.mav.mission_count_send(system, component, 1)
109 elif packet ==
'MISSION_CLEAR_ALL':
111 mav.mav.mission_clear_all_send(system, component, 1)
113 mav.mav.mission_clear_all_send(system, component)
114 elif packet ==
'MISSION_ITEM_REACHED':
115 mav.mav.mission_item_reached_send(1)
116 elif packet ==
'MISSION_ACK':
118 mav.mav.mission_ack_send(system, component, *a(2))
120 mav.mav.mission_ack_send(system, component, 1)
121 elif packet ==
'SET_GPS_GLOBAL_ORIGIN':
123 mav.mav.set_gps_global_origin_send(system, *a(4))
125 mav.mav.set_gps_global_origin_send(system, *a(3))
126 elif packet ==
'GPS_GLOBAL_ORIGIN':
128 mav.mav.gps_global_origin_send(*a(4))
130 mav.mav.gps_global_origin_send(*a(3))
131 elif packet ==
'PARAM_MAP_RC':
132 mav.mav.param_map_rc_send(system, component, b(16), *a(6))
133 elif packet ==
'MISSION_REQUEST_INT':
135 mav.mav.mission_request_int_send(system, component, *a(2))
137 mav.mav.mission_request_int_send(system, component, 1)
138 elif packet ==
'SAFETY_SET_ALLOWED_AREA':
139 mav.mav.safety_set_allowed_area_send(system, component, *a(7))
140 elif packet ==
'SAFETY_ALLOWED_AREA':
141 mav.mav.safety_allowed_area_send(*a(7))
142 elif packet ==
'ATTITUDE_QUATERNION_COV':
143 args = (1, b(4)) + a(3) + (b(9),)
144 mav.mav.attitude_quaternion_cov_send(*args)
145 elif packet ==
'NAV_CONTROLLER_OUTPUT':
146 mav.mav.nav_controller_output_send(*a(8))
147 elif packet ==
'GLOBAL_POSITION_INT_COV':
148 args = a(9) + (b(36),)
149 mav.mav.global_position_int_cov_send(*args)
150 elif packet ==
'LOCAL_POSITION_NED_COV':
151 args = a(11) + (b(45),)
152 mav.mav.local_position_ned_cov_send(*args)
153 elif packet ==
'RC_CHANNELS':
154 mav.mav.rc_channels_send(*a(21))
155 elif packet ==
'MANUAL_CONTROL':
156 mav.mav.manual_control_send(system, *a(5))
157 elif packet ==
'RC_CHANNELS_OVERRIDE':
158 mav.mav.rc_channels_override_send(system, component, *a(8))
159 elif packet ==
'MISSION_ITEM_INT':
161 mav.mav.mission_item_int_send(system, component, *a(13))
163 mav.mav.mission_item_int_send(system, component, *a(12))
164 elif packet ==
'VFR_HUD':
165 mav.mav.vfr_hud_send(*a(6))
166 elif packet ==
'COMMAND_INT':
167 mav.mav.command_int_send(system, component, *a(11))
168 elif packet ==
'COMMAND_LONG':
169 mav.mav.command_long_send(system, component, *a(9))
170 elif packet ==
'COMMAND_ACK':
171 mav.mav.command_ack_send(*a(2))
172 elif packet ==
'MANUAL_SETPOINT':
173 mav.mav.manual_setpoint_send(*a(7))
174 elif packet ==
'SET_ATTITUDE_TARGET':
175 mav.mav.set_attitude_target_send(1, system, component, 1, b(4), *a(4))
176 elif packet ==
'ATTITUDE_TARGET':
177 args = a(2) + (b(4), ) + a(4)
178 mav.mav.attitude_target_send(*args)
179 elif packet ==
'SET_POSITION_TARGET_LOCAL_NED':
180 mav.mav.set_position_target_local_ned_send(
181 1, system, component, *a(13))
182 elif packet ==
'POSITION_TARGET_LOCAL_NED':
183 mav.mav.position_target_local_ned_send(*a(14))
184 elif packet ==
'SET_POSITION_TARGET_GLOBAL_INT':
185 mav.mav.set_position_target_global_int_send(
186 1, system, component, *a(13))
187 elif packet ==
'POSITION_TARGET_GLOBAL_INT':
188 mav.mav.position_target_global_int_send(*a(14))
189 elif packet ==
'LOCAL_POSITION_NED_SYSTEM_GLOBAL_OFFSET':
190 mav.mav.local_position_ned_system_global_offset_send(*a(7))
191 elif packet ==
'HIL_CONTROLS':
192 mav.mav.hil_controls_send(*a(11))
193 elif packet ==
'HIL_RC_INPUTS_RAW':
194 mav.mav.hil_rc_inputs_raw_send(*a(14))
195 elif packet ==
'HIL_ACTUATOR_CONTROLS':
196 mav.mav.hil_actuator_controls_send(1, b(16), *a(2))
197 elif packet ==
'OPTICAL_FLOW':
199 mav.mav.optical_flow_send(*a(10))
201 mav.mav.optical_flow_send(*a(8))
202 elif packet ==
'GLOBAL_VISION_POSITION_ESTIMATE':
204 args = a(7) + (b(21),)
205 mav.mav.global_vision_position_estimate_send(*args)
207 mav.mav.global_vision_position_estimate_send(*a(7))
208 elif packet ==
'VISION_POSITION_ESTIMATE':
210 args = a(7) + (b(21),)
211 mav.mav.vision_position_estimate_send(*args)
213 mav.mav.vision_position_estimate_send(*a(7))
214 elif packet ==
'VISION_SPEED_ESTIMATE':
216 args = a(4) + (b(9),)
217 mav.mav.vision_speed_estimate_send(*args)
219 mav.mav.vision_speed_estimate_send(*a(4))
220 elif packet ==
'VICON_POSITION_ESTIMATE':
222 args = a(7) + (b(21),)
223 mav.mav.vicon_position_estimate_send(*args)
225 mav.mav.vicon_position_estimate_send(*a(7))
226 elif packet ==
'HIGHRES_IMU':
227 mav.mav.highres_imu_send(*a(15))
228 elif packet ==
'OPTICAL_FLOW_RAD':
229 mav.mav.optical_flow_rad_send(*a(12))
230 elif packet ==
'HIL_SENSOR':
231 mav.mav.hil_sensor_send(*a(15))
232 elif packet ==
'SIM_STATE':
233 mav.mav.sim_state_send(*a(21))
234 elif packet ==
'RADIO_STATUS':
235 mav.mav.radio_status_send(*a(7))
236 elif packet ==
'FILE_TRANSFER_PROTOCOL':
237 mav.mav.file_transfer_protocol_send(0, system, component, b(251))
238 elif packet ==
'TIMESYNC':
239 mav.mav.timesync_send(*a(2))
240 elif packet ==
'CAMERA_TRIGGER':
241 mav.mav.camera_trigger_send(*a(2))
242 elif packet ==
'HIL_GPS':
243 mav.mav.hil_gps_send(*a(13))
244 elif packet ==
'HIL_OPTICAL_FLOW':
245 mav.mav.hil_optical_flow_send(*a(12))
246 elif packet ==
'HIL_STATE_QUATERNION':
247 mav.mav.hil_state_quaternion_send(1, b(4), *a(14))
248 elif packet ==
'SCALED_IMU2':
249 mav.mav.scaled_imu2_send(*a(10))
250 elif packet ==
'LOG_REQUEST_LIST':
251 mav.mav.log_request_list_send(system, component, *a(2))
252 elif packet ==
'LOG_ENTRY':
253 mav.mav.log_entry_send(*a(5))
254 elif packet ==
'LOG_REQUEST_DATA':
255 mav.mav.log_request_data_send(system, component, *a(3))
256 elif packet ==
'LOG_DATA':
257 args = a(3) + (b(90),)
258 mav.mav.log_data_send(*args)
259 elif packet ==
'LOG_ERASE':
260 mav.mav.log_erase_send(system, component)
261 elif packet ==
'LOG_REQUEST_END':
262 mav.mav.log_request_end_send(system, component)
263 elif packet ==
'GPS_INJECT_DATA':
264 mav.mav.gps_inject_data_send(system, component, 110, b(110))
265 elif packet ==
'GPS2_RAW':
266 mav.mav.gps2_raw_send(*a(12))
267 elif packet ==
'POWER_STATUS':
268 mav.mav.power_status_send(*a(3))
269 elif packet ==
'SERIAL_CONTROL':
270 args = a(5) + (b(70),)
271 mav.mav.serial_control_send(*args)
272 elif packet ==
'GPS_RTK':
273 mav.mav.gps_rtk_send(*a(13))
274 elif packet ==
'GPS2_RTK':
275 mav.mav.gps2_rtk_send(*a(13))
276 elif packet ==
'SCALED_IMU3':
277 mav.mav.scaled_imu3_send(*a(10))
278 elif packet ==
'DATA_TRANSMISSION_HANDSHAKE':
279 mav.mav.data_transmission_handshake_send(*a(7))
280 elif packet ==
'ENCAPSULATED_DATA':
281 mav.mav.encapsulated_data_send(1, b(253))
282 elif packet ==
'DISTANCE_SENSOR':
283 mav.mav.distance_sensor_send(*a(8))
284 elif packet ==
'TERRAIN_REQUEST':
285 mav.mav.terrain_request_send(*a(4))
286 elif packet ==
'TERRAIN_DATA':
287 args = a(4) + (b(16),)
288 mav.mav.terrain_data_send(*args)
289 elif packet ==
'TERRAIN_CHECK':
290 mav.mav.terrain_check_send(*a(2))
291 elif packet ==
'TERRAIN_REPORT':
292 mav.mav.terrain_report_send(*a(7))
293 elif packet ==
'SCALED_PRESSURE2':
294 mav.mav.scaled_pressure2_send(*a(4))
295 elif packet ==
'ATT_POS_MOCAP':
297 args = (1, b(4)) + a(3) + (b(21),)
298 mav.mav.att_pos_mocap_send(*args)
300 mav.mav.att_pos_mocap_send(1, b(4), *a(3))
301 elif packet ==
'SET_ACTUATOR_CONTROL_TARGET':
302 args = a(2) + (system, component, b(8))
303 mav.mav.set_actuator_control_target_send(*args)
304 elif packet ==
'ACTUATOR_CONTROL_TARGET':
305 args = a(2) + (b(8),)
306 mav.mav.actuator_control_target_send(*args)
307 elif packet ==
'ALTITUDE':
308 mav.mav.altitude_send(*a(7))
309 elif packet ==
'RESOURCE_REQUEST':
310 args = a(2) + (b(120), 1, b(120))
311 mav.mav.resource_request_send(*args)
312 elif packet ==
'SCALED_PRESSURE3':
313 mav.mav.scaled_pressure3_send(*a(4))
314 elif packet ==
'FOLLOW_TARGET':
315 args = a(5) + (b(3), b(3), b(4), b(3), b(3), 1)
316 mav.mav.follow_target_send(*args)
317 elif packet ==
'CONTROL_SYSTEM_STATE':
318 args = a(11) + (b(3), b(3), b(4)) + a(3)
319 mav.mav.control_system_state_send(*args)
320 elif packet ==
'BATTERY_STATUS':
321 args = a(4) + (b(10),) + a(4)
322 mav.mav.battery_status_send(*args)
323 elif packet ==
'AUTOPILOT_VERSION':
325 args = a(5) + (b(8), b(8), b(8)) + a(3) + (b(18),)
326 mav.mav.autopilot_version_send(*args)
328 args = a(5) + (b(8), b(8), b(8)) + a(3)
329 mav.mav.autopilot_version_send(*args)
330 elif packet ==
'LANDING_TARGET':
332 args = a(11) + (b(4),) + a(2)
333 mav.mav.landing_target_send(*args)
335 mav.mav.landing_target_send(*a(8))
336 elif packet ==
'ESTIMATOR_STATUS':
337 mav.mav.estimator_status_send(*a(10))
338 elif packet ==
'WIND_COV':
339 mav.mav.wind_cov_send(*a(9))
340 elif packet ==
'GPS_INPUT':
341 mav.mav.gps_input_send(*a(18))
342 elif packet ==
'GPS_RTCM_DATA':
343 args = a(2) + (b(180),)
344 mav.mav.gps_rtcm_data_send(*args)
345 elif packet ==
'HIGH_LATENCY':
346 mav.mav.high_latency_send(*a(24))
347 elif packet ==
'VIBRATION':
348 mav.mav.vibration_send(*a(7))
349 elif packet ==
'HOME_POSITION':
351 args = a(6) + (b(4),) + a(4)
352 mav.mav.home_position_send(*args)
354 args = a(6) + (b(4),) + a(3)
355 mav.mav.home_position_send(*args)
356 elif packet ==
'SET_HOME_POSITION':
358 args = (system,) + a(6) + (b(4),) + a(4)
359 mav.mav.set_home_position_send(*args)
361 args = (system,) + a(6) + (b(4),) + a(3)
362 mav.mav.set_home_position_send(*args)
363 elif packet ==
'MESSAGE_INTERVAL':
364 mav.mav.message_interval_send(*a(2))
365 elif packet ==
'EXTENDED_SYS_STATE':
366 mav.mav.extended_sys_state_send(*a(2))
367 elif packet ==
'ADSB_VEHICLE':
368 args = a(8) + (b(9),) + a(4)
369 mav.mav.adsb_vehicle_send(*args)
370 elif packet ==
'COLLISION':
371 mav.mav.collision_send(*a(7))
372 elif packet ==
'V2_EXTENSION':
373 mav.mav.v2_extension_send(1, system, component, 1, a(249))
374 elif packet ==
'MEMORY_VECT':
375 args = a(3) + (b(32),)
376 mav.mav.memory_vect_send(*args)
377 elif packet ==
'DEBUG_VECT':
378 mav.mav.debug_vect_send(b(10), *a(4))
379 elif packet ==
'NAMED_VALUE_FLOAT':
380 mav.mav.named_value_float_send(1, b(10), 1)
381 elif packet ==
'NAMED_VALUE_INT':
382 mav.mav.named_value_int_send(1, b(10), 1)
383 elif packet ==
'STATUSTEXT':
384 mav.mav.statustext_send(1, b(50))
385 elif packet ==
'DEBUG':
386 mav.mav.debug_send(*a(3))
387 elif packet ==
'SETUP_SIGNING':
388 mav.mav.setup_signing_send(system, component, b(32), 1)
389 elif packet ==
'BUTTON_CHANGE':
390 mav.mav.button_change_send(*a(3))
391 elif packet ==
'PLAY_TUNE':
392 mav.mav.play_tune_send(system, component, b(30))
393 elif packet ==
'CAMERA_IMAGE_CAPTURED':
394 args = a(7) + (b(4),) + a(2) + (b(205),)
395 mav.mav.camera_image_captured_send(*args)
396 elif packet ==
'FLIGHT_INFORMATION':
397 mav.mav.flight_information_send(*a(4))
398 elif packet ==
'MOUNT_ORIENTATION':
399 mav.mav.mount_orientation_send(*a(4))
400 elif packet ==
'LOGGING_DATA':
401 args = (system, component) + a(3) + (b(249),)
402 mav.mav.logging_data_send(*args)
403 elif packet ==
'LOGGING_DATA_ACKED':
404 args = (system, component) + a(3) + (b(249),)
405 mav.mav.logging_data_acked_send(*args)
406 elif packet ==
'LOGGING_ACK':
407 mav.mav.logging_ack_send(system, component, 1)
408 elif packet ==
'WIFI_CONFIG_AP':
409 mav.mav.wifi_config_ap_send(b(32), b(64))
410 elif packet ==
'PROTOCOL_VERSION':
411 args = a(3) + (b(8), b(8))
412 mav.mav.protocol_version_send(*args)
413 elif packet ==
'UAVCAN_NODE_STATUS':
414 mav.mav.uavcan_node_status_send(*a(6))
415 elif packet ==
'UAVCAN_NODE_INFO':
416 args = a(2) + (b(80),) + a(2) + (b(16),) + a(3)
417 mav.mav.uavcan_node_info_send(*args)
418 elif packet ==
'OBSTACLE_DISTANCE':
419 args = a(2) + (b(72),) + a(3)
420 mav.mav.obstacle_distance_send(*args)
422 print(
'unknown packet type {:s}'.format(packet))
427 parts = line.split(
' to ')
430 system, component = parts[1].split(
'.')
434 return packet, int(system), int(component)
438 with open(filename)
as f:
439 content = f.readlines()
440 return [
parse_line(x.strip())
for x
in content]
444 if not args[
'mavlink1']:
445 os.environ[
'MAVLINK20'] =
'1' 446 mavutil.set_dialect(
'common')
448 mav = mavutil.mavlink_connection(
'udpout:' + args[
'udp'],
449 source_system=args[
'system'], source_component=args[
'component'])
451 mav = mavutil.mavlink_connection(args[
'serial'], baud=57600,
452 source_system=args[
'system'], source_component=args[
'component'])
459 parser = ArgumentParser(description=
'Send mavlink packets from file.')
460 parser.add_argument(
'system', type=int, help=
'system ID')
461 parser.add_argument(
'component', type=int, help=
'component ID')
462 parser.add_argument(
'script', help=
'script file to run')
464 '--mavlink1', action=
'store_true',
465 help=
'force MAVLink v1.0 instead of v2.0')
467 '--udp', action=
'store', help=
'UDP address:port to connect to')
469 '--serial', action=
'store', help=
'serial port device string')
470 args = vars(parser.parse_args())
471 if not args[
'udp']
and not args[
'serial']:
472 print(
'expected --udp or --serial option')
474 if args[
'udp']
and args[
'serial']:
475 print(
'expected --udp or --serial option, but not both')
484 last_heartbeat = datetime.now() - timedelta(seconds=180)
485 for packet, system, component
in packets:
486 if ((datetime.now() - last_heartbeat) > timedelta(seconds=120)):
487 last_heartbeat = datetime.now()
488 mav.mav.heartbeat_send(0, 0, 0, 0, 0)
493 if __name__ ==
'__main__':
def start_connection(args)
def send_packet(mav, packet, system=0, component=0)