Я пытаюсь сыграть мелодию с помощью команды rosrun:
rosrun mavros mavcmd 258 0 0 0 0 0 0 0
кто-нибудь знает, какие параметры мне нужно отправить?
ROS: мелодичный
Ubuntu: 16.04
[] ArduPilot
[x] PX4
Версия: 3.7.1
Вопрос новичка: теперь, когда плагин существует ( см. Этот запрос на включение - спасибо @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.
Похоже, сначала мне нужно выяснить, что здесь не так. Возможно, это проблема с ArduSub.
О, и большое спасибо за ваше время :-)
Может случиться так, что он не будет отображаться в QGC, даже когда он работает, когда я думаю об этом. Сообщение может идти прямо в pixhawk, а pixhawk не может передать его QGC.
@mortenfyhn PLAY_TUNE напрямую переходит к каналу FCU, поэтому вряд ли его можно будет увидеть на GCS, за исключением случаев, когда прошивка направляет его обратно.
К сожалению, захватить это сообщение в mavros v1 непросто, только если вы поместите что-то между FCU и MAVROS для перехвата пакетов.
Хм, вы можете попробовать создать плагин Wireshark для проверки данных (но я действительно не знаю, работает он до сих пор или нет).
И поскольку мы имеем дело с прошивкой с открытым исходным кодом, мы могли бы пойти и посмотреть, принимает ли ArduSub это сообщение или нет :)
А также:
А также:
Итак: FW хочет PLAY_TUNE, плагин отправляет PLAY_TUNE_V2.
Думаю, нам нужно добавить выбор сообщений по типу AP.
Интересно знать, спасибо за расследование!
Есть ли способ (удобный для новичков) обойти эту проблему?
Могу ли я чем-нибудь помочь и где лучше всего внести изменения?
Я, вероятно, смогу расширить плагин для поддержки простых сообщений 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:
Я сделаю примерно так, как вы предлагаете:
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 ():]);
``