Maskinellt lärande i inbyggda system - Vem är på?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

Hej!

Efter att ha skapat en algoritm som hittar den kortaste vägen till målet så vill jag utveckla vidare inom just den adaptiva grenen inom robotik. Jag jobbar inte inom robotik eller har någonsin gjort detta. Däremot driver jag fritidsprojekt när jag får tid.

Inom robotiken så är det väldigt viktigt med planering. Att en robot(i detta fall kan det radiostyrd bil) som går från A till B. För att en robot skall utföra denna uppgift så behöver den:
  • 1. Referens (vägen med andra ord)
  • 2. Reglermodul för att följa referensen (regulator med andra ord)
Inom robotiken så är Model Predictive Control väldigt populärt då kan man ha en riktigt bra framtidsseende. Model Predictive Control är ingen magi, den är rätt gammal. Det är bara lösa ekvationen \(Ax=b\) med t.ex. linjärprogrammering eller kvadratisk programmering. Jag löser med linjärprogrammering då det finns enkla algoritmer till det som löser problemet. Med linjärprogrammering så kan man sätta begränsningar på utsignaler t.ex. att roboten får ej avvika från referensen med vissa gränser. För mer avancerade beräkningar för allt svårare begränsningar så skall kvadratisk programmering användas. Begränsningar är alltså att man tar hänsyn till verkligheten.

Men mitt intresseområde är inte predictive control. Mitt intresseområde är adaptive control. Så därför har jag valt att skapa en algoritm för estimering utav modeller. Jag använder Recursive Least Squares. Det är en populär algoritm inom adaptiv reglering. Dels för att den är enkel, dels för att den tar lite plats och dels för att den spottar ut ett kalmanfilter också. Men Recursive Least Squares är bara för system som hanterar en insignal och en utsignal, t.ex. värmereglering, nivåreglering eller positionsreglering. Alltså saker som PID-regulatorer håller på med. Enda fördelen att kombinera Recursive Least Squares med Model Predictive Control är att man får en adaptiv eller självinställande regulator. Alltså maskinellt lärande med andra ord.

Så jag har testat rätt många regressionsmetoder och kommit fram till att Eigensystem Realization Algorithm är den bästa för just adaptiv reglering. Den är enkel att använda och den går att automatisera. När man håller på med regression så är det väldigt mycket forskning och prövning. Det finns ingen som säger vad som är rätt eller fel. Mycket att försöka sig fram. Men Eigensystem Realization Algorithm är så pass enkel och prickar alltid rätt vid första försöket. Nackdelen är att den har inte samma precision som de stora avancerade algoritmerna så som Multivariable Output Error State Space (MOESP) och Numerical algorithms for Subspace State Space System Identification (N4SID). Jag har själv använt mig utav dessa och dom kräver väldigt mycket data av speciell typ. Helst våldsam data som har hög volatilitet. Medan Eigensystem Realization Algorithm klarar sig på ett par 10-tal punkter.

Så jag har hittat en mycket pedagogisk manual om hur man tillämpar Eigensystem Realization Algorithm och dessutom hur man kan generera ett kalman filter från det. Så kombinerar man Eigensystem Realization Algorithm + Model Predictive Control så går den använda för radiostyrda bilar då en bil har x,y position som den åker i. Alltså blir det en flervariablig modell som skall estimeras.

Jag skickar en länk till manualen. Ja, denna manual är enormt snyggt skrivet och allt är skrivet på ren praktik. Inget tjafs om teori eller massa annat. Har ni svårt att förstå den så kan jag förklara.
http://people.duke.edu/~hpgavin/SystemI ... zation.pdf

Jag kan börja med några förklaringar.

1. Markovparameter är alltså impulssvar. Impulssvar är något som Eigensystem Realization Algorithm vill ha. Det betyder alltså en insignal in bara. Impulssvar har ett speciellt utseende. Typ som en hammare som slår en gång, hårt, på en utstickande svag bräda.

2. Hankelmatriser är bara ett sätt att strukturera upp datan.

3. Observability och Controllability är själva impulssvaret uttryckt i hankelmatriser. Här används det något som heter Singular Value Decomposition (SVD) för hankelmatriserna. SVD används för att lösa \(Ax=b\) system när [img]A[/img] är ej kvadratisk, alltså den går ej att lösa med \(x = {A}^{-1}b\). Ett annat ord för att lösa sådana system kallas för pseudo-inverse eller Moore-Penrose-inverse. Åter igen, ingen magi. Bara enkel matrislösning.

