Mavros: Mainkan lagu melalui MAVCMD

Dibuat pada 10 Jun 2019  ·  15Komentar  ·  Sumber: mavlink/mavros

Saya mencoba memainkan lagu melalui perintah rosrun:
rosrun mavros mavcmd 258 0 0 0 0 0 0 0

ada yang tahu params mana yang harus saya kirim?


Versi dan platform MAVROS

ROS: Melodi
Ubuntu: 16.04

Jenis dan versi autopilot

[ ] ArduPilot
[ x] PX4

Versi: 3.7.1

question

Semua 15 komentar

MAV_CMD tidak memiliki perintah seperti itu.

Jika Anda ingin mengirim PLAY_TUNE , maka Anda harus menulis sebuah plugin.

Pertanyaan pemula: sekarang plugin sudah ada ( lihat permintaan tarik ini - terima kasih @mortenfyhn) apa cara paling mudah untuk memainkan lagu sederhana melalui mavros?

Saya menggunakan ROS noetic, Ubuntu 20.04, ArduSub 4.0.2 di Pixhawk1. Buzzer terhubung dan memainkan sesuatu saat pixhawk dimulai. Tapi saya tidak bisa memainkannya setelah itu.

saya telah mencoba
roslaunch mavros apm.launch fcu_url:=udp://:[email protected]:14549
dan ketika saya melakukannya
rostopic echo /mavros/state
itu menunjukkan pesan biasa, jadi saya cukup yakin koneksi berfungsi.
Namun, ketika saya mencoba
rostopic pub -1 /mavros/play_tune mavros_msgs/PlayTuneV2 "format: 2 tune: '>e16e8e16r16c16e8g4<g4'"
tidak ada yang terjadi.

Saya merasa seperti saya kehilangan langkah dasar yang penting. Setiap penunjuk ke arah yang benar akan dihargai. Saya masih belajar.

Jangan khawatir, yang Anda lewatkan mungkin hanya mengaktifkan plugin play_tune. Saat Anda meluncurkan mavros, apakah Anda mendapatkan daftar panjang plugin yang mengatakan plugin dimuat / daftar hitam / serupa? Ini memberi tahu Anda plugin mana yang diaktifkan. Anda dapat menambahkan plugin play_tune ke file konfigurasi apm_pluginlists.yaml yang dibaca oleh apm.launch . Semoga itu menyelesaikannya.

Terima kasih atas balasan cepat Anda!

Ya, saya mengerti
[ INFO] [1620733606.153262125]: Plugin play_tune loaded
[ INFO] [1620733606.155413105]: Plugin play_tune initialized

apm_pluginlists.yaml terlihat seperti ini:

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

Itu aneh. Apakah Anda menjalankan QGroundControl atau yang serupa? Anda dapat menggunakan "inspektur mavlink" untuk memeriksa apakah Anda melihat pesan mavlink PLAY_TUNE_V2. Di luar itu saya pikir pengelola lain mungkin lebih cocok untuk mengetahui hal ini.

Oh, menarik, itu tidak muncul di QGC.

qgc_mavlink_messages

Sepertinya pertama-tama saya harus mencari tahu apa yang salah di sini. Mungkin itu masalah dengan ArduSub.

Oh dan terima kasih banyak atas waktu Anda :-)

Mungkin agar itu tidak muncul di QGC bahkan ketika itu berfungsi, ketika saya memikirkannya. Pesan mungkin langsung ke pixhawk, dan pixhawk mungkin tidak meneruskannya ke QGC.

@mortenfyhn PLAY_TUNE menuju ke tautan FCU, jadi sepertinya tidak akan melihatnya di GCS, kecuali jika firmware
Sayangnya tidak mudah untuk menangkap pesan itu di mavros v1, hanya jika Anda meletakkan sesuatu di antara FCU dan MAVROS untuk menangkap paket.

Hmm, Anda bisa mencoba membangun plugin Wireshark untuk memeriksa data (tapi saya tidak tahu apakah itu masih berfungsi atau tidak).
Dan karena kita berurusan dengan firmware opensource, kita bisa pergi dan melihat apakah ArduSub menerima pesan itu atau tidak :)

Menarik untuk diketahui, terima kasih telah menyelidiki!

Apakah ada cara (ramah pemula) untuk menghindari masalah ini?
Adakah yang bisa saya bantu dan di mana tempat yang paling efektif untuk melakukan perubahan?

Saya mungkin dapat memperluas plugin untuk mendukung pesan PLAY_TUNE biasa. @vooon , apa kebijakan untuk perubahan API? Saya tergoda untuk membuat pelanggan baru, jadi plugin membaca ~play_tune untuk mavros_msgs/PlayTune -> mavlink PLAY_TUNE, dan ~play_tune_v2 untuk mavros_msgs/PlayTuneV2 -> mavlink PLAY_TUNE_V2. Tapi itu akan merusak API lama, yang menggunakan ~play_tune untuk pesan v2.

Atau saya dapat menambahkan parameter yang menentukan apakah ia mengharapkan pesan v1 atau v2 pada ~play_tune , dan saya akan menampilkan pesan mavlink yang cocok.

@mortenfyhn karena kami pada tahap 1.0, saya lebih suka mempertahankan api.
Pengguna juga tidak perlu peduli dengan versi penyihir dari pesan yang dikirim, jadi saya lebih suka menambahkan param plus deteksi.

Sesuatu seperti itu:

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 karena kami pada tahap 1.0, saya lebih suka mempertahankan api.

:+1:

Saya akan melakukan kira-kira seperti yang Anda sarankan:

  • Tambahkan parameter.
  • Jika tidak disetel, pertahankan perilaku yang ada.
  • Jika diatur untuk menentukan v1/v2, gunakan itu.
  • Jika tidak disetel, dan m_uas->is_ardupilotmega() == true , maka gunakan v1.

Ya, juga saya pikir tidak apa-apa menggunakan 0 == auto (v1 untuk APM / v2 untuk yang lain).

Ah, juga, kita cukup mengonversi PlayTuneV2.msg ke PLAY_TUNE.
Perlu memeriksa format itu == MML (implementasi APM), lalu lakukan sesuatu seperti itu (kode semu):
```
PLAY_TUNE poin{};

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

trishantroy picture trishantroy  ·  10Komentar

y22ma picture y22ma  ·  7Komentar

L4ncelot picture L4ncelot  ·  5Komentar

mohand150 picture mohand150  ·  5Komentar

lucaspenna00 picture lucaspenna00  ·  7Komentar