px4ctrl代码解读-calculateControl()

2023-05-16

/* 
  compute u.thrust and u.q, controller gains and other parameters are in param_ 
*/
quadrotor_msgs::Px4ctrlDebug
LinearControl::calculateControl(const Desired_State_t &des,
    const Odom_Data_t &odom,
    const Imu_Data_t &imu, 
    Controller_Output_t &u)
{
  /* WRITE YOUR CODE HERE */
      //compute disired acceleration
      Eigen::Vector3d des_acc(0.0, 0.0, 0.0);
      Eigen::Vector3d Kp,Kv;
      //初始化向量
      Kp << param_.gain.Kp0, param_.gain.Kp1, param_.gain.Kp2;
      //将参数中的增益赋值给向量
      Kv << param_.gain.Kv0, param_.gain.Kv1, param_.gain.Kv2;
      //将参数中的增益赋值给向量
      des_acc = des.a + Kv.asDiagonal() * (des.v - odom.v) + Kp.asDiagonal() * (des.p - odom.p);
      //des.a应该是初值0,Kv.asDiagonal()构建速度增益对角矩阵参与计算
      //des.v在指点是为设定值,定点时为0,也就是所kv的系数决定了命令飞行输出在总输出中所站的比率
      //Kp.asDiagonal()构建位置增益对角矩阵参与计算,des.p在定点模式下被设置与视觉里程计位置变化做差
      //kp的系数决定了定点输出在总输出中所占的比率
      des_acc += Eigen::Vector3d(0,0,param_.gra);
      //将计算输出加速度叠加重力加速度输出
      u.thrust = computeDesiredCollectiveThrustSignal(des_acc);
      //将z轴加速度转换为油门输出
      double roll,pitch,yaw,yaw_imu;
      double yaw_odom = fromQuaternion2yaw(odom.q);
      //将视觉里程计姿态变换四元数转换为角度向量,并返回z轴变换角度
      double sin = std::sin(yaw_odom);
      double cos = std::cos(yaw_odom);
      roll = (des_acc(0) * sin - des_acc(1) * cos )/ param_.gra;
      pitch = (des_acc(0) * cos + des_acc(1) * sin )/ param_.gra;
      //得到当前角度下xy轴加速度输出(为啥除g?)
      // yaw = fromQuaternion2yaw(des.q);
      yaw_imu = fromQuaternion2yaw(imu.q);
      // Eigen::Quaterniond q = Eigen::AngleAxisd(yaw,Eigen::Vector3d::UnitZ())
      //   * Eigen::AngleAxisd(roll,Eigen::Vector3d::UnitX())
      //   * Eigen::AngleAxisd(pitch,Eigen::Vector3d::UnitY());
      Eigen::Quaterniond q = Eigen::AngleAxisd(des.yaw,Eigen::Vector3d::UnitZ())
        * Eigen::AngleAxisd(pitch,Eigen::Vector3d::UnitY())
        * Eigen::AngleAxisd(roll,Eigen::Vector3d::UnitX());
      u.q = imu.q * odom.q.inverse() * q;
      //没搞明白,再查一下

  /* WRITE YOUR CODE HERE */

  //used for debug
  // debug_msg_.des_p_x = des.p(0);
  // debug_msg_.des_p_y = des.p(1);
  // debug_msg_.des_p_z = des.p(2);
  
  debug_msg_.des_v_x = des.v(0);
  debug_msg_.des_v_y = des.v(1);
  debug_msg_.des_v_z = des.v(2);
  
  debug_msg_.des_a_x = des_acc(0);
  debug_msg_.des_a_y = des_acc(1);
  debug_msg_.des_a_z = des_acc(2);
  
  debug_msg_.des_q_x = u.q.x();
  debug_msg_.des_q_y = u.q.y();
  debug_msg_.des_q_z = u.q.z();
  debug_msg_.des_q_w = u.q.w();
  
  debug_msg_.des_thr = u.thrust;
  
  // Used for thrust-accel mapping estimation
  timed_thrust_.push(std::pair<ros::Time, double>(ros::Time::now(), u.thrust));
  while (timed_thrust_.size() > 100)
  {
    timed_thrust_.pop();
  }
  return debug_msg_;
}

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

px4ctrl代码解读-calculateControl() 的相关文章

