Автопилот Arduplane - открытое ПО
У меня есть “чистый” апм с 2,76 сейчас попробую
У меня есть “чистый” апм с 2,76 сейчас попробую
отлично 😃 Спасибо.
сейчас попробую
да, пикирует, градусов на десять. Только я еще на 2,76 не летал. Может связано с алгоритмами работы апм. Типа скорость растет, обороты теже- значит пикирует. Но в подробности я не вдавался, не программист
не, ни пикирует
очень интересно. Галочку “использовать AS” поставили ?
Галочку “использовать AS” поставили ?
Да галочку не поставил, потом отредактировал
Да галочку не поставил, потом отредактировал
Эээ В смысле ? Что отредактировали ? Я ставлю галку что у меня есть датчик, потом ставлю галку использовать датчик (ну в полном списке параметров проверяю, что стоит A1 порт). В общем понял. Буду смотреть где я что мог накосячить. А то если я отключаю датчик на работающем автопилоте, то горизонт просто сходит с ума.
Да, поделитесь как настраивали Ratio плз, и на что влияет установка воздушной скорости, там же все равно надо ставить круизный газ, максимальный газ и минимальный. Я думал что с AS автопилот будет газ выбирать в зависимости от воздушной скорости
Сейчас вроде есть автонастройка AS. До 2,74- становил в круг с постоянным креном градусов 20 (предварительно ограничив его в настройках 20 град в FBW-A) с постоянным газом и в этом режиме делал 2-3 круга потом смотрел логи. По графикам наземной и воздушной скорости смотришь , чтоб средние AS и GS были одинаковыми, высчитываешь поправку в коэффициент. Еще раз проверяешь на “кругах”. Сейчас посмотрел в руководстве - все в автомате plane.ardupilot.com/wiki/airspeed-3/
Что отредактировали
Свое сообщение выше. Да-да теперь все как у вас, забыл галку поставить
Чет я запутался 😃 Но вроде понял. У вас тоже пикирует. Значит с железом у меня все норм таки. Усе, спасибо, буду думать, как и зачем это.
если я отключаю датчик на работающем автопилоте, то горизонт просто сходит с ума.
наверное этого не стоит делать, не любит электроника отключений-подключений на горячую, может что-нибудь крякнуть
У вас тоже пикирует
да
наверное этого не стоит делать, не любит электроника отключений-подключений на горячую, может что-нибудь крякнуть
Не, не в этом случае. Это простые аналоговые пины, которые меряют напряжение.
Не, не в этом случае.
может быть, но я боюсь
А тут пикирование прямо зависит от скорости потока.
Вот посмотрите, здесь вроде ответ на ваш вопрос
rcopen.com/forum/f90/topic200764/4398
да, пикирует, градусов на десять. Только я еще на 2,76 не летал. Может связано с алгоритмами работы апм. Типа скорость растет, обороты теже- значит пикирует. Но в подробности я не вдавался, не программист
мне кажется что это программная бага,
от изменения воздушной скорости особенно в сторону увеличения не должен он влиять на горизонт.
на изменение воздушной скорости самолета в реальных условиях может повлиять порыв ветра, при этом самолет может не испытать ускорений которые требуют коррекции акселя и соответственно горизонта
другое дело получение ускорения относительно наземной, жпс скорости - в этом случае имеет место быть ускорение и требуется коррекция акселя а вместе с ним и горизонта
но достучаться до разработчиков есть шанс только самому раскопав место в коде и указав ошибку
покопал программный код -
вопрос: уровень отклоняется при воздействии на аирспид в полевых условиях?
по идее разный алгоритм коррекции при хорошем захвате спутников по жпс и при проблемах с жпс
вот этот кусок
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);
}
}
уровень отклоняется при воздействии на аирспид в полевых условиях?
Я проверял строго без GPS.
покопал программный код
Завтра гляну его внимательнее.
Помогите, не получается переключать экраны minim. Пульт ER9x. поставил на восьмой канал 100% source:full switch TRN . в миниме поставил канал 8 так же, без rotating. не меняет и все тут.
2. Как скачать логи полета? запускаю mp через комплект телеметрии 915 коннекчусь, если запускаю терминал он без перерыва что то пишет, не давая написать команду. что делать?
не получается переключать экраны minim. Пульт ER9x. поставил на восьмой канал 100% source:full switch TRN . в миниме поставил канал 8 так же, без rotating. не меняет и все тут.
А вы поставьте в OSD отображение каналов, и посмотрите, меняется ли 8-й. Я кажется лечил такое установкой на АПМ сквозного канала для канала управления OSD, типа passthrought, точнее сказать не могу, АПМ не дома. А может у вас Warning на экране светится какой нить ? В этом случае он всегда будет первый экран показывать.
- Как скачать логи полета? запускаю mp через комплект телеметрии 915 коннекчусь, если запускаю терминал он без перерыва что то пишет, не давая написать команду. что делать?
А через USB пробовали ?
Через USB не получится -плата упакована в бикслер с помощью термоклея по углам крепления. доступа до порта ,увы , нет. ну что-нить придумаю.
По поводу предупреждения -спасибо, хорошая идея. он у меня показывает изначально low rssi и no gps fix (дома проверяю) -отключу сегодня принудительное переключение на основной экран и проверю.
Господа, у меня пара простых и тупых вопросов про АПМ. Сегодня настраивал АПМ на SkyWalker 2013.
В режиме стабилизации бросаю ручки, он немного пикирует. Думаю гироскопы неправильно выставлены, на земле приподнял нос, перекалибровал гироскопы, вроде лучше стало, немного вверх забирает. Так и надо настраивать ? Чисто калибровкой гироскопов ?
Потом пошел настраивать “по бумажке”, увеличивал пиды до оссциляций. Ролл пид получился 5, не слишком много ? Или может это из-за того, что у меня довольно сильно зажаты элероны для комфортного управления в ручном режиме ? Поставить расходы по элеронам побольше и перекалибровать аппу в МП и заново подобрать ролл пид ?
Перешел в FBWA, поставил газ заведомо больше круизного, ручку элеронов до упора, он накренился на заданный угол (40%) и летает кругами. Так и должно быть ? Или он должен с помощью компенсаций РН и РВ пытаться лететь прямо в наклонном состоянии ?
Зато сегодня садился вообще красиво, в мануале вышел примерно на метровую высоту, мотор вырубил, включил FBWA и бросил ручки, сел он сам идеально ровно 😃
По поводу предупреждения -спасибо, хорошая идея. он у меня показывает изначально low rssi и no gps fix (дома проверяю) -отключу сегодня принудительное переключение на основной экран и проверю.
Обязательно расскажите потом что получилось.
Через 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
ну значит сделаю еще и мини-лючок для юсб =) бедный бикслер, он и так уже с 3-мя лючками.