PX4模块设计之三十九:Commander模块

2023-05-16

PX4模块设计之三十九:Commander模块

  • 1. Commander模块简介
  • 2. 模块入口函数
    • 2.1 主入口commander_main
    • 2.2 自定义子命令custom_command
  • 3. Commander模块重要函数
    • 3.1 task_spawn
    • 3.2 instantiate
    • 3.3 init
    • 3.4 Run
  • 4. 总结
  • 5. 参考资料

1. Commander模块简介

### Description
The commander module contains the state machine for mode switching and failsafe behavior.

commander <command> [arguments...]
 Commands:
   start
     [-h]        Enable HIL mode

   calibrate     Run sensor calibration
     mag|baro|accel|gyro|level|esc|airspeed Calibration type
     quick       Quick calibration (accel only, not recommended)

   check         Run preflight checks

   arm
     [-f]        Force arming (do not run preflight checks)

   disarm
     [-f]        Force disarming (disarm in air)

   takeoff

   land

   transition    VTOL transition

   mode          Change flight mode
     manual|acro|offboard|stabilized|altctl|posctl|auto:mission|auto:loiter|auto
                 :rtl|auto:takeoff|auto:land|auto:precland Flight mode

   pair

   lockdown
     on|off      Turn lockdown on or off

   set_ekf_origin
     lat, lon, alt Origin Latitude, Longitude, Altitude

   lat|lon|alt   Origin latitude longitude altitude

   poweroff      Power off board (if supported)

   stop

   status        print status info

注:print_usage函数是具体对应实现。

class Commander : public ModuleBase<Commander>, public ModuleParams

注:Commander模块采用了ModuleBase, 但没有使用WorkQueue设计,因此在实现上需要实现instantiate方法。

2. 模块入口函数

2.1 主入口commander_main

同样继承了ModuleBase,由ModuleBase的main来完成模块入口。

commander_main
 └──> return Commander::main(argc, argv)

2.2 自定义子命令custom_command

模块除支持start/stop/status命令,自定义命令支持以下子命令:

  • calibrate: [gyro/mag/baro/accel/level/airspeed/esc]
  • check:
  • arm: [-f]
  • disarm: [-f]
  • takeoff:
  • land:
  • transition:
  • mode: [manual/altctl/posctl/auto:mission/auto:loiter/auto:rtl/acro/offboard/stabilized/auto:takeoff/auto:land/auto:precland]
  • lockdown: [on/off]
  • pair:
  • set_ekf_origin: [latitude] [longitude] [altitude]
  • poweroff:
