Activity
юг тож вроде правильно показывает, a поворачиваешь на север - врет на 10-20гр
Компасс не очень точный прибор. Любой металл вблизи или проводник с током могут давать такую погрешность.
Магнитное поле не параллельно горзонту, так что это нормально. Главное от компаса в multiwii - это получение ориентации в горизонтальной плоскости. При рассчете учитывается акселерометр. Если все оси настроены правильно, то heading должен точно соответствовать поворотам вокруг YAW и не меняться при небольших наклонах.
Лучший вариант лучей - алюминиевая трубка 10/1мм. Сегодня случился жесткий краш (с 10 метров ровненько бочком на два луча). Но при этом из убытков только один мотормаунт. Замечательное свойство аллюминиевой трубки по сравнению с карбоновой или такой же квадратной - она не ломается необратимо, просто слегка гнется. Можно выгнуть обратно прямо на поле. Текстолитовый мотормаунт, погибнув, спас мотор. Пропсейвер спас пропеллер. Если до этого я сомневался в правильности своей конструкции, теперь все расставлено по своим местам. Да, трубку тяжело использовать в конструкции, но её преимущества в весе и устойчивость к деформациям перекрывают недостатки. Так что, господа конструкторы, закладывайте некоторую хлипкость в свои творения 😃
Я использовал прошивку с проекта Contraptor: contraptor.svn.sourceforge.net/…/firmware/ Добавил немного по мелочи:
- enable internal pullup resistor for endstop pins
- absMode is true by default
- correct bug (all X-Y-Z commands without G* was skipped)
grbl тоже понравился тем, что он написан именно для CNC. Тоже его запускал и он работал. Но там отсутсвуют некоторые важные функции:
- нет отработки концевых выключаталей.
- нет поддержки Enable PIN для шаговых двигателей. Они по сути всегда включены.
Вы какие доработки сделали в grbl?
Немного допилил настройки и поправил один баг в одном из клонов RepRap, стал нормально выполнять арткамовский G-код. Концевые выключатели он понимает, в настройках есть лимиты по скоростям и ускорениям, так что работать можно. Для отправки кода использую ReplicatorG.
преобразование в инт32 должно относиться к gyroADC[axis] а не результату в скобках… тут и было переполнение…
Спасибо, я действительно не проверял на эктремальных значениях, и вроде как позаботился о переполеннии - но не хватило опыта программинга микроконтроллеров. Привык уже работать с безразмерными типами в других более продвинутых языках 😃
Подскажите пожалуйста, какие проблемы с ним возможны? Я тоже остановился на нем, т.к. только с ним получилось нормально запустить двигатели и отработать концевые выключатели. G-коды вроде навороченные и не нужны для простого 3-х осного хоббийного станка. GUI ReplicatorG вроде с ним тоже работает, и мануал контрол есть и программу выполняет. Но резать пока не пробовал, разбираюсь с CAD-программами.
Подскажите, кто-нибудь успешно прменял Arduino в качестве исполнителя G-code? Перепробовал кучу проектов, но какая то фигня с ними - то не компилится, то не поддерживает нужных выводов (напмример ось_enable или лимитеры), то просто не подает прзнаков жизни после заливки.
Нужно нормальное firmware + GUI или скипт для отправки кодов через Serial.
Пена конечно интересна как строительный материал, но один из недостатков - большое сопротивление воздуху, как собственному потоку от пропеллеров, так и ветру.
Может конечно, ALLINONE разные бывают, но у меня помогли вот такие строки для 1.8:
Sensors.pde:
#if !defined(BMA180_ADDRESS)
//#define BMA180_ADDRESS 0x80
#define BMA180_ADDRESS 0x82
#endif
config.h:
#define YAW_DIRECTION 1 // if you want to reverse the yaw correction direction
…
#define ACC_ORIENTATION(X, Y, Z) {accADC[ROLL] = X; accADC[PITCH] = Y; accADC[YAW] = Z;}
#define GYRO_ORIENTATION(X, Y, Z) {gyroADC[ROLL] = X; gyroADC[PITCH] = Y; gyroADC[YAW] = Z;}
#define MAG_ORIENTATION(X, Y, Z) {magADC[ROLL] = -Y; magADC[PITCH] = X; magADC[YAW] = Z;}
Адрес гиры не менял. Чтобы компас не показывал погоду, важно точно согласовать его ориентацию с гирой и акселерометром. Ну и калибровать компас в ГУИ.
как только заливаю 1.8 p2 отключается itg3200
Смотря что за платка. У меня помогла смена адреса 0x80 на 0x82 датчика на I2C шине (в 1.7 также менял ручками)
только вот судя по коментам в коде у гиры диаппазон +/- 8192
Это максимальные значения при довольно сильных угловых скоростях (кстати занженные в MultiWii, изначально гира выдает почти что полные int16). В нормальной работе гира выдает данные недалеко от нуля. И мы прбавляем каждый раз измеренный средний ноль. И если там сидит ошибка к примеру 0.5, она быстро накапливается при интегрировании. Но это опять же силно зависит от гиры, на моей одна ось попадает в ноль точно, а вот вторая убегает быстро с округленным нулем. После ввода десятых становится стабильной как и первая. Вводить сотые смысла нет, ноль не на столько стабилен и там уже шум больше чем сотые.
Была мысль убрать деление на 4, чтобы ещё повысить точность, но тогда надо пересматривать всю арифметику на предмет переполнений, и мержиться с SVN будет сложно.
этож получится что “плавная” часть газа будет только на снижение, а увеличение газа как раз “резкое” по экспоненте (т.е. на подъем)
Нет, и на подъем и на снижение будут плавные части. Хотя и говорится про одну экспоненту, на самом деле их две (как и на ручки наклонов), соединенных в своей нулевой точке. С такой кривой мы быстро выбираем нерабочие участок до отрыва, затем плавно идет в районе отрыва и далше, и потом быстро растет до максимального газа.
И кстати посморите на второй параметр SHIFT_HOVER. Если у вас отрыв идет на 2/3 газа, то есть возможность сместить его в 1/3 и больший диапазон использовать для полета.
я обычно калибровку делаю с пульта когда коптер включен и стоит стабильно
Ну я тоже так делал если не забывал. А можно сделать и задерджку, по моему так удобнее. Кстати про калибровку гиры вообще мало инфы на официальной страничке и я случайно наткнулся на эту важную штуку.
в мультивии почти нет вычислений с плающей запятой, т.к. это увеличивает время цикла
Совершенно верно, респект разработчикам мультивий. Но если вы внимательно посмотрите код, вы увидите что я также не ввожу плавающую запятую, лишь уменьшаю делитель на 10 в одном месте и увеличиваю на 10 в другом. Тем самым сохраняю десятые доли и это работает (проверял на графиках).
думаю был бы и на тротл еслиб он был универсален на все конфигируции
Согласен, мой вариант надо немного сконфигурировать. Опять же посмотрите на добавку кода в config.h, там я предлагаю померять показания отрыва от земли и выставить центр экспоненты в эту точку (параметр THROTTLE_HOVER). Но результат стоит того. И кстати, если у вас есть подстройка кривой в самом пульте, вам также придется сначалаа померять точку отрыва, чтобы правильно нарисовать кривую.
в теории и на стенде так и есть (т.е. в ГУИ все красиво, до включения моторов хотяб на пол газа), НО на практике дешевые аксели видимо сходят с ума от вибраций и сами показания уже не правильные
Если хороший гиро, то можно посоветовать уменьшить вклад акселерометра в нахождение вектора ориентации. Попробуйте увеличить параметр в IMU.pde
#define GYR_CMPF_FACTOR 310.0f
Но надо смотреть по гафикам, насколько сильно уплывают показания гироскопа без акселерометра (для проверки поставьте GYR_CMPF_FACTOR 10000.0f).
Piranha: Выглядит неплохо и вес зачетный. А зачем такая сложная конструкция мотормаунта, почему его нельзя просто прикрутить на луч?
Задержка калибровки:
MultiWii.pde, setup():
...
initSensors();
//wait 3 seconds before start calibrating
delay(3000);
previousTime = micros();
..
Не очень важная доработка но я думаю что полезно: более точная калибровка нуля гироскопа. Сейчас в коде ноль округляется до целых. Так как данные гироскопа интегррируются, даже небольшая ошибка накапливается. Лучше окрулять до десятых, тем самым слегка повышается точность и уменьшается дрифт.
Sensors.pde, GYRO_Common():
...
if (calibratingG == 1) {
gyroZero[axis]=g[axis]/40;
...
for (axis = 0; axis < 3; axis++) {
gyroADC[axis] = (int32_t)(gyroADC[axis] * 10 - gyroZero[axis])/10;
...
Throttle-expo описан тут: www.multiwii.com/forum/viewtopic.php?f=7&t=623
Не знаю, меня мультивий в плане стабильности очень радует. Я поковырял его в части IMU (было интересно попробовать добавить реакции на линейные ускорения и перемещения), и непохо разобрался в его алгоритмах стабилизации. Так вот, они довольно точны и мат. модель IMU хорошо описывет все перемещения, особенно в связке с акселерометром и компасом. Единственное, нужно четко представлять что как подстраивать и триммировать, т.к. сам он это не умеет.
Насчет вибраций - по моему их влияние сильно преувеличено. Гироскоп их практически не видит, т.к. они не угловые, акселерометр видит, но он хорошо сглажен в коде и его вклад только в низкочастотных областях (видеть землю для корректировки дрифта гироскопа).
Замечания по своим ошибкам “обращения” с мультивием:
- при включении он калибрует ноль гироскопа. Т.к. я включаю втыканием питания в батарею, в этот момент возможны толчки. И потом его очень неслабо тянет в крен. Сделал задержку в 3 сек. чтобы успеть убрать руки.
- Акселерометр в левел- моде надо ТРИММИРОВАТЬ ОБЯЗАТЕЛЬНО. иначе никакими ручками на пульте не выставишь стабильность. Это можно сделать один раз, он сохраняет настройку.
- Добавил Expo для Throttle в коде, т.к. мой дешевый пульт не позволял точно удержать высоту, постоянно вверх-вниз колбасило. Теперь высота держится элементарно.
Шина все-таки дает не такое равномерное питание как звезда. Но даже если подключать по шине, подвод к ней от батареи надо делать удвоенным или утроенным диаметром.
на счет колодок вроде выдерживают, а вот провода с компьютерного БП нет, а так же выключатели некоторые
У меня провода d0.75 держат нормально (моторы в пределе 10А, в норме 5), больше смысла нет - вес увеличивается сильнее чем уменьшается падение мощности. А вот выключатели лучше не использовать, колодки и другие контакнтые разъемы тоже. Только специальные бананы, а лучше пайка (десяток грамм экономишь).
Ещё минус схемы - один тонкий провод на 4 мотора. Нужно делать “звезду” непосредственно от батарейных разъемов.
Заснял свою птичку (пока только в комнате). MultiWii 1.8 + ALLINONE, Level mode + compas. Учитывая вес >800г, сквозняки в комнате гуляют неслабые и постояно приходится подруливать. На воздухе должно быть стабильней.
Обновился с SVN, теперь проект не компилится под ProMini. Не спешите с обновлением.
Насчет платки ALLINONE - припаял вывод гиры к земле сразу как рекомендовали на её страничке. Поменял адрес акселя 0x80 -> 0x82. Запустилось сразу и пока (тьфу тьфу) проблем нет. Летал пока мало, занимаюсь осваиванием управления и точной отладкой и жду нормальную зарядку для LiPo. Но в комнате уже могу удержать птичку в пределах ± метр по осям.
Поделюсь опытом простой и удачной конструкции: два блинчика из текстолита 1.5мм, между ними щечки из сосны 30x15, зажимают лучи из круглого алюминиевого профиля 10мм. Ноги из сдвоенного текстолита работают как рессоры при жестких приземлениях. Все вместе соединяется восемью болтами М3.
Вся электронка внутри жесткого корпуса, повредить довольно сложно (в первом моем варианте ESC были на лучах и при падении на забор лишь чудом остались целы).
Вес пустой рамы 200гр без ног, 260 с ногами. Со всей загузкой и батареей 3s 3000mAh - около 800гр.
Только обратите внимание что внтри не так много места для мозгов, поместятся только компактные платки (у меня Arduino ProMini c MultiWii)