ArduCopter Mega: порт на обычную Arduino (тестим)
В описании Ардуино на arduino.ru указывают, что арифметические операции с плавающей точкой нежелательны. Что то с точностью. Рекомендуют проводить операции сравнения. Это может сказаться на работе такой прошивки?
Это может сказаться на работе такой прошивки?
Совсем не знаю. 30 минут прошивка работает. Мне хочется выжать максимум из бародатчика или искать более точный - мечтаю о “зависании” коптера в режиме alt-hold. Операции с плавающей запятой жрут больше ресурсов, но я попробую, все равно. Надо еще искать, как вывести время цикла.
VMLAB вам в помощь выводите на любую ногу 1 выполняете код, выводите 0 смотрите сколько по времни получилось
float - зло для контроллеров без сопроцессора, округляйте до Nного знака и считайте с фиксированной точкой будет существенно быстрее
“x = 4433000 * (1 - tmp_float)” при такой записи компилятор откинет дробную часть от tmp_float и приведет все к int и long.
float x;
x=1. - tmp_float
Высокую точность можно и с целочисленными операндами получить, если ввести понятие масштаба. Если будет охота заморочиться - пиши, попробую вспомнить чему на дискретке учили 😃
Совсем не знаю. 30 минут прошивка работает. Мне хочется выжать максимум из бародатчика или искать более точный - мечтаю о “зависании” коптера в режиме alt-hold. Операции с плавающей запятой жрут больше ресурсов, но я попробую, все равно. Надо еще искать, как вывести время цикла.
У меня на борту 2 Ардуины. Сейчас поставил второй Мегу 2560. Дуемиланове использую в качестве программатора. Хочу перешить G-OSD. Очень надеюсь на Вашу прошивку. Если перенести баро и сонар на вторые мозги а в основную передавать готовые данные по высоте, как думаете, поможет? Есть второй рабочий барометр, может если усреднять показания с двух, точность может повысится? У меня мечта аналогичная. Только хочется холд на сверхмалых высотах и еще 3 сонара для бокового обзора. Есть в Большом кратере возле Димоны стенка, высотой метров 100. Примерно посередине пещеры. Хочется посмотреть, что там внутри, хотябы возле входа. Если доведу до ума прототип, то окончательная версия будет для дистанционного обследования. Видел как то ролик из штатов, там на акул охотились с помощью коптера. Тоже хочу! Хоть и нет тут серьезных акул, зато возле берега под водой развалины античных городов. Аквалангисты лазят, но они такую площадь не проверят, как коптер может. Если прозрачность воды позволит, конечно. Не Красное море, мутноватая вода. Метров на 5 видимость. Редко 10.
Только хочется холд на сверхмалых высотах и еще 3 сонара для бокового обзора.
В принципе, холд уже работает. Если коптер не наклонять сильно, то все пучком. Я выкладывал видео, как моя страшилка висит в сантиметрах 10-20 от земли. Причем был сильный ветер.
Еще идея прорезалась, снимать показания с сонара только при нулевом левеле, ± сколько нибудь, чтобы совсем уж не перестал работать. Когда луч вертикально примерно. При кренах все равно врет, а при болтанке через ноль проходит. К сожалению программер из меня, как из бутылки молоток, но надеюсь надергать код из интернета, из готовых проектов.
Есть второй рабочий барометр, может если усреднять показания с двух, точность может повысится? У меня мечта аналогичная.
Думаю, 2 шумящих барометра не помогут. Если повезет при инициализации, то один даст дрейф -50см, другой +50см, в итоге суммарный дрейф = 0. Иначе не повезло.
Я присматриваюсь к “MS5611-01 MS5611 Barometric Pressure Sensor Variometer”, пока их нет в наличии на ибей. Заявленная точность 10см, 1Па.
“x = 4433000 * (1 - tmp_float)” при такой записи компилятор откинет дробную часть от tmp_float и приведет все к int и long.
float x;
x=1. - tmp_float
Именно так и было. Весь вечер страдал, разозлился и всем прописал (флоат .0000).
Высокую точность можно и с целочисленными операндами получить, если ввести понятие масштаба
Можно умножать коэффициенты типа (0.000019876) на 100 000 000 и хранить как int32_t. Только немного повозиться с библиотекой.
В sensors.pde отдавать не реальное давление 10130(0) Па, а 101300 0(0) попугаев. И пусть последний разряд прыгает, это будет не 1Па, а сотые доли Паскаля. Все-равно, потом используется соотношение: Pтекущее \ Рground.
И еще часть кода я перенесу из calculation() в init() - рассчет x, y, которые статичны.
В принципе, холд уже работает. Если коптер не наклонять сильно, то все пучком. Я выкладывал видео, как моя страшилка висит в сантиметрах 10-20 от земли. Причем был сильный ветер.
Сылку не кинете? Долго искать по всей ветке. Сейчас вот снял коптера с ног. Приделываю свеже полученные приблуды. ЖПС на хвостовую балку недалеко от платы. Там проходят провода к моторам, но они у меня везде проходят, попробую поиграться, найдет этого ЖПСа или нет. В комплекте с G-OSD пришел. Осд перешивать нужно, то, что есть ни к селу ни к городу.
Еще идея прорезалась, снимать показания с сонара только при нулевом левеле, ± сколько нибудь, чтобы совсем уж не перестал работать.
Так нельзя делать! во всяком случае, пока у вас включен автопилот (ALT_Hold). Т.к. если в какой то момент не снимать показания с сонара, то откуда брать высоту? На барометр нельзя резко переходить, т.к. может оказаться, что коптер висит в 15 см от земли, а баро скажет что 50см… и автопилот благополучно воткнет его в землю.
Если что то и делать, так это ограничивать угол наклона коптера при работе с сонаром. Т.е. на малой высоте не давать наклонять коптер больше 15гр. (Но при этом, возможна ситуация, когда вы не сможете удерживать коптер на одном месте (при сильном ветре))
Брать предыдущее показание. Все равно высота не меняется резко. Обновлять при переходе через ноль
снимать показания с сонара только при нулевом левеле, ± сколько нибудь, чтобы совсем уж не перестал работать.
Смотрите место в ArdupirateMega.pde, где вычисляется высота. Там кусок кода закомментирован, который корректирует высоту по cos\sin наклонов. Переменные наклонов можете использовать для своих целей, их можно вывести в Serial и понаблюдать, какие у них значения. if (sonar_alt < 600) and ( (round(x)>30 degree) OR (round(y) > 30 degree) ) {alt = 0.5*baro_alt + 0.5*sonar_alt; //при сильном наклоне подмешиваем баро_высоту, потому что сонар отваливается }- на словах. Только баро дрейфует на 50 см!
Сейчас в коде на сверхмалой высоте коэффициент_баро -> 0, если пропадает и sonar_alt, то морковка.
Не совсем то. Не учитываются показания сонара вообще при крене. Нужно учитывать постоянно, но обновлять переменную с сонара только вблизи левел = 0
Явно ложные показания будут игнорироваться.
Не совсем то. Не учитываются показания сонара вообще при крене. Нужно учитывать постоянно, но обновлять переменную с сонара только вблизи левел = 0 Ответить с цитированием Ответить с цитированием Поблагодарить автора Спасибо! Кинуть помидором
А надо ли вообще учитывать крен? Там высота будет незначительно изменятся (мне кажется). А вот не учитывать текущую высоту нельзя - т.к. если вы например летите куда то, естественно коптер будет наклонен - а высота то старая будет все время - в итоге краш.
при крене
Только проблема, что при крене коптер теряет высоту, поэтому будет точно не 1 метр. А на сильном крене он сваливается.
Предлагаю при сильном крене и отваливающемся сонаре “подмешивать” baro_alt. Как только уровень выровняется, влияние баро_альт сильно ослабить, и использовать сонар_альт на 98%
level>=30: alt = 0.8* alt_предыдущая + 0.2*baro_alt
level<30: alt = 0.98* sonar_alt + 0.02*baro_alt
Борис, именно так забудьте метры, граммы, паскали, считайте в “штуках”.
Все, что можно в константы, все, что считаеттся 1 раз в статические переменные.
level>=30: alt = 0.8* alt_предыдущая + 0.2*baro_alt
0.2* baro_alt будет считаться до скончания веков, запись (baro_alt>>2) эквивалентна 0.25 *baro_alt, а работает 2 такта.
я бы сделал так:
alt = (alt_предыдущая>>1)+(alt_предыдущая>>2)+(baro_alt>>2); //alt = 0.75* alt_предыдущая + 0.25*baro_alt
Только проблема, что при крене коптер теряет высоту, поэтому будет точно не 1 метр. А на сильном крене он сваливается.
Предлагаю при сильном крене и отваливающемся сонаре “подмешивать” baro_alt. Как только уровень выровняется, влияние баро_альт сильно ослабить, и использовать сонар_альт на 98%
level>=30: alt = 0.8* alt_предыдущая + 0.2*baro_alt level<30: alt = 0.98* sonar_alt + 0.02*baro_alt
Кто же будет заниматься высшим пилотажем у земли то? Речь ведь идет о висении на сверхнизких высотах. При болтанке скольжение минимальное, стики по нулям. А про высоты, где сонар не работает вообще другой разговор. В идеале вообще нужно автоматическую посадку вводить. Что бы сам садился в точке взлета, а не болтался над точкой. Подразумевается, что сигнал управления потерян и кренов со скольжением вообще быть не должно.
Можно умножать коэффициенты типа (0.000019876) на 100 000 000 и хранить как int32_t. Только немного повозиться с библиотекой.
Собственно 100 000 000 и будет масштабом в данном случае. Можно так и работать. Если хочется выжать из int32 все, до последнего бита, то масштаб придется в виде степени двойки вычислять, исходя из максимального (разумного) значения величины.
Alex_from_Israel, давно пора эхолот привязывать к коптеру. 😃 И слежение за рыбой реализовать.
кстати, как мегапират будет вести себя если сигнал от пульта ДУ заглушить? Просто рухнет на землю?
Отчед: Начал портировать 2.0.43
Alex_from_Israel, давно пора эхолот привязывать к коптеру. 😃 И слежение за рыбой реализовать.
кстати, как мегапират будет вести себя если сигнал от пульта ДУ заглушить? Просто рухнет на землю?
Вроде файлсейв есть… По идее должен плавно снизить обороты мотором и приземлиться более-менее плавно. Хотя, кто его знает? Я еще и не летал то, как следует. Усе упереди, Козлодоев!
Не, за рыбой не хочу! Я рыбу уважаю с пивом, но не прямо из моря! Проще прикупить в магазине, благо выбор есть. От тараньки до деликатесной семги. А прям из моря тоже можно. На Марине (это у нас так яхт клубы называют) есть ресторанчик в котором рыбу жарят через полчаса после отлова. Рыбаки прямо с катера своего в ресторанчик этот отгружают. Будете в наших краях, обязательно посетите! Классно жарят! Лучше только в Эйлате, в ресторане рыбном. Название странное, что то вроде последний толи причал, толи приют. Не помню точно. Сети и штурвалы по стенам и чудная запеченная в сметане рыбка!