Mavros: Слушайте мелодию через MAVCMD

Созданный на 10 июн. 2019  ·  15Комментарии  ·  Источник: mavlink/mavros

Я пытаюсь сыграть мелодию с помощью команды rosrun:
rosrun mavros mavcmd 258 0 0 0 0 0 0 0

кто-нибудь знает, какие параметры мне нужно отправить?


Версия и платформа МАВРОС

ROS: мелодичный
Ubuntu: 16.04

Тип и версия автопилота

[] ArduPilot
[x] PX4

Версия: 3.7.1

question

Все 15 Комментарий

MAV_CMD не имеет такой команды.

Если вы хотите отправить PLAY_TUNE , вам нужно написать плагин.

Вопрос новичка: теперь, когда плагин существует ( см. Этот запрос на включение - спасибо @mortenfyhn), что было бы наиболее простым способом воспроизвести простую мелодию через mavros?

Я использую ROS noetic, Ubuntu 20.04, ArduSub 4.0.2 на Pixhawk1. Зуммер подключен и что-то играет при запуске pixhawk. Но после этого я не могу заставить его играть что-либо.

я пытался
roslaunch mavros apm.launch fcu_url:=udp://:[email protected]:14549
и когда я это сделаю
rostopic echo /mavros/state
он показывает обычные сообщения, поэтому я вполне уверен, что соединение работает.
Однако когда я пытаюсь
rostopic pub -1 /mavros/play_tune mavros_msgs/PlayTuneV2 "format: 2 tune: '>e16e8e16r16c16e8g4<g4'"
Ничего не произошло.

Я чувствую, что упускаю важный базовый шаг. Приветствуется любой указатель в правильном направлении. Я до сих пор учусь.

Не беспокойтесь, возможно, вам не хватает только включения плагина play_tune. Когда вы запускаете mavros, получаете ли вы длинный список плагинов, в котором говорится, что плагин загружен / занесен в черный список / похож? Он сообщает вам, какие плагины включены. Вы можете добавить плагин play_tune в конфигурационный файл apm_pluginlists.yaml который читается apm.launch . Надеюсь, это решит проблему.

Спасибо за быстрый ответ!

Да я получаю
[ INFO] [1620733606.153262125]: Plugin play_tune loaded
[ INFO] [1620733606.155413105]: Plugin play_tune initialized

apm_pluginlists.yaml выглядит так:

plugin_blacklist:
# common
- actuator_control
- ftp
- safety_area
- hil
# extras
- altitude
- debug_value
- image_pub
- px4flow
- vibration
- vision_speed_estimate
- wheel_odometry

plugin_whitelist: []
#- 'sys_*'

Это странно. У вас работает QGroundControl или что-то подобное? Вы можете использовать его «инспектор mavlink», чтобы проверить, видите ли вы сообщение mavlink PLAY_TUNE_V2. Кроме того, я думаю, что другие специалисты по сопровождению могут лучше разобраться в этом.

О, интересно, это не отображается в QGC.

qgc_mavlink_messages

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

О, и большое спасибо за ваше время :-)

Может случиться так, что он не будет отображаться в QGC, даже когда он работает, когда я думаю об этом. Сообщение может идти прямо в pixhawk, а pixhawk не может передать его QGC.

@mortenfyhn PLAY_TUNE напрямую переходит к каналу FCU, поэтому вряд ли его можно будет увидеть на GCS, за исключением случаев, когда прошивка направляет его обратно.
К сожалению, захватить это сообщение в mavros v1 непросто, только если вы поместите что-то между FCU и MAVROS для перехвата пакетов.

Хм, вы можете попробовать создать плагин Wireshark для проверки данных (но я действительно не знаю, работает он до сих пор или нет).
И поскольку мы имеем дело с прошивкой с открытым исходным кодом, мы могли бы пойти и посмотреть, принимает ли ArduSub это сообщение или нет :)

Интересно знать, спасибо за расследование!

Есть ли способ (удобный для новичков) обойти эту проблему?
Могу ли я чем-нибудь помочь и где лучше всего внести изменения?

Я, вероятно, смогу расширить плагин для поддержки простых сообщений PLAY_TUNE. @vooon , какова политика изменения API? У меня возникает соблазн создать нового подписчика, поэтому плагин читает ~play_tune для mavros_msgs / PlayTune -> mavlink PLAY_TUNE и ~play_tune_v2 для mavros_msgs / PlayTuneV2 -> mavlink PLAY_TUNE_V2. Но это сломает старый API, который использует ~play_tune для сообщений v2.

В качестве альтернативы я могу добавить параметр, который определяет, ожидает ли он сообщений v1 или v2 на ~play_tune , и я выведу соответствующее сообщение mavlink.

@mortenfyhn, поскольку мы на стадии 1.0, я бы предпочел сохранить существующий api.
Также пользователь не должен заботиться о том, что версия сообщения отправлена, поэтому я бы предпочел добавить параметр плюс обнаружение.

Что-то подобное:

void connection_cb() {
  int new_ver = 0
  if (nh.getParam("message_version", new_ver) {
    // check 1 vs 2
  } 
  if (new_ver == 0) {
    new_ver = m_uas->is_ardupilotmega() ? 1 : 2;
  }

  message_version = new_ver;
}

@mortenfyhn, поскольку мы на стадии 1.0, я бы предпочел сохранить существующий api.

: +1:

Я сделаю примерно так, как вы предлагаете:

  • Добавьте параметр.
  • Если не установлено, сохранить существующее поведение.
  • Если установлено значение v1 / v2, используйте это.
  • Если не задано и m_uas->is_ardupilotmega() == true , используйте v1.

Да, я также думаю, что можно использовать 0 == auto (v1 для APM / v2 для других).

Ах, также, мы должны просто преобразовать PlayTuneV2.msg в PLAY_TUNE.
Необходимо проверить этот формат == MML (реализация APM), а затем сделать что-то вроде этого (псевдокод):
`` ''
PLAY_TUNE pt {};

mavlink :: set_string (pt.tune, tune-> tune);
mavlink :: set_string_z (pt.tune2, tune-> tune [pt.tune.size ():]);
``

Была ли эта страница полезной?
0 / 5 - 0 рейтинги