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模块 的相关文章

  • PX4二次开发中查无资料的踩坑总结

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

    px4版本1 12稳定版 最近在做px4二次开发相关工作 按照网上的一些教程自定义了一个mavlink消息用来控制无人机 按照教程里面的单独开了一个xml来定义消息 最后生成的消息在px4端通过流传输的方式自己写的客户端可以收到消息 但是客
  • 编译PX4固件

    PX4编译 文章目录 PX4编译疑难杂症bug1bug2catkin build isolated 官方脚本Step1Step2 安装常用依赖Step3 创建并运行脚本Step4 补全代码子模块Step5 验证仿真 官方offboard 例
  • PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错

    PX4 SITL Gazebo 仿真时 libgazebo multirotor base plugin 插件运行时出错 问题描述原因分析解决办法总结 问题描述 在 Gazebo 中进行 PX4 的软件在环仿真时 xff0c 执 make
  • PX4位置控制offboard模式说明

    offboard模式的开发及应用 一 px4固件的模式 px4固件支持10几种飞行模式 xff0c 从代码结构上分析 xff0c 分为基本模式 自定义模式和自定义子模式 1 基本模式 基本模式又分为 xff0c 位置控制模式 自稳模式 手动
  • PX4+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https docs px4 io main zh ros mavros offboard cpp html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 键盘控制飞行代码 可以先借鉴本篇博客 xf
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • 从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进入系统控制台以及运行程序

    这里提供进入控制台两种办法 1 运行 Tools mavlink shell py dev ttyACM0 是我进入Px4系统控制台的命令 xff0c 进入之后应该是这样 Pixhawk src Firmware Tools mavlink
  • PX4模块设计之五:自定义MAVLink消息

    PX4模块设计之五 xff1a 自定义MAVLink消息 1 MAVLink Dialects1 1 PX4 Dialects1 2 Paprazzi Dialects1 3 MAVLink XML File Format 2 添加自定义M
  • PX4模块设计之九:PX4飞行模式简介

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • 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模块设计之二十三:自定义FlightTask

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

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

    PX4模块设计之四十五 xff1a param模块 1 param模块简介2 模块入口函数param main3 重要函数列表4 总结5 参考资料 1 param模块简介 Description Command to access and
  • PX4模块设计之四十七:mavlink模块

    PX4模块设计之四十七 xff1a mavlink模块 1 mavlink模块简介2 模块入口函数mavlink main3 mavlink模块重要函数3 1 Mavlink start3 2 Mavlink task main3 3 Ma
  • px4无人机常识介绍(固件,px4等)

    专业名词解释 aircraft 任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机 航空器 uav 无人驾驶飞机 vehicle 飞行器 airplane plane aero plane 有机翼和一个或多个引擎的飞行器统称为飞机 D
  • px4下载指定版本的固件、git用法

    https hub fastgit org PX4 PX4 Autopilot git describe tag 查看当前版本号 git tag l 查看所有版本 xff0c 也就是打个tag git checkout v1 9 1 跳转到
  • PX4中自定义MAVLink消息(记录)

    简单记录一下这个过程 一 自定义uORB消息 这一步比较简单 xff0c 首先在msg 中新建ca trajectory msg文件 uint64 timestamp time since system start span class t
  • 大神浅谈无人机飞控软件设计 系统性总结

    写在前面 深感自己对飞控软件 算法的知识点过于杂乱 很久没有进行系统的总结了 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 如内容有错误 欢迎指出 1 飞控软件的基本模块 无人机能够飞行主要是依靠传感

随机推荐

  • PX4模块设计之二十四:内部ADC模块

    PX4模块设计之二十四 xff1a 内部ADC模块 1 内部ADC模块简介2 模块入口函数2 1 主入口board adc main2 2 自定义子命令custom command 3 内部ADC模块重要函数3 1 task spawn3
  • PX4模块设计之二十五:DShot模块

    PX4模块设计之二十五 xff1a DShot模块 1 DShot模块简介2 DShot类继承关系3 模块入口函数3 1 主入口dshot main3 2 自定义子命令custom command 4 DShot模块重要函数4 1 task
  • PX4模块设计之二十六:BatteryStatus模块

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

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • CentOS-7 中安装VS Code 并启动

    VSCode安装 安装平台 xff1a CentOS7 安装方法 xff1a 1 在官网上下载64位 xff08 或者32位 xff09 的rpm包 xff08 官网地址 xff1a https code visualstudio com
  • PX4模块设计之二十八:RCInput模块

    PX4模块设计之二十八 xff1a RCInput模块 1 RCInput模块简介2 模块入口函数2 1 主入口rc input main2 2 自定义子命令custom command2 3 模块状态print status 重载 3 R
  • PX4模块设计之二十九:RCUpdate模块

    PX4模块设计之二十九 xff1a RCUpdate模块 1 RCUpdate模块简介2 模块入口函数2 1 主入口rc update main2 2 自定义子命令custom command2 3 模块状态print status 重载
  • 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模块设计之三十二:AttitudeEstimatorQ模块

    PX4模块设计之三十二 xff1a AttitudeEstimatorQ模块 1 AttitudeEstimatorQ模块简介2 模块入口函数2 1 主入口attitude estimator q main2 2 自定义子命令custom
  • PX4模块设计之三十三:Sensors模块

    PX4模块设计之三十三 xff1a Sensors模块 1 Sensors模块简介2 模块入口函数2 1 主入口sensors main2 2 自定义子命令custom command2 3 模块状态print status 重载 3 Se
  • 树莓派(Raspberry Pi)miniDLNA服务搭建

    树莓派 Raspberry Pi miniDLNA服务搭建 1 MiniDLNA简介2 安装前提3 安装步骤4 服务配置5 进程配置6 参考资料7 补充资料7 1 配置外置硬盘 xff08 媒体库 xff09 7 2 配置samba符号链接
  • PX4模块设计之三十四:ControlAllocator模块

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

    PX4模块设计之三十五 xff1a MulticopterAttitudeControl模块 1 MulticopterAttitudeControl模块简介2 模块入口函数2 1 主入口mc att control main2 2 自定义
  • 穿越机用途和机架尺寸

    穿越机用途和机架尺寸 1 穿越机的用途2 穿越机的机架3 机架的类型3 1 正X型机架3 2 宽X型机架3 3 长X型机架3 4 Hybrid机架3 5 涵道机架 4 总结 1 穿越机的用途 穿越机按功能分 xff0c 主要分为竞速Race
  • HC05和电脑蓝牙通讯

    通常情况下都是将HC05和HC04进行主从配对 xff0c 然后进行通讯 如果手边没有HC04其实可以使用笔记本自带的蓝牙和HC05进行通讯 配置方法如下 xff1a 将HC05配置为主机模式将电脑和HC05的保存连接删除 单击下方更多蓝牙
  • PX4模块设计之三十六:MulticopterPositionControl模块

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

    PX4模块设计之三十七 xff1a MulticopterRateControl模块 1 MulticopterRateControl模块简介2 模块入口函数2 1 主入口mc rate control main2 2 自定义子命令cust
  • PX4模块设计之三十八:Navigator模块

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

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