PIXHAWK PX4 Autopilot еще одна летающая железка

SovGVD

Взываю ковыряющих код.
Задача: заставить контроллер подвеса 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 из соотвествующей ветки

  1. контроллер подвеса подключен через UART и FTDI адаптер к ПК. Скрипт выполняется, спуск активируется, фотографии делаются.
  2. контроллер подвеса подключен через UART к Pixhawk с прошивкой 3.3.2, в планере вылезает окошко с выбором MAVLink устройства, выбирают hexacopter-1. Скрипт выполняется, спуск не активируется, фотографии соотвественно не делаются.
  3. контроллер подвеса подключен через 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?

alexeykozin
SovGVD:

в планере вылезает окошко с выбором MAVLink устройства, выбирают hexacopter-1.

вы посылаете мавлинк команду не гимбалу а коптеру. коптеру пофиг. он ведь не гимбал, зачем ему читать из сети чужие пакеты

представьте - мавлинк - это сеть.
гимбал, коптер, мишен планер - узлы сети
указывая получателя пакета вы отправяете команду на конкретный узел.
если не ошибаюсь есть и общая посылка на номер 255

SovGVD

логично =( тогда совершенно не понятно как например в миссии задать каманду именно гимбалу и почему команда не шлется гимбалу при шутере от пульта (когда 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]) {

чтобы игорировалось условие, если гимбал и шутер

alexeykozin

я не особо подскажу по скриптам мавлинка, но логически если вы хотите сделать управление подвесом не командой телеметрии передаваемой через модем
а функционалом полетника который в определенный момент должен послать команды подвесу - то надо забыть про скрипты мишен планера

SovGVD

тут в целом косяк в том бродкастная рассылка (похоже), в которой команда на шутер, не доходит до гимбала… и я чето не могу осознать код:

// 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… похоже на какогое наследие старого кода, чтобы не ломать совместимость

SovGVD

Ладно, всё фигня, одни неведомые и неработающие догадки…

Костыль за который должно быть стыдно, но работает:

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);
    }
Конструктор

Всем добрый день!

Не могу скачать логи с карточки при подключенной телеметрии.

Смотрю логи вынимая карточку из контроллера.

Как можно скачать логи по телеметрии на комп?

lokanaft

Не знаю, я попробую из герметика силиконового в формочке залить под те изначальные отверстия виброразвязку.

Спрашивал же перед этим у другого продавца, мол сфоткай, чё там внутри - ой, на завод я писать, они ничего не ответить, я сам сложно сломать и тд

Я его когда подключил первый раз без зуммера и провода led - он не хотел подключаться. Потом всё это подсоединил и он издавал 3 длинных 3 коротких не прекращая - всё равно не хотел подключаться, потом прошил и нормально стало. Вроде откалибровал всё, но всё равно пишет про: bad mag position что то

ions
lokanaft:

Вроде откалибровал всё, но всё равно пишет про

На rcgroups пишет, что нужно проверять распиновку разъемов, не соответствует как у пикса. Там-же дает пояснения на картинке. Он плату поставил на квадрик без внешней виброразвязки и утверждает, что полет отличный.

GocMAN
ions:

Он плату поставил на квадрик без внешней виброразвязки и утверждает, что полет отличный.

Полеуретан мягкий, все-таки виброразвязка. На вид, даже лучше чем у Pixhack (ИМХО). Потому как у того пластиковый короб виброразвязки (я очень надеялся что делают силиконовый), в котором датчики между 2 кусков ППУ.
Пробовать летать, должно все получится!

Amelor
SovGVD:

Если кому надо - выложу сборку под вашу раму, собирать всё (tri,quad,hexa,y6 и прочее) и под все контроллеры (pix* и px4*) пока лениво (хотя надо бы скрипт написать на досуге, чую это на долго).

Мне под квадрокоптер, PIxhawk контроллер обычный (не лайт и тд). Спасибо.

SovGVD
Amelor:

Мне под квадрокоптер, PIxhawk контроллер обычный (не лайт и тд). Спасибо.

“пиксы” различаются на PX4 и Pixhawk, остальное не важно

Вот nekaka.com/d/Z2CSNLW0yO
ArduCopter 3.3.2 для квадрокоптера с исправлениями NMEA протокола для работы с GPS+ГЛОНАСС
как обычно на свой страх и риск (и во вкладке Messages, последняя в MissionPlanner, лучше проверить что именно 3.3.2 и QUAD)

Есть еще вариант с фиксом спуска через ИК через storm32 подвес.

SovGVD

Вылез наконец то полетать с pixlite (goodluckbuy) на y6 раме, которая раньше была с naza.
Как обычно хорошо что отрубил проверку компаса при арминге. Дома всё идельно, пошел на улицу и ошибка компаса на аппе мигает, а в логах неведомая ошибка COMPASS-4 - что это за ошибка не смог найти, в доках только 0,1 или 2.
Полет был сугубо тестовый (летает ли вообще), компас откалибровал абы как - немного туалетил, сторон света по карте врал градусов на 5…10.
Офсеты основного компаса: -89 -20 -14. Офсеты встронного… кхм… 163 -241 -157.
Кто расскажет что за COMPASS-4 ошибка и что с ней делать?

4 код это похоже unhealthy =( И что это вдруг с ним случилось что он не здоров?
Судя по логам отключился основной компас (нули по всем осям), который на палке в ГПС модуле. Странно что дома работает. Буду проверять провод.

Мельник
SovGVD:

Дома всё идельно, пошел на улицу…

Со мной такое почти постоянно )))). Дома гоняешь пока не надоесть-все идеально,но стоит выйти на улицу-начинается невероятное )).

lokikolbasa

может кто знает почему от пиксхака, ппм энкодер при подключении мигает красный светодиод и не питает приемник от аппаратуры?

lokikolbasa
lokanaft:

Там же запаивать надо перемычку

Какую там перемычку? У меня отдельно ппм енкодер

Nesenin
lokikolbasa:

Какую там перемычку?

правая картинка нижний левый угол sj1

bawtrik
lokikolbasa:

замкнул и сгорел с искарми и дымом 😁😃

странно , у меня все питало , разводка похожа на эту только цвет платы синий был , но перемычка там одна