Проект Мегапират на самик!

LeonVS

Может попробовать на самом деле портировать 28 прошу? По словам Кости виснет она меньше 😃

Syberian

Костя будет дрыхнуть сутки и не скажет, у него что, оригинал ардупилот есть? 28-ю никто не портировал еще.

alex-ber
LeonVS:

Может попробовать на самом деле портировать 28 прошу? По словам Кости виснет она меньше

Или словить и вылечить глюк на 26?
на 24-й наблюдал явления описаные Леонидом только один раз (когда не сделал заливку ПУСТЫХ данных по точкам перед заливкой Миссии - описывал уже…).
26-ю сегодня залил еще раз… Вернулся на 24 - перезагруз продолжается (даже с закоментеным портом телеметрии…) - подключение по ЮСБ.
Жаль…

LeonVS

Как и обещал видео испытаний пирата в экстремальных условиях, все выкладывать не стал, только кусок как он полз против ветра ну и как летел по ветру + моя попытка изменить миссию = режим CIRCLE 😃
dpiter.info/crash.wmv

Syberian

Еще камент по отказу:

LeonVS:

сразу же связь с вортексом рвется у еОСД, и походу врубается режим CIRCLE, начинает кружить с выключенным движком…

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

Так что отсутствие перезагрузов - это ВАЖНЕЙШИЙ критерий правильной работы софта в нашем случае. Вне зависимости от того, насколько хорошо оно летает по точкам.
Поэтому я и не лезу на 26.
Можно попробовать поискать баг. Но летать до выяснения я бы не советовал.

LeonVS

Олег, а точно в буфере проблема? Давай полностью порт телеметрии отключим, как сие реализовать? Полагаю просто закоментить установку скорости явно маловасто?

ABL
LeonVS:

Может попробовать на самом деле портировать 28 прошу? По словам Кости виснет она меньше 😃

Я ползовал 28 на APM (не 2). По моему, уже пора перейти с 24 к 28 - пофиксили много баг.
И почему выбросили поддержку SD? Я ползую простой combo тоже - Arduino Mega + Sensor shield + FreeIMU clone. Поддержка SD была бы очень полезна - лог.

Syberian
LeonVS:

просто закоментить установку скорости явно маловасто?

тогда выставится по умолчанию 57600

в принципе отключить ее можно.
в файле gcs_mavlink.pde закоментить все строки после 2037-й, содержащие gcs3.
например:
gcs3.update
gcs3.data_stream_send

а также строку 2095, где COMM_1 написано

Проверяй посылкой команд навигации, переключением режимов удаленно и проч. через ЮСБ.

LeonVS
Syberian:

в файле gcs_mavlink.pde закоментить все строки после 2037-й, содержащие gcs3.
например:
gcs3.update
gcs3.data_stream_send

а также строку 2095, где COMM_1 написано

Алекс, у тебя виснет как я понял постоянно, попробуй сие проделать, измениться ли что?

Хм… а вот интересно что будет, если использовать как я 115200, а потом тупо связь оборвется (выключить наземку или по дальности) то же повиснет из за переполнения буфера???

ukkr

Костя будет дрыхнуть сутки и не скажет

Всем привет. Чуть не проспал на работу. 😃

LeonVS:

По словам Кости виснет она меньше

Эм… Я не говорил, что она виснет меньше. У меня даже негде проверить, больше или меньше она виснет. На Вортекс то оно не портировано. Я только код смотрел, сравнивал с нашей 26й и нашёл много хороших вещей\баго-фиксов в 28й. Вот, цитата себя, любимого:

К стати, посмотрел я на код АрдуПилота для самолётов 28й и 26й версии. Так вот, в 28й очень много изменений по сравнению с 26й. И фиг с ним, с мавлинком. Но там изменения фундаментальней.

  1. Уход с библиотеки Wire на I2C. Это задевает всё, в том числе и работу с датчиком компаса
  2. Сам драйвер компаса AP_Compass_HMC5843.cpp кроме того, что переписан на I2C теперь ещё и сохраняет состояние последней операции( успешно или сбой) в поле healthy и умеет автоматически переинициилизироваться после сбоя:
    Код:
    bool AP_Compass_HMC5843::read()
    {
    if (!healthy) {
    if (millis() < _retry_time) {
    return false;
    }
    if (!re_initialise()) {
    _retry_time = millis() + 1000;
    return false;
    }
    }
    Кроме того, само поле healthy используется в куче разных мест автопилота для расчётов и принятия решения. К стати, то же самое и с бародатчиком.
  3. Улучшен( “причёсан”) DCM. Вынесен резет матрицы в отдельный метод, куда добавлена и разрешение обнуления оф-та компасса:
    Код:
    AP_DCM::matrix_reset(void)
    {
    if (_compass != NULL) {
    _compass->null_offsets_disable();
    }
    _dcm_matrix.a.x = 1.0f;
    _dcm_matrix.a.y = 0.0f;
    _dcm_matrix.a.z = 0.0f;
    _dcm_matrix.b.x = 0.0f;
    _dcm_matrix.b.y = 1.0f;
    _dcm_matrix.b.z = 0.0f;
    _dcm_matrix.c.x = 0.0f;
    _dcm_matrix.c.y = 0.0f;
    _dcm_matrix.c.z = 1.0f;
    _omega_I.x = 0.0f;
    _omega_I.y = 0.0f;
    _omega_I.z = 0.0f;
    if (_compass != NULL) {
    _compass->null_offsets_enable(); // This call is needed to restart the nulling
    // Otherwise the reset in the DCM matrix can mess up
    // the nulling
    }
    }
  4. Пофикшен тупой баг в FastSerial.cpp, было _txBuffer->tail = _rxBuffer->head; , а надо было _txBuffer->tail = _txBuffer->head;
  5. Вместо IMU_Oilpan появился IMU_INS с целой кучей своего барахла.
  6. Появился failsafe самого МегаПилота. Если он обнаруживает, что, что-то не то с МегаПилотом, то он начинает отсылать напрямую команды с приёмника на сервы, без своей обработки.
    7)Появился geo fencing. На сколько я вкурил( поверхностно) – позволяет вам управлять границами полёта, соответственно МегаПилот не даст пепелацу вылететь за эти границы. Соответственно весь код МегаПилота проапдейчен, чтоб учитывать этот самый geo fencing.
  7. Куча всякого другого. Где-то причесали код, где-то зафиксили баги и т.д.

