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

Olinjära fel i länkmekanismer
Bakgrund - problemet
Bakgrunden är ett problem som kan uppstå i min robotkonstruktion p.g.a. att ögonen styrs med länkarmar från servona, både i höjdled och sidled för resp. öga. Länkarmar är det mest praktiska. Det ger en lättrörlig, exakt och glappfri koppling men vissa linjäritetsproblem kan uppstå. Jag är inte 100% säker på hur jag ska lösa detta, men nedan lösning skulle faktiskt kunna lösa problemet.

Nedan är en skiss från en äldre version av robothuvudets ögonmekanik, men principen är fortfarande densamma och lösningen är ju f.ö. generell för alla möjliga robotkontruktioner. Det som nedan beskrivs som ett icke önskvärt fel, svårt att undvika, kan ju också vara en medveten konstruktion. Matematiken är användbar i båda situationer. För mig är dock detta ett icke önskvärt fel.

Problemet i detta fall är att det är väldigt svårt få saker och ting exakta. Eftersom lägesgivaren sitter i servot och det finns 3 länkar fram till kameramodulen som alla kan ha oexakta dimensioner, så är det inte säkert att de vinklar datorn vill ställa kameramodulen i är de vinklar som blir resultatet. Datorn kanske önskar en vinkel 46 grader men p.g.a. mekaniska tillkortakommanden blir det istället 47 eller 48 grader. Ytterligare en oönskad aspekt här är att felet är olinjärt.

Kraftigt överdrivet kan felet illustreras som nedan. Man kan göra en modell av mekanismen och Freudenstein (Ferdinand Freudenstein, amerikansk fysiker och ingenjör) har hjälpt oss beskriva sambandet mellan stagens längd och vinklar. Studera illustrationen nedan. En viss rörelse (vinkel) i 1 blir inte alls samma rörelse (vinkel) i 4. För att det skall bli exakt samma vinkel måste längden r2 = r4 och längden r1 = r3. Minsta avvikelse från detta ger ett olinjärt samband mellan rörelse/vinkel in och rörelse/vinkel ut. Nedan t.ex. blir en liten vinkelrörelse i 1 en stor vinkelrörelse i 4.

Mekanismen ur matematiskt perspektiv

Ovan är alltså en modell av mekanismen där man tänker sig att man vrider en viss vinkel λin runt punkt 1, vilket resulterar i en viss vinkel λut runt punkt 4. Nu får man skriva om Freudensteins ekvation ovan (lite halvsvettigt, med det är t.ex. beskrivet här) så att man får en funktion där man får λut som en funktion av λin och länkarmarnas längder.

Så här har jag gjort i javascript:

function lambda_ut(lambda_in,a1,a2,a3,a4)
{
 var k1=a1/a2;
 var k2=a1/a4;
 var k3=(a1*a1+a2*a2-a3*a3+a4*a4)/(2*a4*a2);
 var D=Math.sqrt(k1*k1+1-2*k1*Math.cos(lambda_in));
 var fi=Math.atan(Math.sin(lambda_in)/(k1-Math.cos(lambda_in)));
 if(fi<0)
 {
   fi+=Math.PI;
 };
 var l_ut=-fi + Math.acos((k2*Math.cos(lambda_in)-k3)/D);
 return (l_ut);
}
Dvs, vi skickar in lambda_in samt länkarnas längder och får ut lambda_ut. Nu är det lite ointutivt om detta verkligen stämmer. Men man kan göra en liten visuell simulator som bygger på ovanstående funktion, vilket jag gjort här nedan. Då kan man övertyga sig om att det verkar stämma.
Data

Öka λin | Minska λin
Öka a1 | Minska a1 | Öka a2 | Minska a2 | Öka a3 | Minska a3 | Öka a4 | Minska a4 |

Hastighetsoptimering
Eftersom ovanstående funktion innehåller en hel del multiplikationer och trigonomertriska funktioner är den inte speciellt optimalt att anropa denna funktion varje gång en servorörelse skall skickas. En lösning är låta göra en tabell, dvs att funktionen kalkylerar en tabell i förväg. Sedan kan man hämta dessa värden i tabellen när de behövs. Det räcker troligen med 10.000 rader i tabellen (eller kanske snarare en array) eller något sånt.





Robot och elektronik -sidan byter namn till electro.st

Senast läst 14:09:54 19/7 2017 Texten uppdaterad 19/9 2014
footer sign