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与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方式添加自定义传感器(1)

    PX4使用I2C方式添加自定义传感器 xff08 1 xff09 前言 毕业设计就是要在PX4上添加一个传感器 xff08 角度传感器 xff09 xff0c 由于板子上的接口数量很少 xff0c 很是宝贵 最后只能选择通过I2C通信方式
  • px4自定义mavlink收不到消息的问题

    px4版本1 12稳定版 最近在做px4二次开发相关工作 按照网上的一些教程自定义了一个mavlink消息用来控制无人机 按照教程里面的单独开了一个xml来定义消息 最后生成的消息在px4端通过流传输的方式自己写的客户端可以收到消息 但是客
  • 【8-12】树莓派部署t265+px4飞控实现无人机视觉定位

    在之前的文章中 xff0c 我们已经成功在树莓派 xff08 ubuntu mate 18 04 xff09 上部署了T265的追踪摄像头 本文将利用MAVROS协议 xff0c 将T265测量的位姿信息发送给px4固件 xff0c 实现室
  • PX4/Pixhawk---uORB深入理解和应用

    The Instructions of uORB PX4 Pixhawk 软件体系结构 uORB 主题发布 主题订阅 1 简介 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c
  • PX4 GAZEBO无人机添加相机并进行图像识别

    PX4 GAZEBO无人机添加摄像头并进行图像识别 在之前完成了ROS的安装和PX4的安装 xff0c 并可以通过roslaunch启动软件仿真 接下来为无人及添加相机 xff0c 并将图像用python函数读取 xff0c 用于后续操作
  • PX4 Bootloader下载及编译过程中的问题解决

    买来的雷迅的板子都是Bootloader已经烧进去了 xff0c Fireware也已经刷进去了 如果是自制的板子 xff0c 上位机根本没法识别板子 xff0c 必须先烧写下载Bootloader后编译好的bin文件 这篇记一下自己下载及
  • PX4源代码下载编译

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r
  • 初学PX4之环境搭建

    文章转自 xff1a http www jianshu com p 36dac548106b 前言 前段时间linux崩溃了 xff0c 桌面进去后只有背景 xff0c 折腾好久没搞定 xff0c 为了节省时间索性重装了系统 xff0c 同
  • PX4模块设计之六:PX4-Fast RTPS(DDS)简介

    64 TOC PX4模块设计之六 xff1a PX4 Fast RTPS DDS 简介 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分析内部模块功能设计 PX4 Fast RTPS DDS 具有实时发布 订阅uORB消息接口
  • 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模块设计之四十五:param模块

    PX4模块设计之四十五 xff1a param模块 1 param模块简介2 模块入口函数param main3 重要函数列表4 总结5 参考资料 1 param模块简介 Description Command to access and
  • Px4源码框架结构图

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

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • 步骤三:PX4,Mavros的下载安装及代码测试

    1 安装Mavros sudo apt install ros melodic mavros ros melodic mavros extras 2 安装Mavros相关的 geographiclib dataset 此处已经加了ghpro
  • PX4通过参数脚本给飞控导入参数

    PX4通过参数脚本给飞控导入参数 先找一架正常能飞的无人机连接地面站 在参数页面右上角点击工具 gt 保存到文件 保存的时候文件名注明参数的相关信息 然后将需要加载参数的无人机连接至地面站 xff0c 注意需要加载参数的无人机必须和保存的参
  • 无人机PX4使用动捕系统mocap的位置实现控制+MAVROS

    动捕系统Optitrack xff0c 有很高的定位精度 xff0c 能够给无人机提供比较精确的位置信息 xff0c 因此如果实验室有条件 xff0c 都可以买一套动捕系统 动捕系统的原理 xff1a 光学式动作捕捉依靠一整套精密而复杂的光
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • 四、无人机知识笔记(初级:基本运动原理)

    笔记来源于 沈阳无距科技 工业级无人机的中国名片 编程外星人 目录 一 多旋翼直升机 二 基本飞行姿态 三 多旋翼飞行原理 四 反扭力与偏航运动 五 螺旋桨 六 有刷电机和无刷电机 七 电调与PWM信号 八 动力电池 九 遥控器 十 机架设

随机推荐

  • 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