Автопилот Arduplane - открытое ПО

alexeykozin
Andrey3167:

да, пикирует, градусов на десять. Только я еще на 2,76 не летал. Может связано с алгоритмами работы апм. Типа скорость растет, обороты теже- значит пикирует. Но в подробности я не вдавался, не программист

мне кажется что это программная бага,
от изменения воздушной скорости особенно в сторону увеличения не должен он влиять на горизонт.
на изменение воздушной скорости самолета в реальных условиях может повлиять порыв ветра, при этом самолет может не испытать ускорений которые требуют коррекции акселя и соответственно горизонта
другое дело получение ускорения относительно наземной, жпс скорости - в этом случае имеет место быть ускорение и требуется коррекция акселя а вместе с ним и горизонта
но достучаться до разработчиков есть шанс только самому раскопав место в коде и указав ошибку

alexeykozin

покопал программный код -
вопрос: уровень отклоняется при воздействии на аирспид в полевых условиях?
по идее разный алгоритм коррекции при хорошем захвате спутников по жпс и при проблемах с жпс

вот этот кусок

AP_AHRS_DCM.cpp

AP_AHRS_DCM::drift_correction(float deltat)
{
Matrix3f temp_dcm = _dcm_matrix;
Vector3f velocity;
uint32_t last_correction_time;

// perform yaw drift correction if we have a new yaw reference
// vector
drift_correction_yaw();

// apply trim
temp_dcm.rotateXY(_trim);

// rotate accelerometer values into the earth frame
_accel_ef = temp_dcm * _ins.get_accel();

// integrate the accel vector in the earth frame between GPS readings
_ra_sum += _accel_ef * deltat;

// keep a sum of the deltat values, so we know how much time
// we have integrated over
_ra_deltat += deltat;

если нет жпс, или 3д фикса или спутников меньше чем минимум для коррекции (указывается в списке параметров)
if (!have_gps() ||
_gps->status() < GPS::GPS_OK_FIX_3D ||
_gps->num_sats < _gps_minsats) {
// no GPS, or not a good lock. From experience we need at
// least 6 satellites to get a really reliable velocity number
// from the GPS.
//
// As a fallback we use the fixed wing acceleration correction
// if we have an airspeed estimate (which we only have if
// _fly_forward is set), otherwise no correction
if (_ra_deltat < 0.2f) {
// not enough time has accumulated
return;
}
float airspeed;
if (_airspeed && _airspeed->use()) {
airspeed = _airspeed->get_airspeed();
} else {
airspeed = _last_airspeed;
}
// use airspeed to estimate our ground velocity in
// earth frame by subtracting the wind
velocity = _dcm_matrix.colx() * airspeed;

// add in wind estimate
velocity += _wind;

last_correction_time = hal.scheduler->millis();
_have_gps_lock = false;
} else {

if (_gps->last_fix_time == _ra_sum_start) {
// we don’t have a new GPS fix - nothing more to do
return;
}
velocity = Vector3f(_gps->velocity_north(), _gps->velocity_east(), _gps->velocity_down());
last_correction_time = _gps->last_fix_time;
if (_have_gps_lock == false) {
// if we didn’t have GPS lock in the last drift
// correction interval then set the velocities equal
_last_velocity = velocity;
}
_have_gps_lock = true;

// keep last airspeed estimate for dead-reckoning purposes
Vector3f airspeed = velocity - _wind;
airspeed.z = 0;
_last_airspeed = airspeed.length();
}

if (have_gps()) {
// use GPS for positioning with any fix, even a 2D fix
_last_lat = _gps->latitude;
_last_lng = _gps->longitude;
_position_offset_north = 0;
_position_offset_east = 0;

// once we have a single GPS lock, we can update using
// dead-reckoning from then on
_have_position = true;
} else {
// update dead-reckoning position estimate
_position_offset_north += velocity.x * _ra_deltat;
_position_offset_east += velocity.y * _ra_deltat;
}

// see if this is our first time through - in which case we
// just setup the start times and return
if (_ra_sum_start == 0) {
_ra_sum_start = last_correction_time;
_last_velocity = velocity;
return;
}

// equation 9: get the corrected acceleration vector in earth frame. Units
// are m/s/s
Vector3f GA_e;
GA_e = Vector3f(0, 0, -1.0f);

bool using_gps_corrections = false;
if (_flags.correct_centrifugal && (_have_gps_lock || _flags.fly_forward)) {
float v_scale = gps_gain.get()/(_ra_deltat*GRAVITY_MSS);
Vector3f vdelta = (velocity - _last_velocity) * v_scale;
GA_e += vdelta;
GA_e.normalize();
if (GA_e.is_inf()) {
// wait for some non-zero acceleration information
return;
}
using_gps_corrections = true;
}

// calculate the error term in earth frame.
_ra_sum /= (_ra_deltat * GRAVITY_MSS);

// get the delayed ra_sum to match the GPS lag
Vector3f GA_b;
if (using_gps_corrections) {
GA_b = ra_delayed(_ra_sum);
} else {
GA_b = _ra_sum;
}
GA_b.normalize();
if (GA_b.is_inf()) {
// wait for some non-zero acceleration information
return;
}

Vector3f error = GA_b % GA_e;

#define YAW_INDEPENDENT_DRIFT_CORRECTION 0
#if YAW_INDEPENDENT_DRIFT_CORRECTION
// step 2 calculate earth_error_Z
float earth_error_Z = error.z;

// equation 10
float tilt = pythagorous2(GA_e.x, GA_e.y);

// equation 11
float theta = atan2f(GA_b.y, GA_b.x);

// equation 12
Vector3f GA_e2 = Vector3f(cosf(theta)*tilt, sinf(theta)*tilt, GA_e.z);

// step 6
error = GA_b % GA_e2;
error.z = earth_error_Z;
#endif // YAW_INDEPENDENT_DRIFT_CORRECTION

// to reduce the impact of two competing yaw controllers, we
// reduce the impact of the gps/accelerometers on yaw when we are
// flat, but still allow for yaw correction using the
// accelerometers at high roll angles as long as we have a GPS
if (use_compass()) {
if (have_gps() && gps_gain == 1.0f) {
error.z *= sinf(fabsf(roll));
} else {
error.z = 0;
}
}

// if ins is unhealthy then stop attitude drift correction and
// hope the gyros are OK for a while. Just slowly reduce _omega_P
// to prevent previous bad accels from throwing us off
if (!_ins.healthy()) {
error.zero();
} else {
// convert the error term to body frame
error = _dcm_matrix.mul_transpose(error);
}

if (error.is_nan() || error.is_inf()) {
// don’t allow bad values
check_matrix();
return;
}

_error_rp_sum += error.length();
_error_rp_count++;

// base the P gain on the spin rate
float spin_rate = _omega.length();

// we now want to calculate _omega_P and _omega_I. The
// _omega_P value is what drags us quickly to the
// accelerometer reading.
_omega_P = error * _P_gain(spin_rate) * _kp;
if (_flags.fast_ground_gains) {
_omega_P *= 8;
}

if (_flags.fly_forward && _gps && _gps->status() >= GPS::GPS_OK_FIX_2D &&
_gps->ground_speed_cm < GPS_SPEED_MIN &&
_ins.get_accel().x >= 7 &&
pitch_sensor > -3000 && pitch_sensor < 3000) {
// assume we are in a launch acceleration, and reduce the
// rp gain by 50% to reduce the impact of GPS lag on
// takeoff attitude when using a catapult
_omega_P *= 0.5f;
}

// accumulate some integrator error
if (spin_rate < ToRad(SPIN_RATE_LIMIT)) {
_omega_I_sum += error * _ki * _ra_deltat;
_omega_I_sum_time += _ra_deltat;
}

if (_omega_I_sum_time >= 5) {
// limit the rate of change of omega_I to the hardware
// reported maximum gyro drift rate. This ensures that
// short term errors don’t cause a buildup of omega_I
// beyond the physical limits of the device
float change_limit = _gyro_drift_limit * _omega_I_sum_time;
_omega_I_sum.x = constrain_float(_omega_I_sum.x, -change_limit, change_limit);
_omega_I_sum.y = constrain_float(_omega_I_sum.y, -change_limit, change_limit);
_omega_I_sum.z = constrain_float(_omega_I_sum.z, -change_limit, change_limit);
_omega_I += _omega_I_sum;
_omega_I_sum.zero();
_omega_I_sum_time = 0;
}

// zero our accumulator ready for the next GPS step
_ra_sum.zero();
_ra_deltat = 0;
_ra_sum_start = last_correction_time;

// remember the velocity for next time
_last_velocity = velocity;

if (_have_gps_lock && _flags.fly_forward) {
// update wind estimate
estimate_wind(velocity);
}
}

