位置控制器PX4代码解析(文中有福利!!!)

2023-05-16

号外号外!!!本公众号将联合电子工业出版社于9月11号送出15本价值98元的全权老师著作《多旋翼飞行器设计与控制》,关注本公众号的朋友均可参加,敬请期待~~还没关注的朋友赶紧关注吧!!!
在这里插入图片描述

引言

上一讲开源飞控PX4姿态控制代码解析我们对PX4姿态控制的代码进行了详细解析,趁大家对PX4代码还有点熟悉的时候我们把位置控制器的代码部分也拿出来解读一下吧。位置控制器的代码主要是以下两个函数:

1、void PositionControl::_positionController()位于Firmware\src\modules\mc_pos_control\PositionControl.cpp文件中;

2、void PositionControl::_velocityController(const float &dt)也是位于Firmware\src\modules\mc_pos_control\PositionControl.cpp文件中;

我们先贴出两个函数的源码:

void PositionControl::_positionController()
{
  // P-position controller
  const Vector3f vel_sp_position = (_pos_sp - _pos).emult(Vector3f(_param_mpc_xy_p.get(), _param_mpc_xy_p.get(),
           _param_mpc_z_p.get()));
  _vel_sp = vel_sp_position + _vel_sp;

  // Constrain horizontal velocity by prioritizing the velocity component along the
  // the desired position setpoint over the feed-forward term.
  const Vector2f vel_sp_xy = ControlMath::constrainXY(Vector2f(vel_sp_position),
           Vector2f(_vel_sp - vel_sp_position), _param_mpc_xy_vel_max.get());
  _vel_sp(0) = vel_sp_xy(0);
  _vel_sp(1) = vel_sp_xy(1);
  // Constrain velocity in z-direction.
  _vel_sp(2) = math::constrain(_vel_sp(2), -_constraints.speed_up, _constraints.speed_down);
}

