Törmäsin ongelmaan, jossa pitäisi määrittää kallistuskulmat esineelle.
Käytössä on 3-akselinen kiihtyvyysanturi (SCA3000). Anturi antaa digitaalisena kiihtyvyystiedon.
Yritin tavailla mainiota vektori-opasta (https://www.ohjelmointiputka.net/oppaat/opas.
Ongelma on siinä, että miten lasketaan kulmat, kun kallistusta on "joka" suuntaan.. eli anturin antamat asteet ovat esim. X:17,52 Y:41,84 Z:43
asteita vastaavat digitaaliset arvot ovat 301 / 667 / 682.
Miten kallistus X ja Y suunnassa tulisi ilmoittaa.
Kuva (https://www.ohjelmointiputka.net/kuvat/
Onko joku löytänyt jotain laskentakaavoja jostain.. Olen tässä pari päivää googlaillut, mutta vielä ei ratkasua ole löytynyt.
P.S. Onko kuvassa muuten painovirhe?
e = sqrt(a^2 + b^2 + c^2)
pitäskö olla näin?
e = sqrt(a^2 + b^2 +d^2)
kuten kuvan edellisellä rivilläkin.
MaKeZ-79 kirjoitti:
asteita vastaavat digitaaliset arvot ovat 301 / 667 / 682.
Tuossahan on ihan suoraan asentovektorin komponentit (x1000).
a = 0,301i + 0,667j + 0,682k
Jos ymmärsin mitä haluat oikein, saa noista haluamasi kulmat helposti. Projisoit (poista kolmas komponentti) vektorin ik-tasoon (X) ja jk-tasoon (Y). Loppu on trigonometriaa (arctan).
X = arctan(I/K) = arctan(0,301/0,682) ~ 24 astetta
Y = arctan(J/K) = arctan(0,667/0,682) ~ 44 astetta
|| 0 astetta pystysuora, -90 tai 90 astetta vaakasuora, huomioi mahdolliset nollalla jakamiset
PS. on
Kun jaetaan kiertokulmaa komponentteihin (kierroksi x- ja y-akselien suhteen), ollaan aika vaarallisella alueella, koska asiat eivät ole aivan yksiselitteisiä. L2-K2:n laskemat kulmat ovat juuri projektion kulmia, joilla ei sinänsä ole suoraa yhteyttä lopulliseen tilanteeseen, jos ajatellaan asiaa siltä kannalta, miten pystysuoraa vektoria pitäisi kääntää, jotta siitä saisi tuon kallistetun vektorin.
Ensinnäkin täytyy sopia, mikä on pyöritysten järjestys. Jos L2-K2:n laskemista kulmista lähdetään liikkeelle, niin kääntämällä pystysuoraa vektoria ensin x- ja sitten y-akselin ympäri päästään seuraavaan tulokseen:
(x, y, z) = (cos(Y) * sin(X), sin(Y), cos(Y) * cos(X)) = (0,289, 0,699, 0,654)
Toisaalta pyörittämällä ensin y-akselin ja sitten x-akselin ympäri päästään hyvin erilaiseen tulokseen:
(x, y, z) = (sin(X), sin(Y) * cos(X), cos(Y) * cos(X)) = (0,404, 0,640, 0,654)
Oikeaan tulokseen taas päästään luomalla väärän mittainen vektori ja normalisoimalla se:
(x0, y0, z0) = (tan(X), tan(Y), 1) l = sqrt(x0^2 + y0^2 + z0^2) (x, y, z) = (x0 / l, y0 / l, z0 / l) = (0,301, 0,667, 0,682)
Selvitä siis ensin tarkasti, mitä oikeastaan haluat. Luullakseni (tehtävää tuntematta) järkevin vaihtoehto olisi laskea kulma kallistetun ja pystysuoran vektorin välillä ja vektorin suunta vaakatasossa. Ensimmäinen onnistuu pistetulon ja arkuskosinin avulla, jälkimmäinen taas arkustangentin (mieluiten atan2) avulla. Jos XY-taso on vaakataso, kaavat menevät näin:
kierto = atan2(y, x) = 65,7 astetta (x-akselista y-akseliin päin) kallistus = acos(z) = 47,0 astetta (ylhäältä vaakatasoa kohti) x = sin(kallistus) * cos(kierto) y = sin(kallistus) * sin(kierto) z = cos(kallistus)
Voisit vielä vähän kertoa tuosta itse ongelmasta, nimittäin otsikossa ei ainakaan ole mitään järkeä. Ei kiihtyvyyden perusteella voi tehdä päätelmiä kappaleen asennosta.
Metabolix kirjoitti:
Voisit vielä vähän kertoa tuosta itse ongelmasta, nimittäin otsikossa ei ainakaan ole mitään järkeä. Ei kiihtyvyyden perusteella voi tehdä päätelmiä kappaleen asennosta.
Kiihtyvyysmittarit mittaavat sitä voimaa, minkä mittarin sisällä oleva tunnettu "kappale" kohdistaa tukipisteisiinsä. Eli mittari näyttää 0:aa vapaassa pudotuksessa, ja normaalissa 1 g gravitaatiokentässä levossa olevan mittarin antaman vektorin pituus on 1.
Eli nykyisillä kiihtyvyysantureilla tulee pakostikin mitattua asentoa. Sellainen kiihtyvyysanturi, joka ei tekisi näin olisi erittäin kätevä, mutta...
MaKeZ-79 kirjoitti:
P.S. Onko kuvassa muuten painovirhe?
On, korjattu.
Heti ensimmäisenä kiitokset vastauksista, hyvä että jotkut osaa matematiikkaa.
Ite en noihin vektoreihin oo pahemmin tarvinnu törmäillä (vähän 2-ulotteisiin).
Koitan näin aluksi tarkentaa ongelmaa.
Tässä kyseisessä tapauksessa ei esineeseen kohdistu kiertoa (mikäli sen oikein ymmärsin). Seuraava esimerkki varmaan valaisee tilannetta.
esim.
1. Otetaan litran maitopurkki ja asetetaan se pöydälle pystyyn.
2. Maitopurkin pohja pysyy samassa paikassa kokoajan (kallistettaessa kulmat nousevat, mutta yksi kulma pysyy paikallaan).
3. Työnnetään purkin yläreunaa itsestä poispäin, kallistus X:n suuntaan
4. kallistetaan purkkia vasemmalle, kallistus Y:n suuntaan.
Meillä pitäisi olla tilanne, jossa purkin yksi kulma koskettaa pöytää.
Alkutilanteessa näkyvissä ollut purkin kylki näkyy edelleen.
Ainiin, purkin yksi sivu on kiinni laitteessa, joka kallistaa purkkia, joten kiertoa ei Z-akselin suhteen tapahdu.
Ja nyt haluttaisiin tietää, että kuinka paljon purkki on kallellaan X:n ja Y:n suuntaan. Olen jo muutaman kerran maitopurkkia pyöritellyt, mutta vektoreiden suuntien hahmottaminen ei onnistu sitten millään. Z:n suunta on ilmeisestikin lävistäjä (kuvittelin/piirtelin kolmiulotteiden suorakulmion).
Selventikö tämä esimerkki yhtään tätä tilannetta?
Jos kappale on paikallaan, niin anturin pitäisi pystyä kertomaan sen asento suhteessa maan vetovoimaan. Eli siis tuon purkin kallistus. Tehtävähän olisi helppo, jos kallistusta olisi vain esim. X:n suuntaan.
Alkutilanteessa (purkki pystyssä) X=0g, Y=0g ja Z=+1g.
Pitää vielä lopuksi ottaa kalibrointi huomioon, mutta siihen VTI:llä näytti olevan ohjeet.
No tuossa on juuri tuo mainitsemani ongelma, että tulokseksi saadaan eri kulmat sen mukaan, käännetäänkö ensin X- vai Y-suuntaan. Kaiken olennaisen sinänsä jo listasinkin edelliseen viestiin, annetuista vektorien kaavoista saa aika helposti käänteisfunktioilla ratkaistua kulmat: jokaisessa kaavassa jotain vektorin komponenttia koskee vain toinen kulma, joten tämän kulman saa selville suoraan, jolloin toinenkin kulma selviää vaivatta.
Mitä kulmia siis nyt haluat? Jos kertoisit, mitä niillä kulmilla sitten pitää tehdä, niin olisi ehkä mahdollista antaa "oikea" vastaus. Muuten saat itse valita noista aiemmista sopivan ja soveltaa siitä.
Hmm.. tämä taitaakin mennä haasteellisemmaksi.
Kyseessähän on hetkellisen asennon tunnistaminen.
Emme voi tietää missä järjestyksessä kallistukset on tehty.
esim. Pisan torni.. emme voi tietää missä "järjestyksessä" se on kallistunut (oletetaan että se on kallistunut sekä X että Y suuntaan).
Itseasiassa en ole varma, että kuinka kallistus pitäisi ilmoittaa.
Oman käsitykseni mukaan vektoreista pitäisi saada selville X:n ja Y:n (vaakasuuntaiset) komponentit.
Noilla komponenteilla saataisiin selville kallistuksen suuntakin.
Lopullinen idea on saada säädettyä "maitopurkki" täysin suoraan (maanvetovoiman suuntaisesti) niin että Z=1g, X=0g, Y=0g.
Säätöhän onnistuu kyllä vaikkei asteita varsinaisesti tiedettäisikään, mutta asteet pitäisi pystyä kuitenkin näkemään.
Pitänee seuraavaksi koittaa perehtyä lukion vektorilaskentaan... Ois ehkä aikoinaan pitäny sittenkin käydä lukio läpi =S
Ongelmana tässä näyttää olevan se, että kiihtyvyysanturi voi kiertyä "maitopurkin" akselin (z-akseli) ympäri, jolloin maitopurkin asentoa ei voi kuvata (x,y,z)-vektorilla, joka osoittaa maitopurkin pohjan keskeltä sen toiseen päähän. Ainakin MakeZ-79:n maitopurkkikuvauksessa näin tapahtuu, vaikka tämä ei välttämättä ole aivan ilmeistä. Jos kiertoa ei tapahtuisi, niin maitopurkin yksi särmä olisi koko ajan kiinni pöydässä. Jos kiertymistä ei voida välttää, niin kaikkia kulmia ei voi määrittää pelkästä kiihtyvyysanturin lukemasta.
Vaikka mikä tahansa asento on mahdollista esittää sovitussa järjestyksessä tehtyjen kiertojen yhdistelmänä, kappaleen mielivaltaista asentoa kolmessa ulottuvuudessa ei ole aina luontevaa kuvata kiertokulmilla eri akseleiden suhteen, koska, kuten Metabolix sanoi, kiertojärjestys vaikuttaa lopputulokseen ja toisaalta, kuten MakeZ-79 huomasi, kiertojärjestyksen valitseminen ei kaikissa tilanteissa ole mielekästä.
Kappaleen asentoa voi kuvata muunnoksena, joka kiertää kappaleen sovitusta alkuasennosta (maitotölkki pystyssä pöydällä, lehmä suoraan katsojaan päin) tutkittavaan asentoon. Tällaista kiertoa (ortogonaalinen lineaarikuvaus) kuvataan yleensä joko kvaterniolla tai matriisilla. Matriisit ovat matematiikassa ja fysiikassa huomattavasti yleisempiä. Kiertomatriisin voi ajatella matriisiksi, jonka sarakevektorit virittävät kierretyn koordinaatiston. Tässä esityksessä sillä, minkälaisilla xyz-kierroilla tähän on päästy ei ole merkitystä ja myös Pisan kaltevan tornin asento voidaan määrittää jonkin koordinaatiston suhteen (esimerkiksi: x:itä, y:pohjoinen, z:ylöspäin), kunhan sovitaan, mihin suuntaan tornin olisi tarkoitus osoittaa (esim: x:pohjakerroksen keskeltä sisäänkäynnille, y:tästä 90 astetta vastapäivään, z:pohjakerroken keskeltä ylimmän kerroksen keskelle). Kaikki kiertomuunnokset ovat säännöllisiä, joten niille voidaan määrittää vastamuunnos, joka kiertää kappaleen "oikeaan" asentoon.
Jos esinettä oikeasti käännetään jonkinlaisella (esim. kamerajalustan tyyppisellä) laitteella, niin kierrot lasketaan samalla tavalla, kuin se laite kiertää esinettä. Kamerajalustoissa ensin kierretään "y"-akselin suuntaan (kierto, pystykuva-vaakakuva), seuraavaksi "x"-akselin (ylös-alas), viimeisenä "z"-akselin (oikealle-vasemmalle). Akselit voi nimetä myös muulla tavalla.
MaKeZ-79:n kuvaamassa tapauksessa looginen valinta kappaleen asennon kuvaamiseksi on mitata kappaleen akselin ja z-akselin välistä kulmaa (kallistus), xy-tasoon projisoidun akselin ja jonkin sovitun x-akselin välistä kulmaa (suunta) sekä kappaleen kiertymistä oman akselisa suhteen jostakin sovitusta asennosta lukien. Näitä kaikkia ei siis pysty määrittämään kiihtyvyysanturin avulla, vaan esimerkiksi kierto pitää eliminoida, jolloin ongelma palautuu kiihtyvyysvektorin esittämiseen pallokoordinaatistossa.
Mielivaltaiseen suuntaan osoittvan kiihtyvyysanturin (jos "oikeinpäin" oleva kiihtyvyysanturi näyttää x=0, y=0, z=1) ja z-akselin välinen kulma, K
, saadaan jokatapauksessa yksikäsitetisesti "arctan2"-funktiolla:
K = atan2(sqrt(x*x+y*y),z)
.
Jos kierto on varmasti nolla, niin suuntakulma on
S = atan2(y,x)
,
ja se on mitattu vastapäivään siitä "pöydän" tason suunnasta, johon kiihtyvyysanturin x-akseli osoittaa, kun "maitotölkki" on pystyssä pöydällä.
(C-kielen) atan2(x,y)
-funktion määritelmä on:
atan2(y,x)
= arctan(y/x)
, jos x
> 0
atan2(y,x)
= pi + arctan(y/x)
, jos x
< 0 ja y
>= 0
atan2(y,x)
= arctan(y/x)
- pi, jos x
< 0 ja y
< 0
atan2(y,x)
= pi/2, jos x
= 0 ja y
> 0
atan2(y,x)
= -pi/2, jos x
= 0 ja y
< 0
funktiota ei ole määritelty, kun (x,y)
= (0,0)
Kysyin anturin valmistajalta laskukaavoja/ohjeita ja sieltä sain vastauksen, että pienissä kallistuksissa voidaan laskea suoraan X:n ja Y:n kallistus. Virhe jää pienillä kallistuksilla niin vähäiseksi.
Eli siis suoraan
Xinc = asin(X-axel/sensitive)
Ja koska tietokone käyttää mielellään radiaaneja, niin muutetaan radiaanit asteiksi *180 / PI
Minun tapauksessa SCA3000 anturilla
Xinc = asin(X-axel/1000)*180/PI
Tämä tarkkuus saa luvan riittää toistaiseksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.