X3_Shim
alexeykozin:

уровень отклоняется при воздействии на аирспид в полевых условиях?

Я проверял строго без GPS.

alexeykozin:

покопал программный код

Завтра гляну его внимательнее.

fargo

Помогите, не получается переключать экраны minim. Пульт ER9x. поставил на восьмой канал 100% source:full switch TRN . в миниме поставил канал 8 так же, без rotating. не меняет и все тут.
2. Как скачать логи полета? запускаю mp через комплект телеметрии 915 коннекчусь, если запускаю терминал он без перерыва что то пишет, не давая написать команду. что делать?

X3_Shim
fargo:

не получается переключать экраны minim. Пульт ER9x. поставил на восьмой канал 100% source:full switch TRN . в миниме поставил канал 8 так же, без rotating. не меняет и все тут.

А вы поставьте в OSD отображение каналов, и посмотрите, меняется ли 8-й. Я кажется лечил такое установкой на АПМ сквозного канала для канала управления OSD, типа passthrought, точнее сказать не могу, АПМ не дома. А может у вас Warning на экране светится какой нить ? В этом случае он всегда будет первый экран показывать.

fargo:
  1. Как скачать логи полета? запускаю mp через комплект телеметрии 915 коннекчусь, если запускаю терминал он без перерыва что то пишет, не давая написать команду. что делать?