Со всего этого я добавил себе уже фикс бага FastSerial. Остальное ещё не пытался интегрировать.

alex-ber
LeonVS:

Алекс, у тебя виснет как я понял постоянно, попробуй сие проделать, измениться ли что?

вечером попробую…
Пока на работе…

ukkr

Докладую. Решил поглядеть, как оно, без МАВЛИНКА с ГЦС.
Только я пошёл чутка более радикальным путём, обрамил всё, что связано с ГЦС и МАВЛИНК в #if…#endif. Плюс, застабил несколько gcs_XXXXXX функций.
Вроде как за 40 минут перезагрузок не было, хотя крутил его как бешеного. Сервы работают чётко, без сброса в 0е положение.
В Эттаче голые сырцы этого
MegaPiratePlane2.26-NO_GCSMAVLINK.zip
Застаблены
вот эти функции

#if GCSMAV_ENABLED==DISABLED
void mavlink_delay(long unsigned int){}
void gcs_send_message(ap_message){}
void gcs_data_stream_send(uint16_t, uint16_t){}
void gcs_update(){}
void gcs_send_text_P(gcs_severity, const prog_char_t*){}
#endif

Да, несколько расстроен взаимодействием МегаПирата с сервами.
Пока использовал дешёвые аналоговые С-02СТ от Пилотажа – особо не шумело, работало. Как только подрубил достаточно дорогие корейские цифровые металлические InoLab D202MG – кореец постоянно жужжит, как похотливый майский жук. 😵 Неужели МегаПират не работает с цифровыми сервами?

LeonVS
ukkr:

без МАВЛИНКА с ГЦС.

Полагаю совсем без МАВЛИНКА точки будет то же не занести в моск? Хотя если проработало без проблем, можно пошагово включать малыми порциями постараясь выявить проблемный участок…

ukkr

Ну, точки я и просто так не заносил, всё ж на коленке, тьфу на столе. Достаточно было просто врубить его и крутить и крутить… 10-15 минут давали перезагруз. Ща держит вроде.

ukkr

Разбираю AP_Mount. Блин, намутили они через ж…пу. Но, вроде, выходит каменный цветок.

alex-ber

Да ребята…
А у меня не сложилось… - только с работы приехал. Мозг и без того высушен!
Надеюсь завтра (верней сегодня…) будет спокойней - попробую добраться до железок…
Спокойной ночи!!!

Syberian
ukkr:

кореец постоянно жужжит, как похотливый майский жук.

Значить, серва под нагрузкой, вот и жужжит. У меня в другом проекте стоит цифровая на подсос ДВС, тоже пищит. Туда-сюда стронешь - перестает, а потом опять. Это их цифровое свойство: чуть стронешь с заданной точки - она валит мощность на полную, чтобы вернуться.
Вот если она пощелкивает туда-сюда, это другое дело, но это я пофиксил ранее.

Без мавлинка будет полная опа: ни точки прописать, ни ПИДы сконфигурять. Там 2 объекта телеметрии: gcs0 и gcs3. Соответственно, порты serial0 и serial3. Если gcs3 поудалять, то по ЮСБ управление останется, а по беспроводке уйдет. Соответственно, какая-то там нагрузка уберется и баг, скорее всего, исчезнет.

LeonVS
Syberian:

Сегодня 05:36

Олег, ты вообще спишь 😃?

ukkr
LeonVS:

Олег, ты вообще спишь ?

😆

Syberian

эээ… вообще-то у нас было пол девятого утра 😃

ukkr