void PositionControl::_velocityController(const float &dt)
{
  // Generate desired thrust setpoint.
  // PID
  // u_des = P(vel_err) + D(vel_err_dot) + I(vel_integral)
  // Umin <= u_des <= Umax
  //
  // Anti-Windup:
  // u_des = _thr_sp; r = _vel_sp; y = _vel
  // u_des >= Umax and r - y >= 0 => Saturation = true
  // u_des >= Umax and r - y <= 0 => Saturation = false
  // u_des <= Umin and r - y <= 0 => Saturation = true
  // u_des <= Umin and r - y >= 0 => Saturation = false
  //
  //   Notes:
  // - PID implementation is in NED-frame
  // - control output in D-direction has priority over NE-direction
  // - the equilibrium point for the PID is at hover-thrust
  // - the maximum tilt cannot exceed 90 degrees. This means that it is
  //    not possible to have a desired thrust direction pointing in the positive
  //    D-direction (= downward)
  // - the desired thrust in D-direction is limited by the thrust limits
  // - the desired thrust in NE-direction is limited by the thrust excess after
  //    consideration of the desired thrust in D-direction. In addition, the thrust in
  //    NE-direction is also limited by the maximum tilt.

  const Vector3f vel_err = _vel_sp - _vel;

  // Consider thrust in D-direction.
  float thrust_desired_D = _param_mpc_z_vel_p.get() * vel_err(2) +  _param_mpc_z_vel_d.get() * _vel_dot(2) + _thr_int(
           2) - _param_mpc_thr_hover.get();

  // The Thrust limits are negated and swapped due to NED-frame.
  float uMax = -_param_mpc_thr_min.get();
  float uMin = -_param_mpc_thr_max.get();

  // make sure there's always enough thrust vector length to infer the attitude
  uMax = math::min(uMax, -10e-4f);

  // Apply Anti-Windup in D-direction.
  bool stop_integral_D = (thrust_desired_D >= uMax && vel_err(2) >= 0.0f) ||
             (thrust_desired_D <= uMin && vel_err(2) <= 0.0f);

  if (!stop_integral_D) {
    _thr_int(2) += vel_err(2) * _param_mpc_z_vel_i.get() * dt;

    // limit thrust integral
    _thr_int(2) = math::min(fabsf(_thr_int(2)), _param_mpc_thr_max.get()) * math::sign(_thr_int(2));
  }

  // Saturate thrust setpoint in D-direction.
  _thr_sp(2) = math::constrain(thrust_desired_D, uMin, uMax);

  if (PX4_ISFINITE(_thr_sp(0)) && PX4_ISFINITE(_thr_sp(1))) {
    // Thrust set-point in NE-direction is already provided. Only
    // scaling by the maximum tilt is required.
    float thr_xy_max = fabsf(_thr_sp(2)) * tanf(_constraints.tilt);
    _thr_sp(0) *= thr_xy_max;
    _thr_sp(1) *= thr_xy_max;

  } else {
    // PID-velocity controller for NE-direction.
    Vector2f thrust_desired_NE;
    thrust_desired_NE(0) = _param_mpc_xy_vel_p.get() * vel_err(0) + _param_mpc_xy_vel_d.get() * _vel_dot(0) + _thr_int(0);
    thrust_desired_NE(1) = _param_mpc_xy_vel_p.get() * vel_err(1) + _param_mpc_xy_vel_d.get() * _vel_dot(1) + _thr_int(1);

    // Get maximum allowed thrust in NE based on tilt and excess thrust.
    float thrust_max_NE_tilt = fabsf(_thr_sp(2)) * tanf(_constraints.tilt);
    float thrust_max_NE = sqrtf(_param_mpc_thr_max.get() * _param_mpc_thr_max.get() - _thr_sp(2) * _thr_sp(2));
    thrust_max_NE = math::min(thrust_max_NE_tilt, thrust_max_NE);

    // Saturate thrust in NE-direction.
    _thr_sp(0) = thrust_desired_NE(0);
    _thr_sp(1) = thrust_desired_NE(1);

    if (thrust_desired_NE * thrust_desired_NE > thrust_max_NE * thrust_max_NE) {
      float mag = thrust_desired_NE.length();
      _thr_sp(0) = thrust_desired_NE(0) / mag * thrust_max_NE;
      _thr_sp(1) = thrust_desired_NE(1) / mag * thrust_max_NE;
    }

    // Use tracking Anti-Windup for NE-direction: during saturation, the integrator is used to unsaturate the output
    // see Anti-Reset Windup for PID controllers, L.Rundqwist, 1990
    float arw_gain = 2.f / _param_mpc_xy_vel_p.get();

    Vector2f vel_err_lim;
    vel_err_lim(0) = vel_err(0) - (thrust_desired_NE(0) - _thr_sp(0)) * arw_gain;
    vel_err_lim(1) = vel_err(1) - (thrust_desired_NE(1) - _thr_sp(1)) * arw_gain;

    // Update integral
    _thr_int(0) += _param_mpc_xy_vel_i.get() * vel_err_lim(0) * dt;
    _thr_int(1) += _param_mpc_xy_vel_i.get() * vel_err_lim(1) * dt;
  }
}

代码解读

位置控制器外环位置控制函数解读:

void PositionControl::_positionController()
{
  // P-position controller

//根据位置误差和位置环P参数计算速度期望(NED系)

  const Vector3f vel_sp_position = (_pos_sp - _pos).emult(Vector3f(_param_mpc_xy_p.get(), _param_mpc_xy_p.get(),
           _param_mpc_z_p.get()));

//叠加位置误差产生的速度期望和速度期望前馈为总速度期望

  _vel_sp = vel_sp_position + _vel_sp;

  // Constrain horizontal velocity by prioritizing the velocity component along the
  // the desired position setpoint over the feed-forward term.

//根据设置的最大水平速度限制水平方向期望速度,优先保证满足位置误差引起的期望速度

  const Vector2f vel_sp_xy = ControlMath::constrainXY(Vector2f(vel_sp_position),
           Vector2f(_vel_sp - vel_sp_position), _param_mpc_xy_vel_max.get());
  _vel_sp(0) = vel_sp_xy(0);
  _vel_sp(1) = vel_sp_xy(1);
  // Constrain velocity in z-direction.

//根据D向速度最大最小值限制D向速度期望

  _vel_sp(2) = math::constrain(_vel_sp(2), -_constraints.speed_up, _constraints.speed_down);
}

