Mavros: Mengontrol sumbu Yaw dengan mode "off-board"

Dibuat pada 17 Nov 2016  ·  36Komentar  ·  Sumber: mavlink/mavros

Hai,

Saya mencoba untuk mengontrol semua sumbu quad-copter. Meskipun saya dapat mengontrol sumbu x,y, dan z, saya tidak dapat mengetahui cara mengontrol sumbu x. Saya mencoba banyak kombinasi kode dan juga mencari di internet beberapa kali, dan akhirnya mencoba menggunakan 2 topik berbeda: satu untuk mengendalikan x,y,z , dan yang lainnya untuk mengendalikan yaw, tapi saya masih tidak bisa mengendalikan yaw. Ini adalah kode saya sejauh ini:

//use mavros/setpoint_raw/local to control x,y,z
local_t_pos_pub = n.advertise<mavros_msgs::PositionTarget>("mavros/setpoint_raw/local", 10);
//use mavros/setpoint_position/local to control YAW 
local_yaw_pub = n.advertise<geometry_msgs::PoseStamped>("mavros/setpoint_position/local", 10);
.
.
.
bool QNode::move(double m_x,double m_y,double m_alt,double m_yaw) {

    if (!master_connected) return false;

    mavros_msgs::PositionTarget targetMsg;
    targetMsg.coordinate_frame = mavros_msgs::PositionTarget::FRAME_BODY_OFFSET_NED;
    targetMsg.header.frame_id = "aircraft";
    targetMsg.type_mask = mavros_msgs::PositionTarget::IGNORE_AFX |
                          mavros_msgs::PositionTarget::IGNORE_AFY |
                          mavros_msgs::PositionTarget::IGNORE_AFZ ;
                            //do not ignore yaw
                          //mavros_msgs::PositionTarget::IGNORE_YAW |
                            // mavros_msgs::PositionTarget::IGNORE_YAW_RATE;
    targetMsg.header.stamp = ros::Time::now();
    targetMsg.position.x = m_x;
    targetMsg.position.y = m_y;
    targetMsg.position.z = m_alt;
    targetMsg.yaw = 30; //doesn't effect anything
    targetMsg.yaw_rate = 5; //doesn't effect anything
    local_t_pos_pub.publish(targetMsg);

    geometry_msgs::PoseStamped msg;
    msg.header.stamp=ros::Time::now();
    //msg.header.frame_id = "map";
    //msg.pose.position.x= m_x;
    //msg.pose.position.y= m_y;
    msg.pose.position.z=m_alt;
    //mavros wiki says that for this kind of msg, only YAW is extracted,
    //but next line doesn't effect anything:
    msg.pose.orientation= tf::createQuaternionMsgFromYaw(m_yaw);
    local_yaw_pub.publish(msg);
    std::cout << m_yaw << std::endl;
return true;
}

Karena saya cukup banyak terjebak, bantuan apa pun akan sangat bagus.
Terima kasih kepala!

question

Semua 36 komentar

http://mavlink.org/messages/common#SET_POSITION_TARGET_LOCAL_NED

Anda juga harus menambahkan bit abaikan kecepatan, yaw dalam radian , yaw_rate adalah radian/second .
Jangan mencampur topik setpoint_raw dengan setpoint lainnya. Kirim saja mavros_msgs/PositionTarget

Terima kasih atas replay cepatnya.
Saya sekarang bisa mengendalikan yaw, tapi sepertinya tidak bergerak seperti yang saya harapkan.
Saya memberinya makan dengan derajat yang kemudian diterjemahkan ke rad di dalam kode saya.
Ketika saya mengirim pesan, saya mengharapkan 1 dari 2 hal terjadi:

  1. Quad copter yawing X derajat ke kanan/kiri
  2. Quad copter yawing ke arah magnet X
    Tak satu pun dari hal di atas terjadi. Sepertinya quad menganga ke beberapa arah acak setiap kali saya mengirim pesan. Ini adalah kode saya yang diperbarui:
