Robotik

Quaternion vs Euler Angles

Çalıştığım bir projede hedef pozisyon verirken Quaternion yapısı kullanılıyordu. Quaternion’ların ne işe yaradığı ve neden bazı yerlerde rotasyon değeri olarak Euler Angle değil de Quaternion kullanıldığını merak ettim.

İdeal bir sistemde her bir rotasyon matrisinin, yalnızca tek açıya isabet etmesini isteriz. Sorun şu ki bu matrisler, her zaman için tek açıya tekabül etmeyebiliyor. Aynı matris birden fazla açıya denk gelebiliyor.

“Gimbal Lock” sorunu oluşabiliyor. İki eksenin çakışıp bağımsızlığını yitirmesi. (Buna “Loss of degree of freedom” deniyor.)

Gimbal lock - Wikipedia

Bu sorunun yaşanmaması için Quaternion’lar kullanılıyor. Quaternion’larda Euler açılarına ek olarak 4. bir değer var. Bu değer skaler bir değer. Ve bunun olması, çakışmaları önlüyor.

Bir Quaternion, “a + bi + cj + dk” şeklinde gösterilebilir.

3 vektörel değerin yanındaki skaler değer sayesinde her bir rotasyon matrisi, görüntü kümesinde tek bir açıya işaret ediyor. Ve çakışma sorunu çözülmüş oluyor.

ROS ile çalışırken istediğiniz hedefe gitmek için bir dönüşüme ihtiyacınız olacaktır ve bu çok önemlidir.

Eğer iki boyutlu hareketler yaparken elinizde yaw değeri var ise aşağıda görüldüğü gibi quaternion_from_euler metodunu kullanarak hedef pozisyon için gerekli olan orientation değerlerini elde edebilirsiniz.

from tf.transformations import quaternion_from_euler

# Pose Position
pose_goal.position.x = x_coordinate
pose_goal.position.y = y_coordinate
pose_goal.position.z = z_coordinate

# Pose Orientation
quaternion = quaternion_from_euler(roll_angle, pitch_angle, yaw_angle)

pose.orientation.x = quaternion[0]
pose.orientation.y = quaternion[1]
pose.orientation.z = quaternion[2]
pose.orientation.w = quaternion[3]

tf.transformations.quaternion_from_euler(ai, aj, ak, axes=’sxyz’) burada bizim işimizi görecektir.

Gimbal lock - Wikipedia

Video : https://youtu.be/zjMuIxRvygQ

Örnekler :

Leave a comment