PIXHAWK PX4 Autopilot еще одна летающая железка
Взываю ковыряющих код.
Задача: заставить контроллер подвеса Storm32 не только крутить “головой”, но и активировать спукс его штатными средствами при подключении к PixHawk через UART. (copter.ardupilot.com/wiki/common-storm32-gimbal/)
Возможности: Storm32 понимает 2 MAVLink команды на спуск (MAVLINK_MSG_ID_DIGICAM_CONTROL и MAV_CMD_DO_DIGICAM_CONTROL, котовую должен кидать контроллер при любой активации спуска)
Тесты: используем скрипт, который крутит головой и нажимает спуск для создания панорамы, скрипт загужаем через Mission Planner из соотвествующей ветки
- контроллер подвеса подключен через UART и FTDI адаптер к ПК. Скрипт выполняется, спуск активируется, фотографии делаются.
- контроллер подвеса подключен через UART к Pixhawk с прошивкой 3.3.2, в планере вылезает окошко с выбором MAVLink устройства, выбирают hexacopter-1. Скрипт выполняется, спуск не активируется, фотографии соотвественно не делаются.
- контроллер подвеса подключен через UART к Pixhawk с прошивкой 3.3.2, в планере вылезает окошко с выбором MAVLink устройства, выбираю gimbal. Скрипт выполняется, спуск активируется, фотографии делаются.
OlliW пишет что косяк в ArduCopter, Ренди пишет что OlliW разбирается со storm32, но похоже все заняты другими делами =)
(далее могу путаться в терминах ардукоптеровых, времени нет разбираться и тестить, прошу понять и исправить)
Код работы со спуском (github.com/diydrones/ardupilot/…/AP_Camera.cpp) отправляет верную команду MAV_CMD_DO_DIGICAM_CONTROL на выполнение всем mavlink устройствам в роутинге: GCS_MAVLINK::send_to_components(). Затем в github.com/diydrones/…/MAVLink_routing.cpp всё это добро проходит почти на все устройсва из массива route:
void MAVLink_routing::send_to_components(const mavlink_message_t* msg)
{
bool sent_to_chan[MAVLINK_COMM_NUM_BUFFERS];
memset(sent_to_chan, 0, sizeof(sent_to_chan));
// check learned routes
for (uint8_t i=0; i<num_routes; i++) {
if ((routes[i].sysid == mavlink_system.sysid) && !sent_to_chan[routes[i].channel]) {
if (comm_get_txspace(routes[i].channel) >= ((uint16_t)msg->len) + MAVLINK_NUM_NON_PAYLOAD_BYTES) {
...
_mavlink_resend_uart(routes[i].channel, msg);
sent_to_chan[routes[i].channel] = true;
}
}
}
}
Предполагаю что где то в условиях не проходит проверка подвеса по условиям и ему MAV_CMD_DO_DIGICAM_CONTROL не уходит.
Что посоветуют ковыряющие код?
UPD: Что такое routes[i].sysid == mavlink_system.sysid - это то что выбирает MissionPlanner?
в планере вылезает окошко с выбором MAVLink устройства, выбирают hexacopter-1.
вы посылаете мавлинк команду не гимбалу а коптеру. коптеру пофиг. он ведь не гимбал, зачем ему читать из сети чужие пакеты
представьте - мавлинк - это сеть.
гимбал, коптер, мишен планер - узлы сети
указывая получателя пакета вы отправяете команду на конкретный узел.
если не ошибаюсь есть и общая посылка на номер 255
логично =( тогда совершенно не понятно как например в миссии задать каманду именно гимбалу и почему команда не шлется гимбалу при шутере от пульта (когда servo или relay), хотя там как раз продкастная рассылка по идее идет на все устройва из массива routed.
У меня предположение что строка routes[i].sysid == mavlink_system.sysid как раз и не пропускает команду дальше коптера, похоже надо искать как это всё дебажить… или ftdi в разрыв провода на гимбал ставить и слушать какие команды лезут.
А вообще в AP_Mount… идет рассылка конкретно подвесу, вот как бы это всё сделать внутри кода шутера или рассылки, чтобы определенная команда улетала любой ценой в гимбал.
Попробую завтра дописать что-то вроде:
if ((routes[i].sysid == mavlink_system.sysid || (routes[i].mavtype ==MAV_TYPE_GIMBAL && msg->command==MAV_CMD_DO_DIGICAM_CONTROL)) && !sent_to_chan[routes[i].channel]) {
чтобы игорировалось условие, если гимбал и шутер
я не особо подскажу по скриптам мавлинка, но логически если вы хотите сделать управление подвесом не командой телеметрии передаваемой через модем
а функционалом полетника который в определенный момент должен послать команды подвесу - то надо забыть про скрипты мишен планера
тут в целом косяк в том бродкастная рассылка (похоже), в которой команда на шутер, не доходит до гимбала… и я чето не могу осознать код:
// create command long mavlink message
mavlink_command_long_t cmd_msg;
memset(&cmd_msg, 0, sizeof(cmd_msg));
cmd_msg.command = MAV_CMD_DO_DIGICAM_CONTROL;
cmd_msg.param5 = 1;
// create message
mavlink_message_t msg;
mavlink_msg_command_long_encode(0, 0, &msg, &cmd_msg);
// forward to all components
GCS_MAVLINK::send_to_components(&msg);
вся суть в cmd_msg, но не пойму как оно переходить в msg и переходит ли вообще? mavlink_msg_command_long_encode в переменную по ссылке (в сях & по ссылке? или что-то другое?) ничего не пихает, только делает return, т.е. вроде как вывод mavlink_msg_command_long_encode надо чему то присваивать?
UPD: там какая то магиня с копированием памяти, команды cmd_msg перетекают в msg… похоже на какогое наследие старого кода, чтобы не ломать совместимость
Ладно, всё фигня, одни неведомые и неработающие догадки…
Костыль за который должно быть стыдно, но работает:
AP_Camera.h в private секцию:
bool _gimbalcam_search; // try to search gimbal
bool _gimbalcam_initialised; // true once the driver has been initialised
uint8_t _gimbalcam_sysid; // sysid of gimbal
uint8_t _gimbalcam_compid; // component id of gimbal
mavlink_channel_t _gimbalcam_chan; // mavlink channel used to communicate with gimbal.
AP_Camera.cpp в trigger_pic после GCS_MAVLINK::send_to_components(&msg);:
if (!_gimbalcam_search) {
_gimbalcam_search=true;
if (GCS_MAVLINK::find_by_mavtype(MAV_TYPE_GIMBAL, _gimbalcam_sysid, _gimbalcam_compid, _gimbalcam_chan)) {
_gimbalcam_initialised=true;
}
}
if (_gimbalcam_initialised) {
mavlink_msg_command_long_send(_gimbalcam_chan,
_gimbalcam_sysid,
_gimbalcam_compid,
MAV_CMD_DO_DIGICAM_CONTROL,
0,
0,
0,
0,
0, 1, 0,
0);
}
На rcgroups мужик на свой квадрик поставил PX4LITE. Пишет, что доволен. Вот ссылка www.rcgroups.com/forums/showthread.php?t=2557082.
Не знаю, я попробую из герметика силиконового в формочке залить под те изначальные отверстия виброразвязку.
Спрашивал же перед этим у другого продавца, мол сфоткай, чё там внутри - ой, на завод я писать, они ничего не ответить, я сам сложно сломать и тд
Я его когда подключил первый раз без зуммера и провода led - он не хотел подключаться. Потом всё это подсоединил и он издавал 3 длинных 3 коротких не прекращая - всё равно не хотел подключаться, потом прошил и нормально стало. Вроде откалибровал всё, но всё равно пишет про: bad mag position что то
Вроде откалибровал всё, но всё равно пишет про
На rcgroups пишет, что нужно проверять распиновку разъемов, не соответствует как у пикса. Там-же дает пояснения на картинке. Он плату поставил на квадрик без внешней виброразвязки и утверждает, что полет отличный.
Он плату поставил на квадрик без внешней виброразвязки и утверждает, что полет отличный.
Полеуретан мягкий, все-таки виброразвязка. На вид, даже лучше чем у Pixhack (ИМХО). Потому как у того пластиковый короб виброразвязки (я очень надеялся что делают силиконовый), в котором датчики между 2 кусков ППУ.
Пробовать летать, должно все получится!
Если кому надо - выложу сборку под вашу раму, собирать всё (tri,quad,hexa,y6 и прочее) и под все контроллеры (pix* и px4*) пока лениво (хотя надо бы скрипт написать на досуге, чую это на долго).
Мне под квадрокоптер, PIxhawk контроллер обычный (не лайт и тд). Спасибо.
Мне под квадрокоптер, PIxhawk контроллер обычный (не лайт и тд). Спасибо.
“пиксы” различаются на PX4 и Pixhawk, остальное не важно
Вот nekaka.com/d/Z2CSNLW0yO
ArduCopter 3.3.2 для квадрокоптера с исправлениями NMEA протокола для работы с GPS+ГЛОНАСС
как обычно на свой страх и риск (и во вкладке Messages, последняя в MissionPlanner, лучше проверить что именно 3.3.2 и QUAD)
Есть еще вариант с фиксом спуска через ИК через storm32 подвес.
Вылез наконец то полетать с pixlite (goodluckbuy) на y6 раме, которая раньше была с naza.
Как обычно хорошо что отрубил проверку компаса при арминге. Дома всё идельно, пошел на улицу и ошибка компаса на аппе мигает, а в логах неведомая ошибка COMPASS-4 - что это за ошибка не смог найти, в доках только 0,1 или 2.
Полет был сугубо тестовый (летает ли вообще), компас откалибровал абы как - немного туалетил, сторон света по карте врал градусов на 5…10.
Офсеты основного компаса: -89 -20 -14. Офсеты встронного… кхм… 163 -241 -157.
Кто расскажет что за COMPASS-4 ошибка и что с ней делать?
4 код это похоже unhealthy =( И что это вдруг с ним случилось что он не здоров?
Судя по логам отключился основной компас (нули по всем осям), который на палке в ГПС модуле. Странно что дома работает. Буду проверять провод.
Дома всё идельно, пошел на улицу…
Со мной такое почти постоянно )))). Дома гоняешь пока не надоесть-все идеально,но стоит выйти на улицу-начинается невероятное )).
может кто знает почему от пиксхака, ппм энкодер при подключении мигает красный светодиод и не питает приемник от аппаратуры?
Там же запаивать надо перемычку
Какую там перемычку?
правая картинка нижний левый угол sj1
замкнул и сгорел с искарми и дымом 😁😃
замкнул и сгорел с искарми и дымом 😁😃
странно , у меня все питало , разводка похожа на эту только цвет платы синий был , но перемычка там одна