//publisher
_xyzPub = nodeHandle.advertise<mavros_msgs::PositionTarget>("mavros/setpoint_raw/local", 10);
.
.
.
mavros_msgs::PositionTarget moveMsg;
moveMsg.coordinate_frame = mavros_msgs::PositionTarget::
                                                FRAME_BODY_OFFSET_NED;
moveMsg.type_mask =mavros_msgs::PositionTarget::IGNORE_AFX | 
                                     mavros_msgs::PositionTarget::IGNORE_AFY | 
                                     mavros_msgs::PositionTarget::IGNORE_AFZ |
                                     mavros_msgs::PositionTarget::IGNORE_VX  | 
                                     mavros_msgs::PositionTarget::IGNORE_VY  | 
                                     mavros_msgs::PositionTarget::IGNORE_VZ

moveMsg.header.stamp = ros::Time::now();
        moveMsg.position.x = x;
        moveMsg.position.y = y;
        moveMsg.position.z = z;
        moveMsg.yaw = yaw * 0.0174532925; //DEG to RAD
        moveMsg.yaw_rate = 1; 
        _xyzPub.publish(moveMsg);

Terima kasih lagi

Saya memiliki masalah yang sama!

Firmware apa yang digunakan? Versi: kapan?

Saya tidak yakin bahwa koordinat_bingkai benar-benar digunakan, dan perbaiki ke FRAME_LOCAL_NED.

Saya senang melihat saya bukan satu-satunya. Mungkin kita berada di bug nyata di sini.
@vooon , ketika saya menggunakan FRAME_LOCAL_NED yaw tidak berfungsi, dan juga pergerakannya relatif terhadap koordinat timur laut, dan bukan xy seperti yang saya inginkan. Jadi saya harus menggunakan koordinat_frame dan mengaturnya ke FRAME_BODY_OFFSET_NED untuk mendapatkan gerakan di xy.
Saya menggunakan versi terbaru dari MavProxy untuk menguji kode saya.

@vooon Pembaruan px4 terakhir saya adalah dari 29 September. Apakah Anda tahu ada perubahan besar baru-baru ini yang akan memengaruhi kontrol sikap? Saya tidak menggunakan MavProxy. Saya hanya menggunakan mavros/gazebo

Ini adalah dokumentasi pesan: http://docs.ros.org/jade/api/mavros_msgs/html/msg/PositionTarget.html
Menurut Anda bingkai apa yang harus kita gunakan di sini?

Ada tips?

@vooon Saya tidak tahu apakah ini bagian dari masalah, tetapi: Saya menerbitkan topik ini: /mavros/setpoint_raw/local

/mavros/setpoint_raw/target_local menunjukkan bahwa yaw_rate yang diperintahkan adalah -0.0 meskipun saya mengaturnya menjadi >0 (saya mencoba berbagai angka dan sepertinya tidak ada yang berhasil)
Selain itu saya memerintahkan type_mask menjadi 504 (mengabaikan semua perintah percepatan + kecepatan) tetapi type_mask di /mavros/setpoint_raw/target_local adalah 0
Tapi posisi yang diperintahkan dan yaw memang muncul sebagai benar...

Plugin mentah Mavros benar-benar hanya mendukung FRAME_LOCAL_NED, karena konversi bingkai dilakukan untuk ENU-NED lokal.
Mavros selalu menggunakan frame ENU, meskipun konstanta adalah "_NED". Itu mungkin membingungkan, tetapi itu dilakukan untuk mencocokkan enum MAVLink (di sini LOCAL_ENU, yang tidak didukung oleh FCU yang dikenal).

Jadi tempat berikutnya adalah sumber firmware, sebagai tempat di mana semua loopback.

@vooon Haruskah saya membalik perintah yaw I menjadi ENU? Atau itu dilakukan di firmware? Saya benar-benar bingung, dan saya perhatikan bahwa yaw yang saya perintahkan vs yaw yang digunakan helikopter tampaknya diimbangi oleh 90 derajat ...

@vooon saya mencari di sini: http://docs.ros.org/indigo/api/mavros/html/mavros__uas_8h_source.html

