四旋翼部分代码解析(一)

2020.01.14向峻宏

飞机模型整体结构

a.JPG

这是四旋翼无人机的核心三大块,无人机、四旋翼和刚体部分,简单来说,一个飞行器就是一个刚体仿真加上环境仿真再加上飞控。

飞机模型刚体部分代码解析

include "rigidBody.h"
include "utils.h"
include <boost/bind.hpp>
include "odeint-v2/boost/numeric/odeint.hpp"
include <Eigen/Geometry>

namespace odeint = boost::numeric::odeint;


RigidBody::RigidBody()
{
  ticks = 0;/*计步器*/

  /* following data is obtained from shaojie simulator */
  mass = 0.74;/*质量*/
  double Ixx = 2.64e-3, Iyy = 2.64e-3, Izz = 4.96e-3;
  inertia = Eigen::Vector3d(Ixx, Iyy, Izz).asDiagonal();/*定义三轴的惯性矩*/

  position = Eigen::Vector3d::Zero();
  velocity = Eigen::Vector3d::Zero();
  //acceleration = Eigen::Vector3d::Zero();
  force = Eigen::Vector3d::Zero();

  attitude = Eigen::Quaterniond(Eigen::Matrix3d::Identity());
  angularVelocity = Eigen::Vector3d::Zero();
  torque = Eigen::Vector3d::Zero();/*定义了位置,速度,加速度,力,姿态矩阵,角速度,转矩*/

  updateInternalState();/*更新内部状态*/
}

void RigidBody::updateInternalState(void)
{
  internalState[0]  = position(0); 
  internalState[1]  = position(1); 
  internalState[2]  = position(2); 

  internalState[3]  = velocity(0); 
  internalState[4]  = velocity(1); 
  internalState[5]  = velocity(2); 

  //internalState[6]  = acceleration(0); 
  //internalState[7]  = acceleration(1); 
  //internalState[8]  = acceleration(2); 

  internalState[6]  = attitude.x(); 
  internalState[7]  = attitude.y(); 
  internalState[8]  = attitude.z(); 
  internalState[9]  = attitude.w(); 

  internalState[10] = angularVelocity(0); 
  internalState[11] = angularVelocity(1); 
  internalState[12] = angularVelocity(2); 
}
/*内部状态函数的数组声明*/
void RigidBody::operator()(const RigidBody::InternalState &x, RigidBody::InternalState &dxdt, const double /* t */)/*对当前状态量进行操作的函数*/
{
    Eigen::Vector3d x_dot, v_dot, omega_dot;
    Eigen::Vector4d q_dot;
    Eigen::Vector4d q(attitude.x(), attitude.y(), attitude.z(), attitude.w());

    Eigen::Vector3d omega = angularVelocity;
    Eigen::Matrix4d omegaMat = Omega(omega);

    x_dot = velocity;
    v_dot = force/mass;
    q_dot = 0.5*omegaMat*q;
    omega_dot = inertia.inverse() */*x_dot对应速度,v_dot对应加速度,q_dot对应四个姿态,omega_dot对应角速度*/
      (torque - omega.cross(inertia*omega));

    dxdt[0]  = x_dot(0); 
    dxdt[1]  = x_dot(1); 
    dxdt[2]  = x_dot(2); 

    dxdt[3]  = v_dot(0); 
    dxdt[4]  = v_dot(1); 
    dxdt[5]  = v_dot(2); 

    dxdt[6]  = q_dot(0); 
    dxdt[7]  = q_dot(1); 
    dxdt[8]  = q_dot(2); 
    dxdt[9]  = q_dot(3); 

    dxdt[10] = omega_dot(0); 
    dxdt[11] = omega_dot(1); 
    dxdt[12] = omega_dot(2); /*分别赋予当前状态值*/
}

void RigidBody::sim_step(double dt)/*模拟进行的一步*/
{
    odeint::integrate(boost::ref(*this), internalState, 0.0, dt, dt);/*这一步声明我没看懂,感觉是更新内部状态的*/

    position(0) =  internalState[0]; 
    position(1) =  internalState[1]; 
    position(2) =  internalState[2]; 

    velocity(0) =  internalState[3]; 
    velocity(1) =  internalState[4]; 
    velocity(2) =  internalState[5]; 

    attitude.x() =  internalState[6]; 
    attitude.y() =  internalState[7]; 
    attitude.z() =  internalState[8]; 
    attitude.w() =  internalState[9]; 
    
    attitude.normalize();

    angularVelocity(0) =  internalState[10]; 
    angularVelocity(1) =  internalState[11]; 
    angularVelocity(2) =  internalState[12]; /*将各种状态参量全部更新一遍*/
    
    updateInternalState();
    
    ticks += 1;/*同时计步器加1*/
}
void RigidBody::set_force(Eigen::Vector3d _force)
{
    force = _force;/*更新受力*/
}

void RigidBody::set_torque(Eigen::Vector3d _torque)
{
    torque = _torque;/*更新转矩*/
}

Eigen::Quaterniond RigidBody::get_attitude()
{
    Eigen::Quaterniond q(attitude.w(), attitude.x(), attitude.y(), attitude.z());
    return q;/*获得四个参量的q表*/
}

void RigidBody::set_attitude(Eigen::Quaterniond _attitude)
{
    attitude.w() = _attitude.w(); 
    attitude.x() = _attitude.x(); 
    attitude.y() = _attitude.y(); 
    attitude.z() = _attitude.z(); /*用获得的q表值来更新四个姿态参量*/
}

Eigen::Vector3d RigidBody::get_position()
{
    return Eigen::Vector3d(position(0), position(1), position(2));
}

void RigidBody::external_set_position(Eigen::Vector3d setting_vec)
{
    position(0) = setting_vec(0);
    position(1) = setting_vec(1);
    position(2) = setting_vec(2);
    updateInternalState();
}/*这同样是获得位置信息后再更新位置信息*/

Eigen::Vector3d RigidBody::get_velocity()
{
    return Eigen::Vector3d(velocity(0), velocity(1), velocity(2));
}

double RigidBody::get_mass()
{
    return mass;
}

Eigen::Vector3d RigidBody::get_angularVelocity() const
{
    return angularVelocity;
}

Eigen::Matrix3d RigidBody::get_inertia() const
{
    //TODO: get functions, should use constant?
    return inertia;
}/*更新飞机模型的速度,质量,角速度和惯性矩*/

这是rigidbody部分的代码解析,大家可以看看了解原理,希望有错的地方大家可以指出,后2天会将drone和quadrotor的代码解析发出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351