Commander::custom_command
 ├──> <!is_running()>
 │   ├──> print_usage("not running")
 │   └──> return 1
 ├──> <!strcmp(argv[0], "calibrate")>
 │   ├──> <!strcmp(argv[1], "gyro")>  // gyro calibration: param1 = 1
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_CALIBRATION, 1.f, 0.f, 0.f, 0.f, 0.0, 0.0, 0.f)
 │   ├──> <!strcmp(argv[1], "mag")>
 │   │   ├──> <argc > 2 && (strcmp(argv[2], "quick") == 0)>  // magnetometer quick calibration: VEHICLE_CMD_FIXED_MAG_CAL_YAW
 │   │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_FIXED_MAG_CAL_YAW)
 │   │   └──> <else>  // magnetometer calibration: param2 = 1
 │   │       └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_CALIBRATION, 0.f, 1.f, 0.f, 0.f, 0.0, 0.0, 0.f)
 │   ├──> <!strcmp(argv[1], "baro")>  // baro calibration: param3 = 1
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_CALIBRATION, 0.f, 0.f, 1.f, 0.f, 0.0, 0.0, 0.f)
 │   ├──> <!strcmp(argv[1], "accel")>
 │   │   ├──> <argc > 2 && (strcmp(argv[2], "quick") == 0)>  // accelerometer quick calibration: param5 = 3
 │   │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_CALIBRATION, 0.f, 0.f, 0.f, 0.f, 4.0, 0.0, 0.f)
 │   │   └──> <else>  // accelerometer calibration: param5 = 1
 │   │       └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_CALIBRATION, 0.f, 0.f, 0.f, 0.f, 1.0, 0.0, 0.f)
 │   ├──> <!strcmp(argv[1], "level")> // board level calibration: param5 = 2
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_CALIBRATION, 0.f, 0.f, 0.f, 0.f, 2.0, 0.0, 0.f)
 │   ├──> <!strcmp(argv[1], "airspeed")>  // airspeed calibration: param6 = 2
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_CALIBRATION, 0.f, 0.f, 0.f, 0.f, 0.0, 2.0, 0.f)
 │   ├──> <!strcmp(argv[1], "esc")>  // ESC calibration: param7 = 1
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_CALIBRATION, 0.f, 0.f, 0.f, 0.f, 0.0, 0.0, 1.f)
 │   └──> <else>
 │       └──> PX4_ERR("missing argument")
 ├──> <!strcmp(argv[0], "check")>
 │   ├──> uORB::Subscription vehicle_status_sub{ORB_ID(vehicle_status)}
 │   ├──> vehicle_status_sub.copy(&vehicle_status)
 │   ├──> uORB::Subscription vehicle_status_flags_sub{ORB_ID(vehicle_status_flags)}
 │   ├──> vehicle_status_flags_sub.copy(&vehicle_status_flags)
 │   ├──> uORB::Subscription vehicle_control_mode_sub{ORB_ID(vehicle_control_mode)}
 │   ├──> vehicle_control_mode_sub.copy(&vehicle_control_mode)
 │   ├──> bool preflight_check_res = PreFlightCheck::preflightCheck(nullptr, vehicle_status, vehicle_status_flags,
 │   │					   vehicle_control_mode,
 │   │					   true, // report_failures
 │   │					   30_s,
 │   │					   false, // safety_buttton_available not known
 │   │					   false) // safety_off not known
 │   ├──> PX4_INFO("Preflight check: %s", preflight_check_res ? "OK" : "FAILED")
 │   ├──> print_health_flags(vehicle_status)
 │   └──> return 0
 ├──> <!strcmp(argv[0], "arm")>
 │   ├──> float param2 = 0.f
 │   ├──> <argc > 1 && !strcmp(argv[1], "-f")>  // 21196: force arming/disarming (e.g. allow arming to override preflight checks and disarming in flight)
 │   │   └──> param2 = 21196.f
 │   ├──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_COMPONENT_ARM_DISARM,
 │   │				     static_cast<float>(vehicle_command_s::ARMING_ACTION_ARM),
 │   │				     param2)
 │   └──> return 0
 ├──> <!strcmp(argv[0], "disarm")>
 │   ├──> float param2 = 0.f
 │   ├──> <argc > 1 && !strcmp(argv[1], "-f")>  // 21196: force arming/disarming (e.g. allow arming to override preflight checks and disarming in flight)
 │   │   └──> param2 = 21196.f
 │   ├──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_COMPONENT_ARM_DISARM,
 │   │				     static_cast<float>(vehicle_command_s::ARMING_ACTION_DISARM),
 │   │				     param2)
 │   └──> return 0
 ├──> <!strcmp(argv[0], "takeoff")>  // switch to takeoff mode and arm
 │   ├──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_NAV_TAKEOFF)
 │   ├──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_COMPONENT_ARM_DISARM,
 │   │				     static_cast<float>(vehicle_command_s::ARMING_ACTION_ARM),
 │   │				     0.f)
 │   └──> return 0
 ├──> <!strcmp(argv[0], "land")>
 │   ├──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_NAV_LAND)
 │   └──> return 0
 ├──> <!strcmp(argv[0], "transition")>
 │   ├──> uORB::Subscription vehicle_status_sub{ORB_ID(vehicle_status)}
 │   ├──> vehicle_status_sub.copy(&vehicle_status)
 │   ├──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_VTOL_TRANSITION,
 │   │				     (float)(vehicle_status.vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING ?
 │   │					     vtol_vehicle_status_s::VEHICLE_VTOL_STATE_FW :
 │   │					     vtol_vehicle_status_s::VEHICLE_VTOL_STATE_MC), 0.0f)
 │   └──> return 0
 ├──> <!strcmp(argv[0], "mode")>
 │   ├──> <!strcmp(argv[1], "manual")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_MANUAL)
 │   ├──> <!strcmp(argv[1], "altctl")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_ALTCTL)
 │   ├──> <!strcmp(argv[1], "posctl")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_POSCTL)
 │   ├──> <!strcmp(argv[1], "auto:mission")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_AUTO,PX4_CUSTOM_SUB_MODE_AUTO_MISSION)
 │   ├──> <!strcmp(argv[1], "auto:loiter")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_AUTO,PX4_CUSTOM_SUB_MODE_AUTO_LOITER)
 │   ├──> <!strcmp(argv[1], "auto:rtl")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_AUTO,PX4_CUSTOM_SUB_MODE_AUTO_RTL)
 │   ├──> <!strcmp(argv[1], "acro")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_ACRO)
 │   ├──> <!strcmp(argv[1], "offboard")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_OFFBOARD)
 │   ├──> <!strcmp(argv[1], "stabilized")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_STABILIZED)
 │   ├──> <!strcmp(argv[1], "auto:takeoff")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_AUTO,PX4_CUSTOM_SUB_MODE_AUTO_TAKEOFF)
 │   ├──> <!strcmp(argv[1], "auto:land")) {
 │   │   └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_AUTO,PX4_CUSTOM_SUB_MODE_AUTO_LAND)
 │   └──> <!strcmp(argv[1], "auto:precland")) {
 │       └──> send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_MODE, 1, PX4_CUSTOM_MAIN_MODE_AUTO,PX4_CUSTOM_SUB_MODE_AUTO_PRECLAND)
 ├──> <!strcmp(argv[0], "lockdown")>
 │   ├──> bool ret = send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_FLIGHTTERMINATION, strcmp(argv[1], "off") ? 2.0f : 0.0f /* lockdown */, 0.0f)
 │   └──> return (ret ? 0 : 1)
 ├──> <!strcmp(argv[0], "pair")> // GCS pairing request handled by a companion
 │   ├──> bool ret = broadcast_vehicle_command(vehicle_command_s::VEHICLE_CMD_START_RX_PAIR, 10.f)
 │   └──> return (ret ? 0 : 1)
 ├──> <!strcmp(argv[0], "set_ekf_origin")>  // Set the ekf NED origin global coordinates.
 │   ├──> double latitude  = atof(argv[1]) 
 │   ├──> double longitude = atof(argv[2]) 
 │   ├──> float  altitude  = atof(argv[3])
 │   ├──> bool ret = send_vehicle_command(vehicle_command_s::VEHICLE_CMD_SET_GPS_GLOBAL_ORIGIN, 0.f, 0.f, 0.0, 0.0, latitude, longitude, altitude)
 │   └──> return (ret ? 0 : 1)
 ├──> <!strcmp(argv[0], "poweroff")>
 │   ├──> bool ret = send_vehicle_command(vehicle_command_s::VEHICLE_CMD_PREFLIGHT_REBOOT_SHUTDOWN,2.0f)
 │   └──> return (ret ? 0 : 1)
 └──> return print_usage("unknown command")

