Проект Мегапират на самик!
кто как отлаживает код в аурдино???
Да никак его не отладить. Только на плате через ком-порт что-то выводить.
По поводу inverted flight. Он включается через какой-то канал приемника. У тебя случайно он не разрешен?
прямо написано MEGA Pirate and MultiWii code compatible.
Велкам в нестройные ряды пиратов 😃 Покупать надо было на csgshop.com, там на 20 баксов дешевле.
Чтобы не ломать глаз в блокноте, используйте Notepad++, там есть подсветка синтаксиса.
Для поиска текста по всему проекту пользуюсь FAR manager 1.63 - типа нортона под виндой.
Глюк пропадает только когда коментишь вот этот кусок:
ага, попался! Я понял в чем засада. Дело в том, что в оригинальном ардупилоте за реверсы отвечают микропереключатели на плате. У нас их, естественно, нет, и эти ноги висят в воздухе. К тому же, на них нет подвески, т.е. все наводки и конденсат наши. В 2.24 они просто запрещены, а 2.26 была первая пробная версия, в которую я это не перенес (забыл).
За скорость отдельное спасибо 😃
П.П.С. 250 = 25 м/с – не вкурил.
Отписался уже, что туплю под вечер 😃 Один ноль потерял 😃 В общем, гипотеза по скорости провалилась…
Чисто предположу, что инверсия происходит когда происходит переполнение больше 16 бит.
К тому же, на них нет подвески, т.е. все наводки и конденсат наши.
Вот оно в чем дело, ну хоть все встало на свои места, что радует 😃 А по скорости очень похоже на правду что это метры в секунду / 10. Хотя смотрю у тебя уже стоит преобразование в км/ч на выход в еОСД… Чтот мое запуталось однако 😃
sport.write((byte)(g_gps->ground_speed * 0.036));
Чисто предположу, что инверсия происходит когда происходит переполнение больше 16 бит.
Тогда почему сие не происходит при комнатной температуре ни при каких условиях?
Велкам в нестройные ряды пиратов Покупать надо было на csgshop.com, там на 20 баксов дешевле.
Чтобы не ломать глаз в блокноте, используйте Notepad++, там есть подсветка синтаксиса.
Для поиска текста по всему проекту пользуюсь FAR manager 1.63 - типа нортона под виндой.
Пасиб 😃 Про csgshop.com – не знал, спасибо, на будущее запомню. Линку брал то ли с чьего-то блога, то ли с начала этой темы. Про ЦСГШоп там не было. 😦
По поводу Notepad++ – я его уже года 2 использую, как и SciTe. Много вещей в них делать удобнее чем в Eclipse( в основном, я Java Enterprise разработчик). А файловый менеджер уже нное количество лет – Total Commander. Тока не будем разжигать религиозную войну Far Vs TC. 😌
Олег, возвращаясь к моему предыдущему посту:
1)
PINE и PINL. Если предположить, что это Port E и Port L Меги 2560
Правильно ли это предположение?
2)
посмотреть на схеме BlackVortex, что у него подключено к соответствующим ножкам этих портов:
(PINE & 128) (PINE & 64) (PINL & 64)
Выходит, что к 6й, 7й ножке порта Е и 6й ножке порта L подключались те самые
оригинальном ардупилоте за реверсы отвечают микропереключатели на плате.
?
П.С. И ссылкой на схему BV не поделитесь?
П.С. И ссылкой на схему BV не поделитесь?
Думаю схему не кто не даст, как то тут уже писалось, мол это ком. тайна и все такое 😃
Отписался уже, что туплю под вечер 😃 Один ноль потерял 😃 В общем, гипотеза по скорости провалилась…
Не всё так плохо 😃
defines.h содержит константу предела скорости, при которой автопилот начнёт отрыв от земли
#define SPEEDFILT 400 // centimeters/second; the speed below which a groundstart will be triggered
По mavlinkу тоже
g_gps->ground_speed * rot.a.x, // X speed cm/s
g_gps->ground_speed * rot.b.x, // Y speed cm/s
В том же config.h
#ifndef AIRSPEED_CRUISE
# define AIRSPEED_CRUISE 12 // 12 m/s
#endif
#define AIRSPEED_CRUISE_CM AIRSPEED_CRUISE*100 – специально переводят себе в cm/s
Идём дальше AP_DCM.cpp (хреновина, которая всё и решает 😃):
#define SPEEDFILT 300 // centimeters/second
radio.pde тоже оперирует cm/s
Так что Ваше предположение о том, что внутри МегаПират оперирует сантиметрами/сек скорее всего верно.
Да, если bvHUD – ответная часть для ОСД: sport.write((byte)(g_gps->ground_speed*0.036)); //m/s *100 transform to KPH
Если _EOSD – ответная часть для какой-то другой ОСД sport.write((byte)(g_gps->ground_speed*0.036));
Т.е. то же самое cm/s переводят в km/h
Значит у МегаПилота всё нормально. Особенно, учитывая тот факт, что g_gps->ground_speed используется в МП везде.
Если показывается в ОСД другое значение – надо тогда смотреть код самой ОСД, скорее всего он неправильно отмалёвывает. Или неправильно вынимает то, что ему приходит от bvHUD или _EOSD части МегаПилота.
Выходит, что к 6й, 7й ножке порта Е и 6й ножке порта L подключались те самые оригинальном ардупилоте за реверсы отвечают микропереключатели на плате.
“Пробил” только что схему оригинального ардупилота. Таки да, переключатели реверсов подключены к ногам соответствующих портов контроллера -
PL6 - 41
PL7 - 42
PE6 - 8
PE7 - 9
П.С. И ссылкой на схему BV не поделитесь?
Схема Вортекса - Мега 2560 + датчики в стандартном подключении. По пдфкам с его сайта достаточно хорошо видно разводку верхней стороны платы. Ничего, кроме задействованных в Пирате ног там дополнительно не разведено. В т.ч. и эти ноги тоже не разведены. Я себе развёл свою плату, аналогичного функционала, только ЖПС вынес отдельно. Жду датчики, чтобы собрать и проверить в работе:)
Да, по поводу нашего БлекВортекса и единиц измерения скорости в МегаПирате.
У нас стоит U-Blox ГПС, скорость вынимается из MSG_VELNED их протокола. А там единицы измерения чётко указаны
velN cm/s NED north velocity
8 I4 - velE cm/s NED east velocity
12 I4 - velD cm/s NED down velocity
16 U4 - speed cm/s Speed (3-D)
20 U4 - gSpeed cm/s Ground Speed (2-D)
Так что Леонид Вы правы, МегаПират оперирует cm/s
PL6 - 41
PL7 - 42
PE6 - 8
PE7 - 9
Отлично, что подтвердилось. Теперь по коду стало намного проще понимать, что такое PINE и PINL.
Правильно ли это предположение?
Если не посылать вас в даташит, то на пальцах: порт у атмеги состоит из 3 регистров: PORT DDR PIN. PORT это регистр выхода, DDR это направление, PIN это физическая нога. Буквы после них - это названия портов.
Если показывается в ОСД другое значение – надо тогда смотреть код самой ОСД
никак нет, в осд тупо показывается значение одного байта скорости. Преобразование выполняется в _EOSD.pde
никак нет, в осд тупо показывается значение одного байта скорости. Преобразование выполняется в _EOSD.pde
Олег, там же банальный
sport.write((byte)(g_gps->ground_speed*0.036));
Получается, есть только 3 варианта:
- (наименее вероятный) – неисправный GPS или связка Atmega2560 +GPS. Но тогда должно плющить и сам самолёт, gps->ground_speed используется повсеместно в коде, даже в DCM
- Компилятор сгенерировал кривой код для
(byte)(g_gps->ground_speed*0.036)
В принципе, вероятность этого есть, Ардуина же использует WinAvr’овский g++, а в нём часто находили говнокодо-генерацию.
3) Баг в прошивке самой ОСД. Например в функции, которая переводит число в строку. Достаточно распространённый трабл. Правда, непонятно почему тогда остальные показометры правильно отмалёвываются в ОСД.
Других вариантов я не вижу.😌
Расшевелил я смотрю ветку 😉
Компилятор сгенерировал кривой код для
Код:
sport.write((byte)(g_gps->ground_speed*0.036));
Перекомпилил я сие строчку в:
sport.write((byte)(g_gps->ground_speed * 36 / 1000));
Может с целыми числами дело пойдет лучше 😃
Сегодня -22, вот думаю поэкстрималить в полях, или лучше все же дома на печи поваляться 😃
Сегодня -22, вот думаю поэкстрималить в полях, или лучше все же дома на печи поваляться
Та ну, ни один автопилот не стоит такого издевательства над человеком.
Перекомпилил я сие строчку в:
sport.write((byte)(g_gps->ground_speed * 36 / 1000));
Результат отрицательный 😦 Скорость так же скачет…
Та ну, ни один автопилот не стоит такого издевательства над человеком.
Однако ваша правда, на крайнем полете сперва думали что сглючил АП, самуль проходя последнюю точку стал разворачиваться и быстро снижаться, метрах в 10-20 переключил на ручное ручку на себя, но скай как шел под углом градусов 45 так и вписался в сугроб…
Логи показали то ли отвалился кабанчик, то ли замерзла серва РВ… АП до последнего давил на себя на максимум…
К стати, какая переменная отвечает за шаг миссии? Хотелось бы знать какой шаг в данный момент исполняет АП… Я бы пока нет бвХУД вместо скорости вывел данные в планер, больше толка бы было, скорость все равно кривая 😃
К стати, какая переменная отвечает за шаг миссии? Хотелось бы знать какой шаг в данный момент исполняет АП…
Пока рылся в коде – натыкался на такие переменные next_nav_command и next_nonnav_command. Собственно у МегаПирата идёт разделение на эти 2 подтипа команд. Дёргается update_commands() на каждой итерации из commands_process.pde. Все кишки сидят в commands.pde, commands_logic.pde и commands_process.pde.
Счетчик туда прилепить может? И циферу в планер выводить, для настройки будет очень кстати.
Счетчик туда прилепить может? И циферу в планер выводить, для настройки будет очень кстати.
Не совсем понял. Там по каждой комманде при обработке идёт логирование на GCS, если я правильно понимаю :
gcs_send_text_fmt(PSTR(“Executing command ID #%i”),next_nav_command.id);
и
gcs_send_text_fmt(PSTR(“Executing command ID #%i”),next_nonnav_command.id);
Спасиб! Это то что надо, теперь надо всего лишь “i” отправить куда надо 😃
Олег, может замутишь в еОСД еще один байт в сервис строке для отображения номера команды навигации?
не, не “i” 😃 Вот это: “Executing command ID #%i” всего лишь показывает, что вместо %i надо подставить целочисленное значение.
А уже функция gcs_send_text_fmt подставит значение второго параметра( к примеру, next_nav_command.id) в эту строку.
То, что Вам надо-- эти две переменные:next_nav_command.id и next_nonnav_command.id. Вам надо посылать их на еОСД, а там парсить и выводить. Только учтите, эти айдишки – всего лишь айдишки типов команд. Ну т.е. банальные 1-2-3 и т.д. А вам ещё надо, на сколько я понял, и параметры самой команды. Ну т.е, вас не устроит банальное, скажем 10(к примеру, это поворот). А Вы хотите увидеть что-то типа: команда 10(поворот), направление 10 градусов, вокруг оси Х.
Беда в том, что у каждого типа команды свой набор параметров. Как в количественном, так и в типовом( целое, вещественное и т.д.) виде. Думаю, что вывести команды вместе с параметрами на ОСД в общем случае не выйдет.
А вам ещё надо, на сколько я понял, и параметры самой команды
Насколько я понял, нужен всего лишь номер команды по порядку, как она в миссии записана.
Ну т.е, вас не устроит банальное, скажем 10
Да нет, вполне устроит, то что делает определенная строчка я и так знаю, для меня важно знать что он в данный момент выполняет именно ее. Так что достаточно банально знать номер выполняемой команды 😃