00601         static inline double transform_frame_yaw_enu_ned(double yaw) {
00602                 return transform_frame_yaw(yaw);
00603         }
00604 
00608         static inline double transform_frame_yaw_ned_enu(double yaw) {
00609                 return transform_frame_yaw(yaw);
00610         }

Keduanya memanggil fungsi yang sama.

Selain itu, di sini: http://docs.ros.org/indigo/api/mavros/html/setpoint__raw_8cpp_source.html
yaw ditransformasikan menggunakan fungsi-fungsi itu ...

Bingkai standar ROS adalah ENU. Saya tidak yakin sekarang bahwa fungsi ned-enu benar.
Tapi coba versi Kinetic dulu. Indigo beku.

@vooon Saya perlu menggunakan indigo (untuk kompatibilitas dengan paket lain). Apakah ini akan menjadi masalah?

@vooon Saya memeriksa widget MAVLink Inspector saat saya menjalankan node.

Perintah yaw dari mavros identik dengan perintah yaw di MAVLink. Jadi di mana konversi terjadi? Apakah Anda melihat ini / apakah ada masalah dengan cara saya memerintahkan sudut yaw atau bagaimana konversi ENU ke NED dilakukan di firmware?

cc: @eric1221bday

@csorice147 Anda juga dapat menginstal versi 0.18.5 di Indigo, bekerja untuk saya (menggunakan catkin_make_isolated karena MAVLink bukan paket catkin dan mengikuti panduan ini )

@elhayr1 apakah Anda berhasil mengirim perintah laju yaw menggunakan metode Anda di komentar ?

@csorice147 , ternyata kodenya baik-baik saja. Drone yang saya gunakan dalam simulasi gazebo tidak mendukung gerakan yaw

Bisa coba pakai yg iris, support gerakan yaw :D

@elhayrobotican drone mana yang Anda gunakan?
Juga, saya dapat melakukan rotasi yaw sekali melalui penerbitan perintah ke mavros/setpoint_position/local. Namun 100 percobaan berikutnya, tidak berhasil.. Saya tidak tahu apa yang salah / berbeda

@elhayr1 dan @cs147 apakah ini diselesaikan untuk Anda berdua?

Menutup ini karena tidak ada umpan balik. Silakan buka kembali jika diperlukan.

Apakah ada perintah mavlink untuk mengontrol laju yaw?
Terima kasih

@mandelyoni Ya, Anda dapat mengontrol yawrate; tetapi Anda harus mengontrol 4 komponen helikopter: X, Y, Z dan yaw, jika tidak; apa yang harus dilakukan helikopter Anda?

Saya ingin mengontrol semua tingkat sudut dan daya dorong. Saya menutup loop posisi sendiri.
Saat ini saya tidak dapat menemukan perintah yang berfungsi untuk kecepatan yaw.
Ada ide?

@mandelyoni jika Anda ingin mengontrol tarif dan dorongan, Anda dapat menggunakan setpoint_attitude dengan mengirimkan tarif pada pesan geometry_msgs/TwistStamped ke topik cmd_vel dan dorongan dalam mavros_msgs/Thrust pesan ke topik thrust . Topik akan disinkronkan pada plugin setpoint_attitude dan data setpoint dikirim ke FCU dalam pesan SET_ATTITUDE_TARGET .
Pilihan lainnya adalah dengan menggunakan setpoint_raw dengan mengirimkan mavros_msgs/AttitudeTarget pesan ke attitude topik. Tetapi Anda harus menyetel bitmask yang tepat pada pesan, sedangkan plugin setpoint_attitude telah menyetel bitmask untuk mengontrol tarif.

Hai,

Apakah Anda mencoba ini di drone? Dengan Mavros atau Mavlink?
tampaknya PX4 tidak merespon perintah laju yaw baik melalui Mavros maupun Mavlink.

Terima kasih, Yoni.

https://github.com/PX4/Firmware/blob/master/src/modules/mavlink/mavlink_receiver.cpp#L1319 -L1339 Jika Anda melakukan hal yang benar, ini akan berhasil.