3. Commander模块重要函数

3.1 task_spawn

这里直接使用px4_task_spawn_cmd创建任务。

Commander::task_spawn
 ├──> _task_id = px4_task_spawn_cmd("commander",SCHED_DEFAULT,SCHED_PRIORITY_DEFAULT + 40,3250,(px4_main_t)&run_trampoline,(char *const *)argv);
 ├──> <_task_id < 0>
 │   ├──> _task_id = -1
 │   └──> return -errno
 ├──> <wait_until_running() < 0>  // wait until task is up & running
 │   ├──> _task_id = -1
 │   └──> return -1
 └──> return 0

注:鉴于ModuleBase::run_trampoline会直接调用instantiate初始化任务,Commander模块就必须对Commander::instantiate方法进行重载实现。

3.2 instantiate

初始化Commander类实例。

Commander::instantiate
 ├──> Commander *instance = new Commander()
 ├──> <instance><argc >= 2 && !strcmp(argv[1], "-h")>
 │   └──> instance->enable_hil()
 └──> return instance;

3.3 init

注:鉴于该模块采用任务,而之前大量的模块使用了WorkQueue的设计方法,在task_spawn里会调用init这个方法,为了对比,保留这个方法。

3.4 Run

根据输入参数及业务逻辑计算输出量,并发布消息。