位置控制器内环速度控制函数解读:

void PositionControl::_velocityController(const float &dt)
{
  // Generate desired thrust setpoint.
  // PID
  // u_des = P(vel_err) + D(vel_err_dot) + I(vel_integral)
  // Umin <= u_des <= Umax
  //
  // Anti-Windup:
  // u_des = _thr_sp; r = _vel_sp; y = _vel
  // u_des >= Umax and r - y >= 0 => Saturation = true
  // u_des >= Umax and r - y <= 0 => Saturation = false
  // u_des <= Umin and r - y <= 0 => Saturation = true
  // u_des <= Umin and r - y >= 0 => Saturation = false
  //
  //   Notes:
  // - PID implementation is in NED-frame
  // - control output in D-direction has priority over NE-direction
  // - the equilibrium point for the PID is at hover-thrust
  // - the maximum tilt cannot exceed 90 degrees. This means that it is
  //    not possible to have a desired thrust direction pointing in the positive
  //    D-direction (= downward)
  // - the desired thrust in D-direction is limited by the thrust limits
  // - the desired thrust in NE-direction is limited by the thrust excess after
  //    consideration of the desired thrust in D-direction. In addition, the thrust in
  //    NE-direction is also limited by the maximum tilt.

//计算速度误差(NED系)

  const Vector3f vel_err = _vel_sp - _vel;

  // Consider thrust in D-direction.

//根据速度误差计算D向的升力大小(也就是控制器的输出,控制输入,这里我们就统一以实际物理意义升力称呼):thr_sp_d=P+I+D+thr_hover,注意方向D是向下的,所以加中立油门时会是负的

  float thrust_desired_D = _param_mpc_z_vel_p.get() * vel_err(2) +  _param_mpc_z_vel_d.get() * _vel_dot(2) + _thr_int(
           2) - _param_mpc_thr_hover.get();

//因为D向是向下的,所以将上下限加上负号。

  // The Thrust limits are negated and swapped due to NED-frame.
  float uMax = -_param_mpc_thr_min.get();
  float uMin = -_param_mpc_thr_max.get();
  
  // make sure there's always enough thrust vector length to infer the attitude
  uMax = math::min(uMax, -10e-4f);

  // Apply Anti-Windup in D-direction.

//积分抗饱和,如果算出D向期望升力到达上下限,且误差方向同向,则停止积分。不然则正常积分并对积分上下限进行限制。

  bool stop_integral_D = (thrust_desired_D >= uMax && vel_err(2) >= 0.0f) ||
             (thrust_desired_D <= uMin && vel_err(2) <= 0.0f);

  if (!stop_integral_D) {
    _thr_int(2) += vel_err(2) * _param_mpc_z_vel_i.get() * dt;

    // limit thrust integral

//限制D向升力积分

    _thr_int(2) = math::min(fabsf(_thr_int(2)), _param_mpc_thr_max.get()) * math::sign(_thr_int(2));
  }

  // Saturate thrust setpoint in D-direction.

//限制D向升力期望值

  _thr_sp(2) = math::constrain(thrust_desired_D, uMin, uMax);

//当NE方向的期望已经被赋值时,用最大倾斜角度限制倾斜方向即可。这个是由飞控上层规划的,这里不需要考虑,一般也不会跑这段代码。

  if (PX4_ISFINITE(_thr_sp(0)) && PX4_ISFINITE(_thr_sp(1))) {
    // Thrust set-point in NE-direction is already provided. Only
    // scaling by the maximum tilt is required.
    float thr_xy_max = fabsf(_thr_sp(2)) * tanf(_constraints.tilt);
    _thr_sp(0) *= thr_xy_max;
    _thr_sp(1) *= thr_xy_max;

//正常情况下根据速度误差计算升力在NE平面的期望的过程

  } else {
    // PID-velocity controller for NE-direction.

//NE平面内的速度误差PID计算,得到NE平面内的升力期望

Vector2f thrust_desired_NE;
thrust_desired_NE(0) = _param_mpc_xy_vel_p.get() * vel_err(0) + _param_mpc_xy_vel_d.get() * _vel_dot(0) + _thr_int(0);
thrust_desired_NE(1) = _param_mpc_xy_vel_p.get() * vel_err(1) + _param_mpc_xy_vel_d.get() * _vel_dot(1) + _thr_int(1);

//根据允许的最大倾斜角度和当前D向期望升力以及最大允许油门计算NE平面允许的最大升力,这个其实很好理解,整个飞机产生的升力可以分解为NED系的D向以及NE平面内的分量,它们分配到的值是跟飞行器的倾斜角度有直接关系的。同时两者平方的和也与飞行器的油门平方是相等的,这里都是无量纲归一化后的关系。

// Get maximum allowed thrust in NE based on tilt and excess thrust.
float thrust_max_NE_tilt = fabsf(_thr_sp(2)) * tanf(_constraints.tilt);
float thrust_max_NE = sqrtf(_param_mpc_thr_max.get() * _param_mpc_thr_max.get() - _thr_sp(2) * _thr_sp(2));
thrust_max_NE = math::min(thrust_max_NE_tilt, thrust_max_NE);

// Saturate thrust in NE-direction.
_thr_sp(0) = thrust_desired_NE(0);
_thr_sp(1) = thrust_desired_NE(1);

//当升力在NE平面的期望超过上面计算的允许最大值时进行限制

if (thrust_desired_NE * thrust_desired_NE > thrust_max_NE * thrust_max_NE) {
  float mag = thrust_desired_NE.length();
  _thr_sp(0) = thrust_desired_NE(0) / mag * thrust_max_NE;
  _thr_sp(1) = thrust_desired_NE(1) / mag * thrust_max_NE;
}

//积分抗饱和处理,当控制律输出没到极限时,_thr_sp和thrust_desired_NE是相等的,所以正常积分,当输出达到极限后,在积分的同时就会向反方向减去一个超限的值,超得越多减得越多,这可以起到抗饱和的作用,避免超限后积分还在持续增大。

    // Use tracking Anti-Windup for NE-direction: during saturation, the integrator is used to unsaturate the output
    // see Anti-Reset Windup for PID controllers, L.Rundqwist, 1990
    float arw_gain = 2.f / _param_mpc_xy_vel_p.get();

    Vector2f vel_err_lim;
    vel_err_lim(0) = vel_err(0) - (thrust_desired_NE(0) - _thr_sp(0)) * arw_gain;
    vel_err_lim(1) = vel_err(1) - (thrust_desired_NE(1) - _thr_sp(1)) * arw_gain;

    // Update integral
    _thr_int(0) += _param_mpc_xy_vel_i.get() * vel_err_lim(0) * dt;
    _thr_int(1) += _param_mpc_xy_vel_i.get() * vel_err_lim(1) * dt;
  }
}