4. Data Correlation är ett sätt att filtrera bort brus från impulssvaret. Inget krav.

5. Observers är alltså kalmanfiltret. Om ni undrar hur ett kalmanfilter ser ut så är det bara en matris. I detta fall kallas kalmanfiltret för \(G\). Här är det enkelt och tydligt skrivet att använder man vissa typer utav signaler så får man en stokastisk modell från Eigensystem Realization Algorithm. Därmed så kan man lösa ut matriserna \(A,B\) om man vet matriserna \(C,D,G\), vilket man får.

6. Ni minns väll att jag talade om att Eigensystem Realization Algorithm använder sig utav impulssvar och inte vanligt in- och utsignalsvar? Observer kalmanfilter är ett sätt att räkna ut impussvaret från enbart in- och utsignalerna.

För att skapa denna algoritm så krävs det alltså att man bygger upp algoritmen Singular Value Decomposition i rent C.
Att skapa en SVD algoritm är det svåraste arbetet. Sedan är det bara att hålla på med hankelmatriserna och få dom korrekt skrivna.
Det som jag kan uppfatta som ett problem här är att hålla ned minnet. Att ha ca 200 mätpunkter kan gå upp till över 800 kB i RAM. Men jag använde då ett rätt tungt C bibliotek som jag ej har skrivit. Nu gäller det att få ned storleken och återanvända matriserna.

http://www.cs.utexas.edu/~inderjit/publ ... LA_SVD.pdf

Noter att Eigensystem Realization Algorithm retunerar en linjär modell av orsaken att linjära modeller går att verifiera om dem är stabila. Olinjära modeller har inte denna modellsäkerhet. Därav så sitter reglertekniken "fortfarande fast" i linjära modeller. Men kompletterar man med Eigensystem Realization Algorithm och Model Predictive Control så har man i praktiken en olinjär regulator för robotik.

Jag bifogar två filer så att dom är kvar här på forumet. Då ställer jag frågan? Vem vill hoppa på ett sådant projekt med mig? Ni kan alltid lära er något om just maskinellt lärande. Jag tänkte att det ska bli mycket diskussioner om hur man kan spara minnet samt praktiska aspekter.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

Vill bara säga att jag har nu skapat en algoritm för Singular Value Decomposition (SVD).

Jag använde Jacobi rotation method.
https://en.wikipedia.org/wiki/Jacobi_rotation
https://web.stanford.edu/class/cme335/lecture7.pdf

Om ni inte visste, så kan man göra klassificering, dvs bildigenkänning, med SVD.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

Inget intresse?

Då kanske jag ska ställa en fråga som ni känner er trogen till.
När det kommer till beräkningar så är det alltid bäst att räkna med heltal. Jag har alltid räknat med flyttal, t.ex float och jag känner att jag måste börja om från början och räkna med heltal. Frågan är om det blir rätt.

Det som gjorde att jag tog detta beslut var att jag räknade på stabilitet med Lyapunov's ekvation.

\(A P A^T - P + Q = 0\)

Där \(A \in \Re^{nxn}\) och \(Q = \in \Re^{nxn} > 0, Q = Q^T\).
Målet är att hitta \(P = \in \Re^{nxn} > 0, P = P^T\).

Det jag försöker säga är att P och Q skall vara positiva och symmetriska. Problemet är att det är lite svårt att jämföra symmetrin när det är flyttal. Därför tänkte jag att om jag kör med int, istället för float. Viss behöver jag bara byta ut float mot in?

Exempel detta

Kod: Markera allt

/*
 * Discrete Lyapunov equation
 * Solves A * P * A' - P + Q = 0
 * A, P, Q need to be square and Q need to be positive and symmetric
 */
void dlyap(float* A, float* P, float* Q, int row_a){
	// Create an zero large matrix M
	float M[row_a*row_a*row_a*row_a]; // row_a^2 * row_a^2

	// Create a temporary B matrix
	float B[row_a*row_a];

	// Fill the M matrix
	for(int k = 0; k < row_a; k++){
		for(int l = 0; l < row_a; l++){
			memcpy(B, A, row_a*row_a*sizeof(float)); // B = A*A(k, l);
			for(int i = 0; i < row_a*row_a; i++) *(B + i) *= *(A + row_a*k + l);
			insert(B, M, row_a, row_a, row_a*row_a, row_a*k, row_a*l);
		}
	}

	// Turn M negative but add +1 on diagonals
	for(int i = 0; i < row_a*row_a; i++)
		for(int j = 0; j < row_a*row_a; j++)
			if(i == j)
				*(M + row_a*row_a*i + j) = - *(M + row_a*row_a*i + j) + 1;
			else
				*(M + row_a*row_a*i + j) = - *(M + row_a*row_a*i + j);

	// Solve MP = Q, where P is our solution // TODO: Använd QR-decomposition istället för Tichonov regularization.
	linsolve(M, P, Q, row_a*row_a, row_a*row_a);
}
Vad tror ni? Tror ni att jag behöver bara göra en