А через USB пробовали ?

fargo

Через USB не получится -плата упакована в бикслер с помощью термоклея по углам крепления. доступа до порта ,увы , нет. ну что-нить придумаю.
По поводу предупреждения -спасибо, хорошая идея. он у меня показывает изначально low rssi и no gps fix (дома проверяю) -отключу сегодня принудительное переключение на основной экран и проверю.

X3_Shim

Господа, у меня пара простых и тупых вопросов про АПМ. Сегодня настраивал АПМ на SkyWalker 2013.
В режиме стабилизации бросаю ручки, он немного пикирует. Думаю гироскопы неправильно выставлены, на земле приподнял нос, перекалибровал гироскопы, вроде лучше стало, немного вверх забирает. Так и надо настраивать ? Чисто калибровкой гироскопов ?
Потом пошел настраивать “по бумажке”, увеличивал пиды до оссциляций. Ролл пид получился 5, не слишком много ? Или может это из-за того, что у меня довольно сильно зажаты элероны для комфортного управления в ручном режиме ? Поставить расходы по элеронам побольше и перекалибровать аппу в МП и заново подобрать ролл пид ?
Перешел в FBWA, поставил газ заведомо больше круизного, ручку элеронов до упора, он накренился на заданный угол (40%) и летает кругами. Так и должно быть ? Или он должен с помощью компенсаций РН и РВ пытаться лететь прямо в наклонном состоянии ?

Зато сегодня садился вообще красиво, в мануале вышел примерно на метровую высоту, мотор вырубил, включил FBWA и бросил ручки, сел он сам идеально ровно 😃

fargo:

По поводу предупреждения -спасибо, хорошая идея. он у меня показывает изначально low rssi и no gps fix (дома проверяю) -отключу сегодня принудительное переключение на основной экран и проверю.

Обязательно расскажите потом что получилось.

X3_Shim
fargo:

Через USB не получится -плата упакована в бикслер с помощью термоклея по углам крепления. доступа до порта ,увы , нет. ну что-нить придумаю.

Нашел таки. Видимо логи только через USB

When you are connected to APM via the USB cable, you can download these logs using the buttons in the Mission Planner’s Terminal tab

fargo

ну значит сделаю еще и мини-лючок для юсб =) бедный бикслер, он и так уже с 3-мя лючками.

X3_Shim
fargo:

бедный бикслер, он и так уже с 3-мя лючками.

вот по этому я сразу купил Скайвокера 2013 😃

Andrey3167
X3_Shim:

Так и надо настраивать ?

В общем, да. Надо просто самоль выставить в положение необходимое для горизонтального полета, удобно с помощью строительного уровня по крыльям, а относительно продольной оси- с небольшим углом атаки необходимым для ГП (плоскость стабилизатора - горизонтально). И нажать кнопочку в МП Level. Он запоминает положение ГП.

X3_Shim:

Поставить расходы по элеронам побольше и перекалибровать аппу

Выставьте расходы 100%, перекалибруйте, потом настраивайте ПИДы.
Сколько у вас батареек на скае? Поделитесь потом своими ПИДами? Скоро своего 2014-го буду настраивать, хотелось бы знать от чего отталкиваться. Я на старом скае доходил до 4 чтобы увидеть раскачку, остановился на 2 и чуть меньше.

X3_Shim:

он накренился на заданный угол (40%) и летает кругами. Так и должно быть ?

Да, так и должно быть.
Еще вопросик. Какая круизная скорость и какой круизный газ у вас?

X3_Shim
Andrey3167:

В общем, да. Надо просто самоль выставить в положение необходимое для горизонтального полета, удобно с помощью строительного уровня по крыльям, а относительно продольной оси- с небольшим углом атаки необходимым для ГП (плоскость стабилизатора - горизонтально). И нажать кнопочку в МП Level. Он запоминает положение ГП.

Понятно, сначала настроить угол атаки, что бы РВ стояла ровно, потом уже ставя РВ горизонтально обнулять гироскопы.

Andrey3167:

Выставьте расходы 100%, перекалибруйте, потом настраивайте ПИДы.
Сколько у вас батареек на скае? Поделитесь потом своими ПИДами? Скоро своего 2014-го буду настраивать, хотелось бы знать от чего отталкиваться. Я на старом скае доходил до 4 чтобы увидеть раскачку, остановился на 2 и чуть меньше.

Расходы на 100% в аппе еще ни о чем не говорят. Есть же еще и механическая настройка расходов. С моей текущей настройкой механических расходов, пришлось очень сильно зажимать их в аппе, дабы спокойно манипулировать стиками, без опасения сделать бочку или петлю. Попробую поставить 100%, настроить АПМ, потом вернуть в обратное состояние. И потом уже настроить заново пиды.
Батареек пока только одна на 3S 5500 и 3S 1300. Пиды помню только для roll = 5, настраивал не я (у нас один пилот, второй настраивает), по этому сейчас сказать не могу.

Alex-13

“Расходы на 100% в аппе еще ни о чем не говорят. Есть же еще и механическая настройка расходов”

Я на передатчике для комфортного управления устанавливаю экспоненту на 30-40 %

X3_Shim
Alex-13:

Я на передатчике для комфортного управления устанавливаю экспоненту на 30-40 %

Экспоненту само собой. Но если механически сделать 1:1, 100% в аппе, то и экспонента 70% не позволит спокойно летать на скайвокере.

Ahimgeon

Озадачен будущим запуском X-8, весь комплект фпв будет носимым, и катапульта это уже перевес, ввиду этого думаю о !безопасном! способе запуска с руки. Знаю о возможности ардуплейна под названием “auto take of”. Видел ролики, понравилось, ед.что газ управляется почти а ручную, т.е. стик газа на полную-> бросок и уже авторуление… Меня интересует реализация такого способа: пульт на земле, х8 одной рукой за пазы, другой за кок винта, сильный толчок с основным упором на мотор(видел такой способ запуска, рулил 2й человек, энергии толчка хватило чтоб запустит ЛК в далёёёкие дали, никакой просадки), апм определяет резкий толчок и через 10мс сам даёт фул тротл и авторуление, а я пока натягиваю очки и пульт…Фантастика?

Alex-13
X3_Shim:

Экспоненту само собой. Но если механически сделать 1:1, 100% в аппе, то и экспонента 70% не позволит спокойно летать на скайвокере.

Настойку надо начинать с режима Dual Rate
Положение "1 " Выводятся махсимально допустимые значения для данного серво, кабанчика, так чтобы макасимальный расход серво не выламывал подвесы
Положение “2” Отлаживаются расходы необходимые для нормального управления ( или рекомендуемые для данной модели)
После этого вводится величина экспоненты 30-40% Больше 40% процентов используется очень редко
Величина экспоненты с “-” или “+” зависит от используемой аппаратуры

X3_Shim
Alex-13:

Положение "1 " Выводятся махсимально допустимые значения для данного серво, кабанчика, так чтобы макасимальный расход серво не выламывал подвесы
Положение “2” Отлаживаются расходы необходимые для нормального управления ( или рекомендуемые для данной модели)
После этого вводится величина экспоненты 30-40% Больше 40% процентов используется очень редко
Величина экспоненты с “-” или “+” зависит от используемой аппаратуры

Еще раз. Если поставить максимально возможные расходы, то летать невозможно, при любой экспоненте. По этому стоят одинарные расходы комфортными, двойные чуть выше комфортных. Вопрос в том, какие давать расходы автопилоту, максимальные и подбирать маленькие пиды или нормальные для человека, но тогда пиды больше будут.

Alex-13

Я настраиваю модель в полете без всякого автопилота. Когда все меня устраивает, включаю АП и значениями PID по элеронам и рулю высоты добиваюсь нормальной стабилизации полета
У меня на модели PID по элеронам 9 стаб 6 Но это значения для данной модели , Например значение PID по стабилизатору зависит от расположения Центра тяжести
Если передняя центровка, значения PID по стабилизатору будут больше, ну и так далее
У меня к вам просьба, дайте полный полетный вес, я посчитаю удельную нагрузку на крыло, а потом уже можно будет говорить о значениях PID