Тек, у меня есть новости для тех, кого волнует камера маунт.
В принципе, удалось его завести. Оно даже работает. В смысле стабилизация подвеса камеры работает. Остальное – не тестировал, потому что МАВЛИНК у меня отрублен. К стати, с отрубленным МАВЛИНКОМ никакого перезагруза нету.
Теперь к камера маунту. Если не интересно – можете дальше не читать, ибо я начну вообще с описания aux каналов.
Итак, у АрдуПилота есть обычные каналы управления. Ну там газ, руль высоты, направления и т.д. Кроме того, у него есть вспомогательные каналы, так называемые “aux”. Вот они могут быть абсолютно разных типов. С точки зрения программиста, каналы эти вспомогательные описываются классом RC_Channel_aux, который расширяет базовый класс RC_Channel. Определение его находится в файлах RC_Channel_aux.h и RC_Channel_aux.cpp. В самом АрдуПилоте определены 4ре вспомогательных канала. Определения находятся в parameters.h:

RC_Channel_aux	rc_5;
	RC_Channel_aux	rc_6;
	RC_Channel_aux	rc_7;
	RC_Channel_aux	rc_8;

Ардупилот не знает, что скрыто за каждым их этих вспомогательных каналов.
Собственно говоря, программист сам определяет для каких дополнительных функций будет использоваться тот или иной вспомогательный канал. Список этих дополнительных функций объявлен в перечислении в RC_Channel_aux.h:

typedef enum
	{
		k_none			= 0,	// disabled
		k_manual		= 1,	// manual, just pass-thru the RC in signal
		k_flap			= 2,	// flap
		k_flap_auto		= 3,	// flap automated
		k_aileron		= 4,	// aileron
		k_flaperon		= 5,	// flaperon (flaps and aileron combined, needs two independent servos one for each wing)
		k_mount_yaw		= 6,	// mount yaw (pan)
		k_mount_pitch	= 7,	// mount pitch (tilt)
		k_mount_roll	= 8,	// mount roll
		k_mount_open	= 9,	// mount open (deploy) / close (retract)
		k_nr_aux_servo_functions // This must be the last enum value (only add new values _before_ this one)
	} Aux_servo_function_t;

Те функции, что связаны с маунтом я выделил жирным. Так вот, чтоб какой-то из вспомогательных каналов пометить для выполнения той или иной функции, надо в коде проставить у вспомогательных каналов rc_5, rc_6, rc_7, rc_8 – поле function в соответствующее значение:

AP_Int8 	function;	// 0=disabled, 1=manual, 2=flap, 3=flap auto, 4=aileron, 5=flaperon, 6=mount yaw (pan), 7=mount pitch (tilt), 8=mount roll, 9=camera trigger, 10=camera open, 11=egg drop

Процедура update_aux_servo_function() собственно уже вызывается после того, как вы поменяли какому-то вспомогательному каналу тип функции, которую он выполняет. Для привязки всего остального функционала к этим изменениям.

Идём дальше, уже к самому маунту. Итак, класс маунта содержит метод update_mount_type(). Не вдаваясь в подробности – этот метод смотрит, сколько дополнительных каналов управления включил программист для управления осями камеры. Если включены только pan и tilt-- тип подвеса k_pan_tilt. Если tilt и roll – тип подвеса k_tilt_roll. Если все – k_pan_tilt_roll. Дальше, уже при управлении маунтом АрдуПилот знает тип( количество степеней свободы) подвеса( маунта) и соответствующим этому типу образом и управляет им. В том числе, и стабилизацией.

Т.е., если вернуться к исходной проблеме, как включить Маунт, чтоб он работал – для этого надо сделать следующее:

  1. Поставить MOUNT = ENABLED. Это добавит поддержку маунта в код
  2. В удобном для Вас месте подключить дополнительные каналы на соответствующие функции камеры. Сделать это можно в разных частях кода – где вам удобнее.
    Я, когда игрался сейчас – влепил это прямо в функцию инициализации АрдуПилота:
    init_ardupilot() в файле system.pde
    Достаточно дописать в конце этой функции:

g.rc_6.function.set(6);
g.rc_7.function.set(7);
g.rc_8.function.set(8);
// и т.д.

– это эсайнит дополнительным каналам соответствующие функции (
вспоминаем:

     k_mount_yaw	= 6,	// mount yaw (pan)
		k_mount_pitch	= 7,	// mount pitch (tilt)
		k_mount_roll	= 8,	// mount roll

)

Всё, вы запустили маунт.

Вот, собственно говоря, видео моих тестов на стабилизацию подвеса:

Да, маленькая ложка дёгтя. Как видно с видео, система управляет по “PAN” Маунтом. А вот TILTом маунта она шевелить не хочет. Пока я не разобрался, чего так, может так и задумано? :wacko::blink:

Надеюсь, кому-то это будет полезно.

P.S. 2 Олег.

Значить, серва под нагрузкой, вот и жужжит… Это их цифровое свойство…

У меня как раз в TILT подключена эта цифровая серва. Чёрненькая. На видео слышно, как она “жужжит”. Нагрузки на ней никакой нету, она реально свободная. А “жужжит”… Разве это нормально? Когда втыкаю её в Футабий 2.4ГГц приёмыш – молчит, работает чётко. А вот Арду как-то не так ею “рулит”.