Mavros: Toque uma música via MAVCMD

Criado em 10 jun. 2019  ·  15Comentários  ·  Fonte: mavlink/mavros

Estou tentando tocar uma música por meio do comando rosrun:
rosrun mavros mavcmd 258 0 0 0 0 0 0 0

alguém sabe quais parâmetros eu preciso enviar?


Versão e plataforma MAVROS

ROS: melódico
Ubuntu: 16.04

Tipo e versão do piloto automático

[] ArduPilot
[x] PX4

Versão: 3.7.1

question

Todos 15 comentários

MAV_CMD não tem esse comando.

Se você deseja enviar PLAY_TUNE , você deve escrever um plugin.

Pergunta básica: agora que o plugin existe ( veja este pedido de pull - obrigado @mortenfyhn), qual seria a maneira mais direta de tocar uma música simples via mavros?

Estou no ROS noetic, Ubuntu 20.04, ArduSub 4.0.2 no Pixhawk1. A campainha está conectada e toca algo quando o pixhawk é iniciado. Mas não consigo fazer com que ele toque mais nada depois disso.

eu tentei
roslaunch mavros apm.launch fcu_url:=udp://:[email protected]:14549
e quando eu faço
rostopic echo /mavros/state
ele mostra mensagens regulares, portanto, estou bastante confiante de que a conexão funcionou.
Porém, quando eu tento
rostopic pub -1 /mavros/play_tune mavros_msgs/PlayTuneV2 "format: 2 tune: '>e16e8e16r16c16e8g4<g4'"
nada acontece.

Sinto que estou perdendo uma etapa básica crucial. Qualquer indicação na direção certa seria apreciada. Eu ainda estou aprendendo.

Não se preocupe, o que está faltando pode ser apenas habilitar o plugin play_tune. Ao iniciar o mavros, você obtém uma longa lista de plug-ins dizendo plug-in carregado / lista negra / semelhante? Ele informa quais plug-ins estão ativados. Você pode adicionar o plugin play_tune ao arquivo de configuração apm_pluginlists.yaml que é lido por apm.launch . Esperançosamente, isso resolve tudo.

Obrigado pela sua resposta rápida!

Sim eu entendo
[ INFO] [1620733606.153262125]: Plugin play_tune loaded
[ INFO] [1620733606.155413105]: Plugin play_tune initialized

apm_pluginlists.yaml tem esta aparência:

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_*'

Isso é estranho. Você tem QGroundControl ou algo semelhante em execução? Você pode usar seu "inspetor mavlink" para verificar se está vendo a mensagem mavlink PLAY_TUNE_V2. Além disso, acho que os outros mantenedores podem ser mais adequados para descobrir isso.

Oh, interessante, não aparece no QGC.

qgc_mavlink_messages

Parece que primeiro preciso descobrir o que está errado aqui. Talvez seja um problema com o ArduSub.

Oh e muito obrigado pelo seu tempo :-)

Pode ser que não apareça no QGC mesmo quando funciona, quando penso nisso. A mensagem pode ir direto para o pixhawk, e o pixhawk pode não passá-la para o QGC.

@mortenfyhn PLAY_TUNE vai direto para o link FCU, então é improvável que o veja no GCS, exceto se o firmware o direcionar de volta.
Infelizmente não é fácil capturar essa mensagem no mavros v1, apenas se você colocar algo entre o FCU e o MAVROS para capturar os pacotes.

Hmm, você poderia tentar construir o plugin Wireshark para inspecionar os dados (mas eu realmente não sei se ainda está funcionando ou não).
E como estamos lidando com firmware de código aberto, poderíamos ver se o ArduSub aceita essa mensagem ou não :)

Interessante saber, obrigado por investigar!

Existe uma maneira (amigável para iniciantes) de contornar esse problema?
Posso ajudar em alguma coisa e onde seria o lugar mais eficaz para fazer a mudança?

Provavelmente, posso estender o plug-in para oferecer suporte a mensagens PLAY_TUNE simples. @vooon , qual é a política para mudanças de API? Estou tentado a criar um novo assinante, então o plugin lê ~play_tune para mavros_msgs / PlayTune -> mavlink PLAY_TUNE e ~play_tune_v2 para mavros_msgs / PlayTuneV2 -> mavlink PLAY_TUNE_V2. Mas isso quebrará a API antiga, que usa ~play_tune para mensagens v2.

Como alternativa, posso adicionar um parâmetro que determina se ele espera mensagens v1 ou v2 em ~play_tune e emitirei a mensagem mavlink correspondente.

@mortenfyhn, já que estamos no estágio 1.0, prefiro manter a API existente.
Além disso, o usuário não deve se preocupar com a versão da bruxa da mensagem enviada, então eu prefiro adicionar o parâmetro mais a detecção.

Algo parecido:

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, já que estamos no estágio 1.0, prefiro manter a API existente.

: +1:

Farei mais ou menos como você sugere:

  • Adicione um parâmetro.
  • Se não estiver definido, manterá o comportamento existente.
  • Se definido para especificar v1 / v2, use isso.
  • Se não estiver definido e m_uas->is_ardupilotmega() == true , use v1.

Sim, também acho que pode usar 0 == auto (v1 para APM / v2 para outros).

Ah, também devemos simplesmente converter PlayTuneV2.msg em PLAY_TUNE.
É necessário verificar esse formato == MML (implementação de APM) e, em seguida, fazer algo assim (pseudocódigo):
`` `
PLAY_TUNE pt {};

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

Esta página foi útil?
0 / 5 - 0 avaliações