Commander::Run
 ├──> [LED 初始化]
 ├──> [Buzzer 初始化]
 ├──> [PowerButton 初始化]
 ├──> arm_auth_init(&_mavlink_log_pub, &_vehicle_status.system_id);
 ├──> <while(!should_exit())>
 │   ├──> [update parameters ]
 │   ├──> [Update OA parameter ]
 │   ├──> [handle power button state ]
 │   ├──> [Update land detector ]
 │   ├──> [safety button ]
 │   ├──> [update vtol vehicle status]
 │   ├──> [Auto disarm when landed or kill switch engaged]
 │   ├──> [_geofence_warning_action_off when MAIN_STATE_AUTO_RTL/MAIN_STATE_AUTO_LOITER/MAIN_STATE_AUTO_LAND
 │   ├──> [battery_status_check]
 │   ├──> [If in INIT state, try to proceed to STANDBY state ]
 │   ├──> [start mission result check ]
 │   ├──> [start geofence result check & action ]
 │   ├──> [Check for mission flight termination ]
 │   ├──> [data link checks which update the status]
 │   ├──> [avoidance_check]
 │   ├──> [handle commands last, as the system needs to be updated to handle them ]
 │   ├──> [Check for failure detector status ]
 │   ├──> [Check wind speed actions if either high wind warning or high wind RTL is enabled]
 │   ├──> [Trigger RTL if flight time is larger than max flight time specified in COM_FLT_TIME_MAX.The user is not able to override once above threshold, except for triggering Land.]
 │   ├──> [automatically set or update home position]
 │   ├──> [check for arming state changes]
 │   ├──> [now set navigation state according to failsafe and main state ]
 │   ├──> [publish states (armed, control_mode, vehicle_status, commander_state, vehicle_status_flags, failure_detector_status) at 2 Hz or immediately when changed
 │   ├──> [play arming and battery warning tunes ]
 │   ├──> [reset arm_tune_played when disarmed ]
 │   ├──> [check if the worker has finished]
 │   ├──> [store last position lock state ]
 │   └──> [sleep if there are no vehicle_commands or action_requests to process]
 ├──> led_deinit();
 └──> buzzer_deinit();

4. 总结

具体逻辑业务后续再做深入,从模块代码角度:

  • 输入
uORB::Subscription					_action_request_sub {ORB_ID(action_request)};
uORB::Subscription					_cpuload_sub{ORB_ID(cpuload)};
uORB::Subscription					_esc_status_sub{ORB_ID(esc_status)};
uORB::Subscription					_estimator_selector_status_sub{ORB_ID(estimator_selector_status)};
uORB::Subscription					_estimator_status_sub{ORB_ID(estimator_status)};
uORB::Subscription					_geofence_result_sub{ORB_ID(geofence_result)};
uORB::Subscription					_iridiumsbd_status_sub{ORB_ID(iridiumsbd_status)};
uORB::Subscription					_vehicle_land_detected_sub{ORB_ID(vehicle_land_detected)};
uORB::Subscription					_manual_control_setpoint_sub{ORB_ID(manual_control_setpoint)};
uORB::Subscription					_rtl_time_estimate_sub{ORB_ID(rtl_time_estimate)};
uORB::Subscription					_system_power_sub{ORB_ID(system_power)};
uORB::Subscription					_vehicle_angular_velocity_sub{ORB_ID(vehicle_angular_velocity)};
uORB::Subscription					_vehicle_attitude_sub{ORB_ID(vehicle_attitude)};
uORB::Subscription					_vehicle_command_sub{ORB_ID(vehicle_command)};
uORB::Subscription					_vehicle_gps_position_sub{ORB_ID(vehicle_gps_position)};
uORB::Subscription					_vtol_vehicle_status_sub{ORB_ID(vtol_vehicle_status)};
uORB::Subscription					_wind_sub{ORB_ID(wind)};

uORB::SubscriptionInterval				_parameter_update_sub{ORB_ID(parameter_update), 1_s};

uORB::SubscriptionMultiArray<battery_status_s, battery_status_s::MAX_INSTANCES> _battery_status_subs{ORB_ID::battery_status};
uORB::SubscriptionMultiArray<distance_sensor_s>         _distance_sensor_subs{ORB_ID::distance_sensor};
uORB::SubscriptionMultiArray<telemetry_status_s>        _telemetry_status_subs{ORB_ID::telemetry_status};

#if defined(BOARD_HAS_POWER_CONTROL)
uORB::Subscription					_power_button_state_sub {ORB_ID(power_button_state)};
#endif // BOARD_HAS_POWER_CONTROL

uORB::SubscriptionData<estimator_status_flags_s>	_estimator_status_flags_sub{ORB_ID(estimator_status_flags)};
uORB::SubscriptionData<mission_result_s>		_mission_result_sub{ORB_ID(mission_result)};
uORB::SubscriptionData<offboard_control_mode_s>		_offboard_control_mode_sub{ORB_ID(offboard_control_mode)};
uORB::SubscriptionData<vehicle_global_position_s>	_global_position_sub{ORB_ID(vehicle_global_position)};
uORB::SubscriptionData<vehicle_local_position_s>	_local_position_sub{ORB_ID(vehicle_local_position)};
  • 输出
uORB::Publication<actuator_armed_s>			_actuator_armed_pub{ORB_ID(actuator_armed)};
uORB::Publication<commander_state_s>			_commander_state_pub{ORB_ID(commander_state)};
uORB::Publication<failure_detector_status_s>		_failure_detector_status_pub{ORB_ID(failure_detector_status)};
uORB::Publication<test_motor_s>				_test_motor_pub{ORB_ID(test_motor)};
uORB::Publication<actuator_test_s>			_actuator_test_pub{ORB_ID(actuator_test)};
uORB::Publication<vehicle_control_mode_s>		_vehicle_control_mode_pub{ORB_ID(vehicle_control_mode)};
uORB::Publication<vehicle_status_flags_s>		_vehicle_status_flags_pub{ORB_ID(vehicle_status_flags)};
uORB::Publication<vehicle_status_s>			_vehicle_status_pub{ORB_ID(vehicle_status)};

uORB::PublicationData<home_position_s>			_home_position_pub{ORB_ID(home_position)};

uORB::Publication<vehicle_command_ack_s>		_vehicle_command_ack_pub{ORB_ID(vehicle_command_ack)};

5. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十一:Built-In框架
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之十七:ModuleBase模块
【6】PX4模块设计之三十:Hysteresis类
【7】PX4 modules_main

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4模块设计之三十九:Commander模块 的相关文章

  • pixhawk: px4代码初学分析:追溯电机控制--pwm输出

    追溯电机控制 pwm输出 正常工作状态下pwm输出过程简述 xff1a 其他状态下pwm输出 xff1a 正常工作状态下pwm输出过程简述 xff1a 姿态解算部分得出姿态控制量通过px4io cpp把姿态控制量发送给IOIO串口读取姿态控
  • PX4二次开发中查无资料的踩坑总结

    写在前 xff1a 2021年9月下旬开始摸索px4飞控的二次开发 xff0c 从C 43 43 零基础到第一个修改算法后的版本稳定运行 xff0c 大概用了2个月 xff0c 从12月初改用新版本px4源码到现在又过去了约1个月 xff0
  • PX4与TX2通信

    PX4与TX2通信以及相关数据的获取 目录 1 PX4硬件接口 2 TELEM1 2接口线序 3 PX4与TX2通信 PX4 IO口定义 xff1a PX4硬件 xff1a 4 通信测试 5 RTPS 43 ROS Jetson TX2终端
  • PX4通过I2C方式添加自定义传感器(2)

    PX4 I2C通信方式传感器驱动分析 xff08 以ets airspeed为例 xff09 1 说明 这篇文章我们就来看看I2C传感器的驱动过程 xff0c 当然里面也有很多东西我不是很理解 xff0c 所以仅谈我领悟的一些东西 我就以e
  • 【8-12】树莓派部署t265+px4飞控实现无人机视觉定位

    在之前的文章中 xff0c 我们已经成功在树莓派 xff08 ubuntu mate 18 04 xff09 上部署了T265的追踪摄像头 本文将利用MAVROS协议 xff0c 将T265测量的位姿信息发送给px4固件 xff0c 实现室
  • px4: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • Ubuntu18.04安装PX4踩坑、报错及解决方案整理

    笔者最近需要跑无人机巡检大坝的仿真 xff0c 于是在自己的Ubuntu2018 04中开始安装PX4 xff0c 问过不少之前已经装过PX4的师兄和同学 xff0c 都曾在PX4安装过程中踩过许多坑 xff0c 耗费了不少时间 xff0c
  • PX4无人机 - 键盘控制飞行代码

    PX4无人机 键盘控制飞行代码 仿真效果 实机效果 由于图片限制5M以内 xff0c 只能上传一小段了 xff0c 整段视频请点击链接 Pixhawk 6c 无人机 键盘控制无人机 Offboard模式 核心 xff1a 发布 mavros
  • PX4代码学习系列博客(5)——在px4中添加自己的模块

    怎么在px4中添加自己的模块 在 px4固件目录结构和代码风格 这一节 xff0c 曾经说过NuttX是一个实时的嵌入式系统 xff0c 上面可以像windows那样运行程序 那既然是应用程序 xff0c 那我们应该也能写一些可以在Nutt
  • Ubuntu下构建PX4软件

    本搭建过程基于http dev px4 io starting building html xff0c 希望大家互相交流学习 原文 xff1a Building PX4 Software xff08 构建PX4软件 xff09 PX4 ca
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • PX4 ---- Indoor Flight

    文章目录 室内飞行ROS amp PX4Pose Data 飞机配置MAVROS 基于工训赛 VIO 飞行总结 室内飞行 ROS amp PX4 Pose Data 飞机配置 VIO 参考此处 xff0c 采用 T265 配置 相机与飞控机
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之二十三:自定义FlightTask

    PX4模块设计之二十三 xff1a 自定义FlightTask Step1 创建飞行模式文件夹Step2 创建飞行模式源代码和CMakeLists txt文件Step3 更新CMakeLists txt文件Step4 更新FlightTas
  • PX4模块设计之三十一:ManualControl模块

    PX4模块设计之三十一 xff1a ManualControl模块 1 ManualControl模块简介2 模块入口函数2 1 主入口manual control main2 2 自定义子命令custom command 3 Manual
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • pixhawk px4 commander.cpp

    对于复杂的函数 xff0c 要做的就是看函数的输入是什么 来自哪里 xff0c 经过处理后得到什么 给谁用 xff0c 这样就可以把程序逻辑理清 中间的分析就是看函数如何处理的 span class hljs keyword extern
  • PX4中自定义MAVLink消息(记录)

    简单记录一下这个过程 一 自定义uORB消息 这一步比较简单 xff0c 首先在msg 中新建ca trajectory msg文件 uint64 timestamp time since system start span class t
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec

随机推荐

  • PX4模块设计之十:PX4启动过程

    PX4模块设计之十 xff1a PX4启动过程 1 硬件 飞控硬件上电2 硬件 飞控硬件初始化3 硬件 43 软件 飞控bootloader初始化4 硬件 43 软件 飞控系统初始化5 软件 飞控应用初始化6 配置 SD卡配置文件6 1 e
  • atop安装和使用

    atop就是一款用于监控Linux系统资源与进程的工具 xff0c 它以一定的频率记录系统的运行状态 xff0c 所采集的数据包含系统资源 CPU 内存 磁盘和网络 使用情况和进程运行情况 xff0c 并能以日志文件的方式保存在磁盘中 at
  • PX4模块设计之十一:Built-In框架

    PX4模块设计之十一 xff1a Built In框架 1 Nuttx Built In框架2 PX4 Built In框架2 1 NSH Built In关联文件2 2 NSH Built In关联文件生成2 3 NSH Built In
  • PX4模块设计之十二:High Resolution Timer设计

    PX4模块设计之十二 xff1a High Resolution Timer设计 1 HRT模块特性2 HRT模块基本功能2 1 循环触发接口2 2 延迟触发接口2 3 定时触发接口2 4 其他功能 3 HRT模块精度3 1 精度粒度3 2
  • PX4模块设计之十三:WorkQueue设计

    PX4模块设计之十三 xff1a WorkQueue设计 1 WorkQueue启动2 WorkQueue接口2 1 基本接口2 2 辅助接口2 3 WorkQueue任务函数2 3 1 Flat Build2 3 2 Protected
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之十七:ModuleBase模块

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之十八:Logger模块

    PX4模块设计之十八 xff1a Logger模块 1 Logger模块简介2 模块入口函数2 1 主入口logger main2 2 自定义子命令Logger custom command2 3 日志主题uORB注册 3 重要实现函数3
  • PX4模块设计之二十:PX4应用平台初始化

    PX4模块设计之二十 xff1a PX4应用平台初始化 1 PX4应用平台介绍2 PX4应用平台初始化实现3 讨论和思考4 参考资料 在PX4启动过程章节的基础上 xff0c 可以深入分析下PX4应用平台 xff08 框架 xff09 的实
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3
  • PX4模块设计之二十三:自定义FlightTask

    PX4模块设计之二十三 xff1a 自定义FlightTask Step1 创建飞行模式文件夹Step2 创建飞行模式源代码和CMakeLists txt文件Step3 更新CMakeLists txt文件Step4 更新FlightTas
  • PX4模块设计之二十四:内部ADC模块

    PX4模块设计之二十四 xff1a 内部ADC模块 1 内部ADC模块简介2 模块入口函数2 1 主入口board adc main2 2 自定义子命令custom command 3 内部ADC模块重要函数3 1 task spawn3
  • 5G无人车/无人船远控模块,5G图传,FPV增程,含APM/Pix图传数传一体

    本模块适用于 电机 43 电调 43 转向舵机 结构的车 船模型 插入手机SIM卡即可实现无限距离高清图传和遥控 配套安卓手机端APP xff0c 可以手机触屏操控 xff0c 也可以外接USB手柄操控 xff0c 还可以用方向盘 43 油
  • PX4模块设计之二十六:BatteryStatus模块

    PX4模块设计之二十六 xff1a BatteryStatus模块 1 BatteryStatus模块简介2 模块入口函数2 1 主入口battery status main2 2 自定义子命令custom command 3 Batter
  • PX4模块设计之三十:Hysteresis类

    PX4模块设计之三十 xff1a Hysteresis类 1 Hysteresis类简介2 Hysteresis类成员变量介绍3 Hysteresis类迟滞逻辑4 Hysteresis类重要方法4 1 Hysteresis bool ini
  • PX4模块设计之三十一:ManualControl模块

    PX4模块设计之三十一 xff1a ManualControl模块 1 ManualControl模块简介2 模块入口函数2 1 主入口manual control main2 2 自定义子命令custom command 3 Manual
  • PX4模块设计之三十三:Sensors模块

    PX4模块设计之三十三 xff1a Sensors模块 1 Sensors模块简介2 模块入口函数2 1 主入口sensors main2 2 自定义子命令custom command2 3 模块状态print status 重载 3 Se
  • PX4模块设计之三十四:ControlAllocator模块

    PX4模块设计之三十四 xff1a ControlAllocator模块 1 ControlAllocator模块简介2 模块入口函数2 1 主入口control allocator main2 2 自定义子命令custom command
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • PX4模块设计之三十九:Commander模块

    PX4模块设计之三十九 xff1a Commander模块 1 Commander模块简介2 模块入口函数2 1 主入口commander main2 2 自定义子命令custom command 3 Commander模块重要函数3 1