总结

本篇内容对PX4中实现位置控制器的代码进行了详细解读,代码进行了逐行分析,关于算法公式的推导,大家可以参考之前的文章:无人机控制器设计(二):位置控制器设计,现在大家应该对PX4中多旋翼飞行器的整个控制器设计与实现有了清晰的认识,除了外环控制器和内环姿态控制器的实现外,还有一个外环控制器输出到内环指令生成的函数我们下一次内容再进行阐述。

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

位置控制器PX4代码解析(文中有福利!!!) 的相关文章

  • ardupilot & px4 书写自己的app & drivers (二)

    新建任务列表任务 打印时间 任务列表 const AP Scheduler span class hljs tag Task span Copter span class hljs tag scheduler tasks span span
  • PX4 Offboard Control with MAVROS--Takeoff(一键起飞)

    警告 xff1a 请先在仿真环境下进行测试 xff0c 能达到预期效果后在进行实际飞行测试 xff0c 以免发生意外 本篇文章只是用作学习交流 xff0c 实际飞行时如出现意外情况作者不予以负责 所需材料 1 PIXhawk或者Pixrac
  • 【2020-8-9】APM,PX4,GAZEBO,MAVLINK,MAVROS,ROS之间的关系以及科研设备选型

    0 概述 无人机自主飞行平台可以分为四个部分 xff1a 动力平台 xff0c 飞行控制器 xff0c 机载电脑和模拟平台 动力平台 xff1a 负责执行飞行任务 xff0c 包括螺旋桨 电机 机架等 xff0c 用于科研的一般都是F380
  • 【8-12】树莓派部署t265+px4飞控实现无人机视觉定位

    在之前的文章中 xff0c 我们已经成功在树莓派 xff08 ubuntu mate 18 04 xff09 上部署了T265的追踪摄像头 本文将利用MAVROS协议 xff0c 将T265测量的位姿信息发送给px4固件 xff0c 实现室
  • PX4+Offboard模式+代码控制无人机起飞(Gazebo)

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

    本搭建过程基于http dev px4 io starting building html xff0c 希望大家互相交流学习 原文 xff1a Building PX4 Software xff08 构建PX4软件 xff09 PX4 ca
  • px4 avoidance笔记

    最近在用px4官方的avoidance代码跑硬件避障 xff0c 官方介绍了只要生成符合sensor msgs PointCloud2点云信息就能使用 xff0c 因此为了应用长基线双目 xff0c 没有使用realsense的相机 xff
  • 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模块设计之十八:Logger模块

    PX4模块设计之十八 xff1a Logger模块 1 Logger模块简介2 模块入口函数2 1 主入口logger main2 2 自定义子命令Logger custom command2 3 日志主题uORB注册 3 重要实现函数3
  • PX4模块设计之二十四:内部ADC模块

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

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

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

    PX4模块设计之四十三 xff1a icm20689模块 1 icm20689模块简介2 模块入口函数2 1 主入口icm20689 main2 2 自定义子命令custom command2 3 模块状态print status 重载 3
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • Px4源码框架结构图

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

    本文基于PX4飞控1 5 5版本 xff0c 分析导航模块中自护返航模式的控制逻辑和算法 自主返航模式和导航中的其他模式一样 xff0c 在Navigator main函数中一旦触发case vehicle status s NAVIGAT
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客