Kod: Markera allt

typedef datatyp minDatatyp;
Och sedan använder jag datatypen

Kod: Markera allt

minDatatyp
. Då behöver jag bara byta ut

Kod: Markera allt

datatyp
mot float när jag vill testa på min dator eller int när jag vill köra den på en mikroprocessor?

Hur blir det när jag delar 1001/3 = 333.66667 jämfört med 1002/3 = 334. Alltså måste en dator avgöra om 1001/3 ska bli lika mycket som 999/3 = 333 eller 1002/3 = 334 ?

P.S
Ni kanske undrar vad man gör med Lyapunov?
Jo. Istället för att räkna på eigenvärden för att verifiera stabilitet. Då kan man räkna på lyapunov istället. Lyapunov bekräftar bara om stabiliteten är OK eller inte. Med eigenvärden så kan man dra slutsatser hur stabilt det är. Vilket är rätt ointressant i verkligheten. Sådant märks när provet testas i verkligheten. Det är många procedurer att kunna räkna på eigenvärden och det tar mycket tid.
hummel
Inlägg: 2268
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av hummel »

Angående flyttal eller heltal. Det avgörande är vad dina tal ska beskriva om du behöver 8, 16, 32 bitar i upplösning på heltal, flyttal eller kanske någon form av komplexa tal. Det borde vara specificerat för din algoritm. Vilka krav har du?
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

Egentligen så är mitt krav att jag vill ha garantier till noggrannhet. Säger jag 3.15456 så ska det vara så.
Det är mitt mål. Men jag får en känsla att 3.15456 kanske är 3.1547 på en mikrokontroller.

I detta fall så tror jag minst att 8-bitar och 32-bitar kommer gå åt väldigt mycket.
8-bitar kommer jag kunna använda till for-loopar och while-loopar. Sällan man vill iterera mer än 250 gånger. Däremot när det kommer vill att hålla i värden i form av heltal så vill jag nog ha 32-bit.

Men istället för att fixerat bestämma sig av fasta datatyper så kan jag använda typedef.
Största frågan jag har är hur jag dividerar med heltal på rätt sätt.
hummel
Inlägg: 2268
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av hummel »

Känsla och tror kan ställa till det med datorer. :-)

Om du nu gjort en egen algoritm så vet du även vad som behövs angående precision och upplösning på ingående beräkningar.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

Det är därför jag forskar lite kring tänkbara fel. Jag har inget problem om den räknar fel på några decimaler.

Jag vet vad som behöver göras. Det jag är nyfiken över är just dividering med heltal.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

Det jag har skapat själv är:
  • Systemidentifiering utav dynamiska system
  • Reglering med optimeringslära för att räkna på insignaler så utsignalerna följer referenserna.
  • Optimal sökplanering
Nu håller jag på med är:
  • Iterativ inlärning av repetitiva moment
  • Bildigenkänning
För iterativ inlärning passar denna bild riktigt bra. Du har ju din grundregulator \(C(s)\) som kan t.ex. vara en PID eller en LQR. Sedan har du en kompensator som ständigt minns före detta regulatorvärde. \(W_1(s)\) är ett viktfilter - t.ex. högpassfilter. Filtret kan lika gärna vara en konstant, men målet är att det ska vara prediktivt. Det är bara för att prediktivt hitta framtida topp eller dal. \(G(s)\) är själva systemets beskrivning. Denna är okänd.
1-Figure1-1.png
Målet är att kunna bygga en liten bil som kan köras av sig själv. Har ni några mer förslag? Vad sägs som ett förslag på ett viktfilter?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
svanted
Inlägg: 5083
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av svanted »

blir lite förundrad över dina problem med att bygga en webserver medelst en esp8266 och en arduino,
och att du nu ger dig in på att bygga en självkörande bil?
är det enklare?
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

