3D kartläggning med quad-kamera robot
Postat: 29 augusti 2016, 11:21:51
Tjena. På Onsdag är det dags för mig att presentera mitt exjobb. Tänkte att jag kan slänga ihop en liten tråd om det här också. Exjobbet går ut på att använda Visual SLAM för att skapa en 3D karta av en matbutik. Jag har byggt en robot som är utrustad med fyra kameror som den använder för att hitta digitala prislappar i butiken. Det är dessa som jag lokaliserar i 3D för att bygga en karta.
Låt oss börja med hårdvaran. För att spara tid köpte jag mig en Irobot Roomba, robotdammsugare, och använde som grund. Denna har ett seriellt interface "Open Interface" som man kan använda för att via USART (5v nivå RS232) kommunicera med den. Via detta kan man läsa av alla sensorer samt styra alla motorer. Ganska kraftfullt interface, speciellt med tanke på att det är en konsumentprodukt. Robotens hjärna fick bli en Raspberry Pi 3 som kör Linux (Raspian, baserat på Debian) Raspberryn pratar med 3.3V medan roboten snackar 5V system. Detta löser man lätt med en dubelinverterande transistorkoppling: Raspberryn fick också en 7" touchskärm så att man kan interagera med den, men styra roboten gör jag via WiFi. De fyra kamerorna fick jag från Modcam (http://www.modcam.com/). Smidiga små puckar som kör Android. Batteri är också inbyggt. Utanpå dem satte jag extra vidvinkellinser för att få 135 grader FOV (field of view). För att få lite höjd till kamerorna använde jag mig av MakerBeam, http://www.hobbytronik.se/sv/65-makerbeam och byggde ett torn som jag monterade allt på. Kamerorna ger en ganska förvrängd bild. Raka linjer blir böjda. Skall man göra geometriska mätningar i bilderna så underlättar det om man har ett euklidiskt koordinatsystem. Man kan modellera denna distorsion med tex ett 6e grads polynom i radiell led samt ett 2a grads polynom för tangentiell distortation (uppkommer om linsen inte är parallell med bildplanet). Jag har modellerat det såhär: Dessa parametrar hittar man automatiskt. Jag har skrivit ett program som hittar alla hörnor i bilden av schackbrädet och sedan kör först en linjär estimering och efter det iterativ förbättring för att göra schackbrädet fyrkantigt, dvs att de linjer som skall vara raka blir raka. Denna funktionalitet finns också inbakad i OpenCV, så det är väldigt lätt att använda det.
Jag behöver använda mig av inversen till distortationen (för att kunna avdistruera en bild). Att räkna ut den matematiskt är inte praktiskt utan istället är det standard att man gör en itterativ lösning som baseras på Banach's fixed point theorem. Jag har implementerat det såhär: Det brukar konvergera väldigt snabbt, redan efter 30-50 iterationer.
Resultatet om jag tillämpar min invers för att mappa om alla pixlar i bilden blir detta: Mer kommer snart!
Låt oss börja med hårdvaran. För att spara tid köpte jag mig en Irobot Roomba, robotdammsugare, och använde som grund. Denna har ett seriellt interface "Open Interface" som man kan använda för att via USART (5v nivå RS232) kommunicera med den. Via detta kan man läsa av alla sensorer samt styra alla motorer. Ganska kraftfullt interface, speciellt med tanke på att det är en konsumentprodukt. Robotens hjärna fick bli en Raspberry Pi 3 som kör Linux (Raspian, baserat på Debian) Raspberryn pratar med 3.3V medan roboten snackar 5V system. Detta löser man lätt med en dubelinverterande transistorkoppling: Raspberryn fick också en 7" touchskärm så att man kan interagera med den, men styra roboten gör jag via WiFi. De fyra kamerorna fick jag från Modcam (http://www.modcam.com/). Smidiga små puckar som kör Android. Batteri är också inbyggt. Utanpå dem satte jag extra vidvinkellinser för att få 135 grader FOV (field of view). För att få lite höjd till kamerorna använde jag mig av MakerBeam, http://www.hobbytronik.se/sv/65-makerbeam och byggde ett torn som jag monterade allt på. Kamerorna ger en ganska förvrängd bild. Raka linjer blir böjda. Skall man göra geometriska mätningar i bilderna så underlättar det om man har ett euklidiskt koordinatsystem. Man kan modellera denna distorsion med tex ett 6e grads polynom i radiell led samt ett 2a grads polynom för tangentiell distortation (uppkommer om linsen inte är parallell med bildplanet). Jag har modellerat det såhär: Dessa parametrar hittar man automatiskt. Jag har skrivit ett program som hittar alla hörnor i bilden av schackbrädet och sedan kör först en linjär estimering och efter det iterativ förbättring för att göra schackbrädet fyrkantigt, dvs att de linjer som skall vara raka blir raka. Denna funktionalitet finns också inbakad i OpenCV, så det är väldigt lätt att använda det.
Jag behöver använda mig av inversen till distortationen (för att kunna avdistruera en bild). Att räkna ut den matematiskt är inte praktiskt utan istället är det standard att man gör en itterativ lösning som baseras på Banach's fixed point theorem. Jag har implementerat det såhär: Det brukar konvergera väldigt snabbt, redan efter 30-50 iterationer.
Resultatet om jag tillämpar min invers för att mappa om alla pixlar i bilden blir detta: Mer kommer snart!