2016-03-29 18 views
0

Matkapa bağlı bir sensörüm var. Sensör, yönlendirme rulosunda ve adımda yönlendirme verir. Bunlardan anlatabildiğim kadarıyla bu sırayla içsel dönüşler. Sensörün Y ekseni, matkap ucunun uzunlamasına eksenine paraleldir. Sensörden bir dizi çıkış almak ve son yönelimden yönlendirmede maksimum değişikliği bulmak istiyorum.İki set Rulo ve Yaw açıları arasındaki açıyı bulmam gerekiyor

Matkap ucu aralık ekseni etrafında döneceğinden, ihmal edilebileceğine inanıyorum. Ben, onların vektörleri var v ve vf diyoruz kez

ilk düşüncem sahası varsayarak birim vektörlere başlık and roll dönüştürmek çalışmak olacaktı 0'dır, aralarındaki açı (

Θ = arccos olurdu v. vf)

Python'un belirli bir yönelim kümesi için calcu değerini hesaplaması ve en büyük çıkıntıyı çekmesi için, bu yöntem oldukça düz olmalıdır.

Sorum şu; python kullanarak bunu yapmak için daha basit bir yol var mı, ve eğer bu içsel dönüşleri birim vektörlere dönüştürmenin en etkili yolu değilse. Tüm birimler vektörleri

+0

Kendiniz herhangi bir kod denediniz mi? – Deusdeorum

+0

@Hugo - Henüz değil. Kodlamaya başlamadan önce matematik sıralamasını almak istedim. Bu şekilde biliyorum doğru yönde çalışıyorum. – Richard

+0

Bu gibi birim vektörlerini alabileceğime inanıyorum: x = cos (yaw) * cos (roll), y = sin (yaw) * cos (roll) ve z = sin (roll) – Richard

cevap

1

Küresel trigonometrinin size yardımcı olacağını düşünüyorum. https://en.wikipedia.org/wiki/Spherical_trigonometry https://en.wikipedia.org/wiki/Haversine_formula#The_law_of_haversines

seni doğru anladıysam, fonksiyonlar aşağıda hile yapmak gerekir:

double AngleBetweenRollPitch(double roll1, double pitch1, double roll2, double pitch2) { 
    return SphericalSideFromSidesAndIncludedAngle(pitch1, pitch2, roll2 - roll1); 
} 
double SphericalSideFromSidesAndIncludedAngle(double b, double c, double alpha) { /* the Law of haversines */ 
    return archaversin(haversin(b - c) + sin(b) * sin(c) * haversin(alpha)); 
} 
double SphericalAngleBetweenTwoLongLats(double long0, double lat0, double long1, double lat1) { 
    return archaversin(haversin(lat1 - lat0) + cos(lat0) * cos(lat1) * haversin(long1 - long0)); 
} 
double haversin(double x) { 
    x = sin(x * .5); 
    x *= x; 
    return x; 
} 
double archaversin(double x) { 
    if  (x >= 1.) x = M_PI * .5; 
    else if (x <= 0.) x = 0.; 
    else    x = asin(sqrt(x)) * 2.; 
    return x; 
} 

iki sahaları küresel üçgenin kenarları vardır ve delta rulo aralarındaki açıdır. Kalan tarafı hesaplamak için, haversines yasasını kullanıyoruz. Bir yaw-pitch kullanarak oryantasyonları belirtmeniz durumunda, açıların uzun bir parametrelendirmesi için bir çözüm de ekledim.

+0

Bu harika bir yol gibi görünüyor bunun için gitmek. Uzun süren karakterizasyon hakkında biraz daha fazla detay verebileceğinizi umuyordum. Bence eğimli bir oryantasyonda çalışacağım ve boylamlarım benim yatsam olur ve enlemlerim benim sahalarım olur mu? – Richard

+0

nvm, uzun süreli formül mükemmel çalıştı. Algılayıcımın yönüne göre, matkabın adımını rulo olarak etiketliyor. Enlem olarak yuvarlamak ve boylam olarak bükmek, birim-vektör yöntemi ile aynı açı farkını verir, ancak daha az hesaplama ile. – Richard

0

u(1), u(2), ..., u(m), v olduğunu varsayalım. i değerini u(i) ve v arasındaki açıyı en üst düzeye çıkaracak şekilde belirlemek istiyorsunuz. Bu, np.dot(u(i), v)'un en aza indirildiği şekilde i bulmaya eşdeğerdir. Yani satırlar u(i) olan bir matris U varsa, u(i) ve v arasındaki açıya sahip olan i bulmak için i = np.argmin(np.dot(U, v)) yapabilirsiniz.

İlgili konular