随机推荐

  • subprocess执行命令,超时判断,数据量大被截断问题,进程中断。

    Python使用subprocess在本地 或者 其他远端机器上执行命令 防止命令执行时间过长导致一直无法退出的问题 防止命令输出内容过长 xff0c 实际拿到的数据被截断 xff0c 不全的问题 新增 进程中断 xff0c 键盘ctrl
  • 重启ubuntu报错——/dev/sda7:clean

    查看Ubuntu IP地址 打开终端中执行 xff1a ifconfig a命令即可 若无法进入终端界面 重启至这一界面时 xff1a 按e键 xff0c 进入如下界面 xff1a 找到红线部分 xff0c 在splash后面手动输入 no
  • 旋转目标检测:Exploring Complementary Strengths of Ivariant and Equivariant Representations for FSL(CVPR21)

    关键词 xff1a 小样本 xff0c 自监督 xff0c 变换不变性 xff0c 等变性 参考博客 xff1a https zhuanlan zhihu com p 354771341 论文原文下载 xff1a https arxiv o
  • 旋转目标检测:The KFIoU Loss for Rotated Object Detection(Under review in ICLR 2022)

    关键词 xff1a KFIoU 倾斜IoU SkewIoU 参考博客 xff1a https zhuanlan zhihu com p 447286823 论文原文下载 xff1a https openreview net pdf id 6
  • C++14中变量模版的使用

    C 43 43 14中的variable template 变量模版 用于定义一系列变量或静态数据成员 xff0c 语法如下 xff1a template lt parameter list gt variable declaration
  • 读书笔记——《一个人的朝圣》

    图书馆借出来的另一本宝藏 xff0c 一个人的朝圣 xff0c 带来一个人心境的平和 内容摘抄 xff1a 1 你每次都是这样 xff0c 一有人做一些你没做过的事 xff0c 你就忙不迭地说那是不可能做到的 2 他明白了 xff0c 在弥
  • python算法练习1

    题目一 xff1a 给一个乱序的整数数组 xff0c 请用冒泡排序的方式实现升序排列 函数的形参是一个数组 xff0c 函数的返回值为一个数组 输入 xff1a 5 4 3 2 1 输出 xff1a 1 2 3 4 5 span class
  • C语言——鸡兔同笼问题

    include lt stdio h gt int main int a b c d printf 34 head 34 scanf 34 d 34 amp a printf 34 feet 请输入偶数 34 scanf 34 d 34 a
  • Python 通过爬虫获取网页内容时去掉某一标签内容

    以这篇文章https finance sina com cn money smjj smdt 2020 08 12 doc iivhvpwy0527268 shtml为例 xff0c 在抓取文章内容时 xff0c 不抓取 今日直播 的模块内
  • cas单点登录(5.2)-使用cas-overlay-template搭建cas服务器

    在开始之前先介绍一下CAS 官网地址 xff1a https www apereo org Github地址 https github com apereo cas 介绍 CAS是Central Authentication Service
  • 海康ISAPI使用相关

    海康ISAPI使用相关 海康SDK对运行环境有要求 xff0c 只支持x86系统 xff0c ARM或者单片机等无法使用 可以使用海康提供的ISAPI接口协议对设备进行操控 1 接口验证使用Digest Auth 2 使用设备ip地址 43
  • 计算机网络习题(IP地址分类及CIDR划分方法)

    计算机网络习题 xff08 IP地址分类及CIDR划分方法 xff09 题目描述 xff1a 已知地址块中的一个地址是140 120 84 24 20 xff08 1 xff09 求这个地址块中的最小地址和最大地址 xff08 2 xff0
  • centos7 nvidia-smi命令很慢

    nvidia smi命令很慢 xff0c 长时间才有输出 sudo usr bin nvidia persistenced verbose 设置开机自启动 chmod 43 x etc init d rc local vim etc ini
  • PX4代码解析:振动分析

    本篇文章首发于公众号 xff1a 无人机系统技术 更多无人机技术相关文章请关注此公众号 一 前言 前面的文章主要都是一些理论知识为主 xff0c 很多读者朋友看了之后可能会有点枯燥 xff0c 里面很多公式看起来也比较晦涩 xff0c 今天
  • 如何学习飞控

    本篇文章首发于公众号 xff1a 无人机系统技术 更多无人机技术相关文章请关注此公众号 xff0c 有问题也可在公众号底部添加个人微信进行交流 无人机涉及哪些工作 自开公众号以来 xff0c 陆续有不少关注者提问怎么去学习无人机技术 xff
  • Python3中.pyd文件介绍

    pyd文件是用Python编写生成的动态链接库 xff0c 包含一个或多个Python modules xff0c 可以被其它Python代码调用 以下是 pyd的生成及调用测试 xff1a 通过conda创建虚拟环境Python Test
  • PX4姿态控制算法详解

    本篇文章首发于公众号 xff1a 无人机系统技术 更多无人机技术相关文章请关注此公众号 xff0c 有问题也可在公众号回复 加群 进入技术交流群进行交流 倾转分离 今天的内容我们来解析开源飞控软件PX4中关于多旋翼飞行器的姿态控制算法 首先
  • 我为什么不挣钱也要写公众号

    本篇文章首发于公众号 xff1a 无人机系统技术 更多无人机技术相关文章请关注此公众号 xff0c 有问题也可在公众号回复 加群 进入技术交流群进行交流 自开无人机系统技术这个公众号以来已经有半年之久了 xff0c 我是在今年一月份开的公众
  • 开源飞控PX4姿态控制代码解析

    本篇文章首发于公众号 xff1a 无人机系统技术 更多无人机技术相关文章请关注此公众号 xff0c 有问题也可在公众号回复 加群 进入技术交流群进行交流 本公众号将于9月11号联合电子工业出版社送出15本价值98元的 多旋翼飞行器设计与控制
  • 位置控制器PX4代码解析(文中有福利!!!)

    号外号外 xff01 xff01 xff01 本公众号将联合电子工业出版社于9月11号送出15本价值98元的全权老师著作 多旋翼飞行器设计与控制 xff0c 关注本公众号的朋友均可参加 xff0c 敬请期待 还没关注的朋友赶紧关注吧 xff