随机推荐

  • python发送email邮件

    1 使用QQ邮箱做服务转发邮 2 使用 coding utf 8 from import res import smtplib from email mime text import MIMEText from email utils im
  • MySQL实现连表查询

    一 创建相应的表 1 xff09 创建一张学生信息的表 xff0c 包含 id xff08 自增 xff09 xff0c 学号 xff0c 姓名 xff0c 性别 xff0c 身高 xff0c 体重 xff0c 备注 CREATE TABL
  • 解决Eclipses下tomcat部署端口号占用和server.xml修改之后被重置无效的问题,即使修改了也会被改回来的问题

    首先介绍一下tomcat部署的常用三个方式 xff1a 直接部署到host虚拟主机管理的目录 xff0c 通过eclipse直接发布到这个目录 需要每次启动tomcat 直接在server xml下配置Context 路径 xff0c 直接
  • Linux下安装redis及遇到的问题解决

    1 Linux安装redis wget http download redis io releases redis 5 0 3 tar gz tar xzf redis 5 0 3 tar gz cd redis 5 0 3 make 启动
  • 在spring boot中使用configuration注解无法注入bean

    1 在spring boot和spring中bean注入的方式 xff0c 基于Java类配置的 xff0c 即通过configuration注解注入 xff0c 其中遇到发现在springboot中 xff0c 无法自动注入 xff0c
  • 电路学习笔记( 一)——上拉电阻(编码器电路)

    来自于编码器接口电路 Encoder1和Encoder2经过510电阻和一个上拉10k电阻后输入到最小系统中 问题在于 xff0c 为什么要接上拉电阻 之前的知识仅理解到了拉高电压一项 xff0c 但原因不明 在单片机引脚作为输入端时 xf
  • 64位系统下运行32位程序

    现象 xff1a bash make ext4fs No such file or directory 解决 xff1a 一般出现该错误是由于应用程序是 32 位导致的 xff0c 可以使用 file 命令来查看 xff1a cpp vie
  • 安装mybatisx插件失败Fail to load plugin descriptor from file MyBatis-4.02.jar

    我想大概会有人出错的 hhhh Fail to load plugin descriptor from file MyBatis 4 02 jar 只需要把jar包改为zip格式即可 这种方式是先下载好jar包 其它博客有怎么下载
  • 4、DockerFile文件的使用

    文章目录 一 DockerFile 文件1 1 DockerFile构建过程1 1 1 基础知识1 1 2 docker执行DockerFile的大致流程 1 2 Dockerfile常见的关键字1 3 自定义镜像mycentosjava8
  • git 的使用笔记 编辑工具vscode

    vscode与git对应命令 Changes 里的文件 43 会放到 Staged Changes 61 61 git add 全部修改的文件 Staged Changes 里的文件 34 34 会撤回到Changes里 61 61 git
  • 使用Python,Opencv检测AprilTag

    这篇博客将介绍AprilTags 这是一组基准标记 通常用于机器人技术 校准和3D计算机视觉项目 通常在执行实时检测时使用AprilTags 以及密切相关的ArUco标记 AprilTags是一种基准标记 更简单地说是 标记 基准点是在捕获
  • DIY 属于自己的OPENMV4, 附openmv4部分的原理图。

    很多小白想要用AD来DIYopenmv4 xff0c 拥有属于自己DIY的openmv4 但是却没有找到好的参考资料 xff0c 现总结如下所示 现在官方还在众筹 xff0c 官方的开源的资料 xff0c 也是在三月份GitHub才向大家公
  • 30道最新Linux内核大厂面试题(含答案)

    1 Linux 中主要有哪几种内核锁 xff1f Linux 的同步机制从 2 0 到 2 6 以来不断发展完善 从最初的原子操作 xff0c 到后来 的信号量 xff0c 从大内核锁到今天的自旋锁 这些同步机制的发展伴随 Linux 从单
  • 最新腾讯等大厂c/c++后端 linux开发常见面试题汇总

    计算机操作系统 xff08 Linux xff09 1 命令 xff1a netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 2 cpu 内存 硬盘 等等与系统性能调试相关的命
  • C++高性能大规模服务器开发实践

    本文摘录自腾讯高级工程师在 全球C 43 43 及系统软件技术大会 上的专题演讲 01Lego简介 首先介绍一下 CDN 非常早期的时候有一个大牛创建了一个公司叫阿卡曼 xff0c 他把服务器部署到全球各地 xff0c 然后把源站的内容缓存
  • 梯度、散度、旋度、拉普拉斯算子

    梯度 运算的对象是纯量 xff08 即标量 xff0c 只有大小 xff0c 没有方向 xff09 xff0c 运算出来的结果是向量 xff08 矢量 xff0c 既有大小 xff0c 又有方向 xff09 定义 xff1a 函数在某点的梯
  • 【VINS-Fusion-gpu在NX的部署】

    VINS Fusion gpu在NX的部署 1 移除nx中已经默认的opencv sudo apt span class token operator span get purge libopencv span class token op
  • 电机扭矩计算

    转自 xff1a http blog sina com cn s blog 521a53b001011xdl html 扭矩的定义 xff1a 垂直方向的力 到旋转中心的距离 1 电动机有一个共同的公式 xff1a P 61 M N 955
  • px4ctrl代码-fsm.process()

    主进程 初始状态为MANUAL CTRL Finite State Machine 控制系统启动 v gt 手动控制 lt gt 自动起飞
  • px4ctrl代码解读-calculateControl()

    compute u thrust and u q controller gains and other parameters are in param quadrotor msgs Px4ctrlDebug LinearControl ca