Start

Förstasidan
Statistik

Social robot

Robotens syn
Modell/simulator
Levande modell


Arduino

Starta upp Arduino
DCcduino UNO
Pro Mini

Raspberry pi

Om Raspberry

Pic32

Om Pic32
Konstruktionen
Praktisk kom-igång
Starta upp UBW32
Installera MPLAB
Rinnande ljus
Stegmotor
Display
RS232 Pic32 - terminal
Luffarschack

Servo

Överblick
Isärmonterat servo
Styrning av servo
Mini Maestro
Bygga ett servo

Elektronik

Open Collector
Kontaktstuds
Drivsteg på utgångarna
Halleffektsensor/switch
MLX90316 (halleffekt)
Pulsbreddsmodulering

Open CV

Om OpenCV

Matematik

Linjär algebra
Olinjär länkmekanism

Linjär algebra
robot
Nytta
Om man har en robot med många leder som rör sig i 3 dimensioner behöver man en vettig matematik i botten för att kunna räkna ut saker och ting, en modell av roboten helt enkelt. Här kommer poängen med linjär algebra in i bilden. Linjär algebra gör det möjligt att knappa in en modell av roboten, robotarmen, robothuvudet eller vad det nu handlar om, i form av begripbara vektorer i ett 3D -rum. En modell vilken man sedan kan snurra och studera lite som man vill. Man kan sedan implementera funktioner för att röra de olika lederna och får både en simulator och kod för robotens rörelser på samma gång. Jag har här implementerat en egen motor (se exempel för den levande roboten, observera dock att webbsidans javascript är en "hackversion" av orginalet) för att den skall bli optimalt kompakt och snabb. Men det finns robotbibliotek där ute som implementerar möjligheten skapa vektormodeller.

Projicera en 3D-värld på ett plan i 2 dimensioner
Linjär algebra kan man använda för att exempelvis skapa 3D-grafik men det kan också användas för att ge roboten en mer komplett och begriplig modell av sig själv. Det blir sedan enklare att räkna ut servorörelser m.m.

Javascript, Canvas och Linjär algebra
För att exemplificera diverse matematiska samband använder jag canvas -objektet och javascript. Canvas är ett objekt (en "målarduk") på vilket man kan rita linjer och annat och presentera i webbläsaren.

Nedan följer en ultrakompakt sammanfattning hur man skapar 3D-grafik med linjär algebra. rotera matris

Kanske först ska nämna att allting finns förklarat på wikipedia. T.ex.

dot 3D Projektion
dot Rotera
dot Transformering

Modellen
xyz plan 3D-modellen matas in och lagras i form av punkter (x,y,z). Dessa punkter existerar i en lista och varje punkt har en flagga som berättar om det är en moveto -punkt eller lineto -punkt. Om det är en lineto -punkt dras en linje från där senaste linjen slutade eller senaste moveto. Om det är en lineto -punkt kan man även ge den en färg. Eftersom canvas-objektet nu ökar x & y från övre högra hörnet vilket delvis är tväremot vad jag vill har jag inledningsvis roterat trådmodellen så att den hamnar rättvänt i nedre hörnet. X/Y/Z följer alltså tumreglen som det bör göra men trådmodellen är spegelnvänd uppochner i canvas, vilket alltså blir rättvänt.



Rotation och Transformation
När man roterar modellen flyttar man alla modellens punkter. Dvs, vi traverserar alla punkter och flyttar dem enligt de rotationsmatriser vi skapar.

rotation matriser Sedan ritar man om grafiken och drar nya linjer mellan de nya punkterna. Det är ungefär såhär dataspel med 3D-grafik fungerar, fast då brukar man rita polygoner (månghörningar) och sedan fyller man dem med en färg. För att rotera godtycklig vinkel kring de 3 axlarna skapar vi de tre rotationsmatriserna (bild till höger från wiki) Rx, Ry, Rz.

Det ger oss formeln:

Mrot= Morg * Rx * Ry * Rz

Där Morg är vår inknappade modell och Mrot den roterade modellen.

vektor transformation För att projicera våra roterade koordinater i 2D -planet (på vår canvas) så multiplicerar vi våra roterade koordinater med en transformationsmatris (se till höger). Vi plockar sedan ut X och Y -koordinaterna ur resultatet (bx, by). Z -koordinaten kan vi också plocka ut för att mäta djupet i bilden för att t.ex. göra linjer framme i bilden tjockare och linjer längre bak tunnare.

Rotatera enbart del av modell
För att rotera enbart en del av 3D-modellen, t.ex. för att vrida på en eller flera leder, finns en funktion som roterar enbart en delmängd av modellens punkter. Man anger ett lägsta och högsta index för modellens punkter så roteras alla punkter i detta intervall. Lite ungefär som om man tänker sig att man formar en bit ståltråd. För att det skall fungera måste man tillfälligt flytta alla punkter i detta intervall till origo kring vilket rotationen sker. Därefter flyttar jag tillbaka de roterade punkterna till den fulla modellen.

Skalärprodukt
skalar produkten Förutom att vrida och vända på hela eller delar av modellen vill jag ibland mäta vinkeln mellan två vektorer för att kunna beräkna något. Det gör man enkelt med skalärprodukten. Skalärprodukten definieras enligt:

skalar produkten







Robot och elektronik -sidan byter namn till electro.st

Senast läst 12:23:05 19/7 2017 Texten uppdaterad 19/9 2014
footer sign