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?
ROS: melódico
Ubuntu: 16.04
[] ArduPilot
[x] PX4
Versão: 3.7.1
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.
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 :)
E:
E:
Então: FW quer PLAY_TUNE, o plugin envia PLAY_TUNE_V2.
Acho que precisamos adicionar a seleção de mensagens com base no tipo de AP.
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:
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 ():]);
``