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に設定してしまうと
飛ばなくなってしまうので注意。