組み込み備忘録

元組み込みエンジニアで現在某大学のM1在籍中です.研究の備忘録的なブログにしようと思います

SITLの機体の総重量を変化させて、挙動を確認する。

SITLの機体の総重量を変化させて、挙動を確認する。

概要

Ardupilotでは実機を飛ばさなくても、シミュレーター(以下SITL)上で機体の挙動を確認することができる。
さて、実際のクワッドコプターにおいては機体にカメラやセンサー等、様々な荷重がかかることが考えられる。
そこで、今回は擬似的に荷物の重量を加算して、挙動がどのように変化するのか、確認してみた。

推力スケーリング

機体に加わる推力は機体の総重量(機体と肥料の重さ)を基にスケーリングしている。
つまり、単純に機体、もしくは肥料の重さを追加しただけでは挙動は変化しない。

SIM_Multicopter.cpp

float MultiCopter::gross_mass() const
{
    return Aircraft::gross_mass() + sprayer.payload_mass() + gripper.payload_mass();
}

SIM_Frame.cpp

void Frame::init(float _mass, float hover_throttle, float _terminal_velocity, float _terminal_rotation_rate)
{
    /*
       scaling from total motor power to Newtons. Allows the copter
       to hover against gravity when each motor is at hover_throttle
    */
    thrust_scale = (_mass * GRAVITY_MSS) / (num_motors * hover_throttle);

    terminal_velocity = _terminal_velocity;
    terminal_rotation_rate = _terminal_rotation_rate;
}

※_massに渡される数値はgross_mass()の返り値が渡される。

修正内容

このままではいくら重さを変えたところで、推力はスケーリングされてしまうため、
挙動に変化はない。
そこで、以下の様にMultiCopterクラスのコンストラクタのframe->initが実行される際に渡す_massを
総重量(gross_mass())ではなく、機体のみの重量(mass)を渡せば良い。

SIM_Multicopter.cpp

MultiCopter::MultiCopter(const char *home_str, const char *frame_str) :
            Aircraft(home_str, frame_str),
            frame(nullptr)
    {
    mass = 3.0f;

    gripper.set_aircraft(this);
    frame = Frame::find_frame(frame_str);
    if (frame == nullptr) {
        printf("Frame '%s' not found", frame_str);
        exit(1);
    }
    // initial mass is passed through to Frame for it to calculate a
    // hover thrust requirement.
    if (strstr(frame_str, "-fast")) {
//        frame->init(gross_mass(), 0.5, 85, 4*radians(360));
        frame->init(mass, 0.5, 85, 4*radians(360));   //機体の重量のみ渡す
    } else {
//        frame->init(gross_mass(), 0.51, 15, 4*radians(360));
        frame->init(mass, 0.51, 15, 4*radians(360)); //機体の重量のみ渡す
    }
    frame_height = 0.1;
    ground_behavior = GROUND_BEHAVIOR_NO_MOVEMENT;
}

加算したい重量は以下の様にcapacityに任意の値を入れる。。

SIM_Sprayer.h

double capacity = 70.0; // litres

当然だが機体の重量に対して極端に大きな値をcapacityに設定してしまうと
飛ばなくなってしまうので注意。