Inte Arduino, STM32. Angående webbservern så var det mest bara en fundering. Jag har några tankar på kommunikation mellan externa enheter.
Alla mål kretsar kring just att få en lite leksaksbil självkörande eller eventuellt en grävskopa att kunna styra sig själv. Fritidsprojekt med andra ord.

Jag har läst en och annan bok om det här och varje gång ställer jag mig frågan: Finns det något syfte med detta?
Finns många häftiga saker där ute som många verkar vilja tillämpa, men det måste ju finnas lönsamhet bakom det också.
Gimbal
Inlägg: 7931
Blev medlem: 20 april 2005, 15:43:53

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av Gimbal »

Klart det finns tillämpningar för dylikt, robotdammsugare tex.

Jag är mäkta imponerad av navigeringen i Roborock S6, den har en roterande LIDAR som används för att mappa upp omgivningen som sedan sparas som en karta.
Kartan kan man sedan dela upp i rum och lägga till no-go-zoner i om man så vill. Vill man rengöra ett visst rum kan den köra direkt dit, den kan även hitta alternativa vägar och köra genom andra rum för att ta sig fram till målet.

Kartan uppdateras också kontinuerligt, så om ex en stol som den inte kom under flyttas så upptäcker den det och kör dit för att rengöra den "missade" fläcken även om den så att säga redan har avverkat det området.
bearing
Inlägg: 11259
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av bearing »

DanielM skrev:Inte Arduino, STM32. Angående webbservern så var det mest bara en fundering. Jag har några tankar på kommunikation mellan externa enheter.
Alla mål kretsar kring just att få en lite leksaksbil självkörande eller eventuellt en grävskopa att kunna styra sig själv. Fritidsprojekt med andra ord.

Jag har läst en och annan bok om det här och varje gång ställer jag mig frågan: Finns det något syfte med detta?
Finns många häftiga saker där ute som många verkar vilja tillämpa, men det måste ju finnas lönsamhet bakom det också.
Det finns ju färdiga exempel på webbserver med ESP8266 via Arduinos utvecklingsmiljö? Exemplet fungerade på första försöket för mig.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

Gimbal skrev:Klart det finns tillämpningar för dylikt, robotdammsugare tex.

Jag är mäkta imponerad av navigeringen i Roborock S6, den har en roterande LIDAR som används för att mappa upp omgivningen som sedan sparas som en karta.
Kartan kan man sedan dela upp i rum och lägga till no-go-zoner i om man så vill. Vill man rengöra ett visst rum kan den köra direkt dit, den kan även hitta alternativa vägar och köra genom andra rum för att ta sig fram till målet.

Kartan uppdateras också kontinuerligt, så om ex en stol som den inte kom under flyttas så upptäcker den det och kör dit för att rengöra den "missade" fläcken även om den så att säga redan har avverkat det området.
Det låter som den använder A* algoritmen. Eller snarare att den kan användas.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Maskinellt lärande i inbyggda system - Vem är på?

Inlägg av DanielM »

bearing skrev:
DanielM skrev:Inte Arduino, STM32. Angående webbservern så var det mest bara en fundering. Jag har några tankar på kommunikation mellan externa enheter.
Alla mål kretsar kring just att få en lite leksaksbil självkörande eller eventuellt en grävskopa att kunna styra sig själv. Fritidsprojekt med andra ord.

Jag har läst en och annan bok om det här och varje gång ställer jag mig frågan: Finns det något syfte med detta?
Finns många häftiga saker där ute som många verkar vilja tillämpa, men det måste ju finnas lönsamhet bakom det också.
Det finns ju färdiga exempel på webbserver med ESP8266 via Arduinos utvecklingsmiljö? Exemplet fungerade på första försöket för mig.
Problemet med Arduino är att dom är ingen återförsäljare till hårdvara.

Jobbade på ett företag som använder(än idag) Arduino för att verifiera sjukhusutrustning. Skapat av oerfarna och enkla pythonprogrammerare och studenter som just har fått chansen att hålla på med C++ för inbyggda system. När jag menar studenter så menar jag att företaget anlitade studenter att programmera kod på distans för en billig slant.

Koden såg ut som skräp och testutrustningen hade fullt med "features" som dom kallar det för. Jag kallade det för buggar. Sedan dess så har jag sett positivt på STM32.

Orsaken till Arduino var att det är för dyrt att anställa en erfaren programmerare.
Skriv svar