TSC21 yang terhormat,

Saya melakukan semuanya sesuai dengan handle_message_set_attitude_target.
Saat mengatur kecepatan pitch dan kecepatan roll, semuanya tampak baik-baik saja (drone terbang ke arah yang diinginkan). Tetapi ketika saya memerintahkan kecepatan yaw, saya tidak menerima tanggapan.
Mohon saran.

Terima kasih, yoni.

@mandelyoni Berikut ini adalah kode relatif terhadap attitude_target pada PX4.

https://github.com/PX4/Firmware/blob/25528a5ae0cc9cbada7c2daa266049f293fe05b0/src/modules/mavlink/mavlink_receiver.cpp#L1218 -L1344

Hai,
Saat mengatur kecepatan pitch dan kecepatan roll, semuanya tampak baik-baik saja (drone terbang ke arah yang diinginkan), ketika saya memerintahkan kecepatan yaw, saya tidak menerima respons. Saya mencoba keduanya melalui Mavlink dan
mavro.
Ada ide?

@mandelyoni tolong berhenti mengirim spam ke daftar masalah. Anda tidak menyelesaikan masalah Anda lebih cepat dengan cara itu.

Halo, Saya juga mencoba untuk mencapai kontrol drone IRIS, dengan mengatur kecepatan tubuh dan perintah dorong melalui topik /mavros/setpoint_raw/attitude , dalam simulasi gazebo menggunakan PX4 SITL dan MAVROS. Sejauh ini saya belum berhasil dan drone terbang tetapi langsung crash.

Setelah melihat dokumentasi dari pesan AttitudeTarget , saya mengerti bahwa topeng yang harus saya atur di bidang type_mask adalah 128 untuk mengabaikan sikap. Adakah yang bisa tolong konfirmasi ini benar?

Sejauh ini saya belum berhasil, meskipun saya dapat mengontrol drone IRIS di simulator RotorS dengan menggunakan pengontrol level rendah saya sendiri (kecepatan rotor) dan pengontrol level tinggi yang sama (dorongan dan laju tubuh) yang saya coba gunakan dengan PX4+MAVROS .

Terima kasih untuk setiap jawaban!

@juanmed Apa input untuk sumbu lainnya? Dalam mode offboard, Anda seharusnya mengirim setpoint penuh.

Sebagai gantinya, gunakan /mavros/setpoint_raw/local, ini akan memungkinkan Anda untuk memberikan kontrol berikut: posisi, kecepatan, percepatan untuk X,Y,Z dan posisi dan kecepatan untuk yaw.
Saya akan mengusulkan Anda untuk menggunakan Vx, Vy, Vz, Vyaw.

Juga, silakan lakukan tes seperti itu dalam simulasi terlebih dahulu. Itu akan menghindari crash.

@AlexisTM Terima kasih atas balasan Anda. Maaf tapi apa yang Anda maksud dengan 'sumbu lain' dan 'setpoint penuh'? Sepertinya saya kehilangan sesuatu.

Aku mengutus AttitudeTarget pesan ke /mavros/setpoint_raw/attitude topik karena saya menggunakan saya kontroler posisi sendiri dan generator lintasan. Saya tidak ingin menetapkan posisi tujuan dan membiarkan drone terbang dengan sendirinya di sana tetapi benar-benar terbang melalui jalur yang dihitung sendiri.

Dan saya melakukan semua ini dalam simulasi di gazebo menggunakan PX4 SITL. Terima kasih atas sarannya.

@juanmed Hai, apakah ini berarti Anda memiliki masalah saat menjalankan mavros_controllers ? Pertanyaan yang Anda ajukan tampaknya diterapkan di geometric_controller . Saya menanyakan ini karena saya tahu bahwa Anda menggunakan paket.

@Jaeyoung-Lim Terima kasih atas balasan Anda. mavros_controllers bekerja dengan sempurna dan telah menjadi referensi yang sangat bagus. Ini adalah implementasi saya, di mana saya menggunakan pengontrol yang berbeda, yang tidak berfungsi dengan lancar.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat