Robovision
Mis on
Robovision on Eesti Infotehnoloogia Kolledži robootikaklubi robotijuhtimise ja videotöötluse tarkvara. Tarkvara on kaitstud GPL litsentsiga. Robovision kasutab OpenCV ja QT4 teeke.
Installeerimine
Eeltingimused
Intalleeri:
- OpenCV: opencv installeerimine
- juhul kui kasutad võistluskaameraid siis instaleeri:Libwebcam koos Uvcvideo-ga
- instaleeri QT4 koos arendus failidega
sudo apt-get install libqt4-dev
Kood
Kood asub robot.itcollege.ee SVN-is, check-out-iks:
svn checkout http://robot.itcollege.ee/svn/vision/robotvision2010
Kõigi muudatuste sisse panemiseks tee kataloogis, kuhu tegid checkout'i (võib olla ka selle kataloogi alamkataloog):
svn commit -m"muudatuse kommentaar"
Kui ei taha kõikide failide muudatusi svn'i viia, siis commitile saab ette anda ka kindla kataloogi või faili, milles olevad muudatused commititakse. Näiteks:
svn commit MinuRobot.cpp
Uuenduste alla tõmbamiseks:
svn up
Uue faili lisamiseks:
svn add faili_nimi_mida_tahad_lisada
Kui tahad näha, millised sinu arvutis olevad failid erinevad svn'i omadest:
svn status
Üldkirjeldus
Tegemist on C++ programmiga ja iga roboti jaoks on eraldi klass, mis pärineb abstraktsest Roboti klassist.
Klassid
MyRobot
Antud klass on igal robotil individuaalne ning klassi nimeks on roboti nimi. Klassi aluseks kasutatakse TestRobot klassi ehk kui lood oma roboti nimega klassi, siis kopeeeri TestRobot endale alusvormiks. TestRobot (ja seega iga individuaalse roboti klass) pärineb klassist AbstractRobot.
Mida teeb antud klass
- Laetakse iga roboti individuaalne konfiguratsioon
- Käivitatakse logimine
- Lubatakse suhtlus Asuse ja mikrokontrolleri vahel (conf.setSendCmdEnabled(1);)
- Lõpmatu (while) tsükli sees:
- Kasutades Image klassi abi küsitakse kaadreid (image->getFrame();)
- Peale kaadritöötlust saab küsida leitud objektide nimekirja (image->process(0,0,0,1);)
- Loeb andureid mikroprotsessorsüsteemist (getAnalogs();)
- Väljastab andurite väärtusi (konsoolile)
- Juhib mootoreid (com.sendCommand(129,124);)
- Käivitab pildi joonistamise ekraanile (view->show(_img);)
MyRobot klassis peaks olema
- Config objekt
- log objekt
- image objekt päritakse AbstractRobot klassist
Näide
Näitena TestRoboti go() meetod:
void TestRobot::go() { Config & conf = Config::getConfig(); log->console("TestRobot Start...\n"); char servo=0; conf.setSendCmdEnabled(1); while(1){ _img = image->getFrame(); image->process(0,0,0,1); getAnalogs(); std::cout<<analog[0]<<std::endl; std::cout<<analog[1]<<std::endl; com.sendCommand(129,124); std::cout<<"servo: "<<servo++<<std::endl; view->show(_img); } }
While tsüklis saab kasutada meetodit. Image::process(purk, sokk, purgi majakas, soki majakas)
Näiteks, kui argumendi väärtus on 1, siis otsib just seda objekti. Kui soki argumendi väärtus on 1, siis otsib sokke. Meetod tagastab objektilisti.
Peale process'i väljakutsumist saab kasutada Image klassi struktuuri found_objects (CvSeq tüüpi), mille sees on Object tüüpi elemendid.
Tulevik:
Plaanis on MyRobot klassi failid viia programmi peakaustast ära "Robots" kausta, mille all on igal robotil individuaalne kaust.
Object
Object klass on Image klassi sisemine klass ja see kirjeldab ühte leitud objekti.
Peale pilditöötlust saab robot klassis pöörduda image->found_objects listi poole mis sisaldab Object klassi kuuluvaid elemente.
Võimalikud objekti tüübid:
#define BALL 1 #define GOAL 2
Objekti kirjeldavad elemendid:
class Object { public: int type; // BALL, GOAL CvPoint center; // center coordiantes CvRect rect; // bounding rectangle double area; // area of the object int distanceH; // horizontal distance from image center };
- type - objekti tüüp: pall või värav
- BALL (1), GOAL (2)
- center - objekti keskpunkt: kaks int tüüpi muutujat x, y
- rect - objekti ümbritsev kujuteldav ristkülik: neli int tüüpi muutujat x, y, width, height
- area - objekti pindala
- obj.area = fabs(cvContourArea(c, CV_WHOLE_SEQ));
- distanceH - horisontaalne kaugus pildi keskkoha ja objekti keskkoha vahel
- obj.distanceH = obj.center.x - (width / 2);
AbstractRobot
Abstraktne klass, millest on tuletatud kõik robotite klassid. AbstractRobot sisaldab erinevate robotite ühist funktsionaalsust.
- Initsialiseerib Log klassi
- Initsialiseerib Image pilditöötlusklassi
- Initsialiseerib View klassi
- Initsialiseerib Comm kommunikatsiooniklassi (roboti mikrokontrolleriga)
- Loob virtuaalse funktsiooni go(), mille kõik robotid peavad üle kirjutama
Camera
Kaamera klass initsialiseerib kaamera või võtab sisendi pildifailist. Kaamera klass seadistab kaamera vastavalt ini failile. Tegemist on singleton klassiga.
Comm
Kommunikatsiooni klass loob ühenduse pilditöötlusarvuti ja mikrokontrolleri vahel. Ühenduse viis loetakse ini failist. Tegemist on singleton klassiga.
- Hetkel realiseerib com pordi ühenduse
- Implementeerib suhtlusprotokoli
- Implementeerib send_message ja receive_message funktsionaalsuse
Config
Loeb käsurealt robotikohased parameetrid. Kui käsurealt vajalikke parameetreid ei sisestatud, siis loetakse need .ini failist. Tegemist on singleton klassiga. .ini failid asuvad "configs" kataloogis. Iga roboti kohta on RobotiNimi.ini fail.
NB!failinimi ja robotinimi on tõstutundlikud (case sensitive).
Käsurea argumendid
Config klassis on realiseeritud käsurealt argumentide lugemine.
-h, --help
- Väljastab käsurealt loetavate argumentide kasutusvõimalused.
-r, --robot
- Roboti nimi. Tõstutundlik. Kohustuslik argument.
-s, --sdev
- Jadaliidese nimi. Tõstutundlik.
-v, --videodev
- Video seadme nimi. Tõstutundlik.
-f, --file
- Pildifaili nimi. Tõstutundlik.
-c, --contrast
- Kontrastsuse väärtus <min:max vahemik>.
-b, --brightness
- Heleduse väärtus <min:max vahemik>.
Muu funktsionaalsus
- sendCmdEnabled
Programmi käivitamisel on Asuse ja mikrokontrolleri vaheline suhtlus keelatud (sendCmdEnabled=0). Enne käskude edastamist kontrollib Comm klass selle muutuja olekut (getSendCmdEnabled) ning teeb otsuse, kas käske edastada. Suhtluse lubamiseks tuleb muutuja väärtus seada mingiks nullist erinevaks täisarvuks (nt conf.setSendCmdEnabled(1)). Kaval on seda teha näiteks tühiku vajutamise peale, et programmi käivitamisel robot kohe minema ei sõidaks.
Image
Sisaldab piltidöötluse funktsioone. Hoiab kolme koopiat kaamerast tulevast pildist. Image klass on singleton. Realiseerib funktsionaalsused:
- Loob kaamera objekti
- Küsib uue kaadri kaamerast
- Töötleb kaadrit
- Annab töödeldud kaadri kohta infot:
- Suurima purgi koordinaadid
- Leitud purkide koordinaadid
- Info võimalike sokkide kohta
- Info nähtavat majakate kohta (värv ja koordinaadid)
Log
Log klass on singleton, mida saab välja kutsuda igast klassist. Funktsionaalsus:
- Kirjutab konsoolile
- Kirjutab töödeldavale pildile
View
Mittevajalikud klassid
Järgnev nimekiri on klassidest, mis ei ole kirjutamise hetkeks enam kasutusel ning eemaldatakse ITK Robovisionist.
- ObjectFinder
- ObjectType
- Protocol
- RobotTestSuite
- UdpSendThread
KKK
Uue roboti loomine
- Kopeerida testrobot.cpp -> sinurobot.cpp ja testrobot.h -> sinurobot.h
- Muuta failid sinurobot.cpp sinurobot.h Makefile robotfactory.h
sinurobot.cpp
TestRobot asendada SinuRobot
#include "testrobot.h" -> #include "sinurobot.h"
sinurobot.h
#ifndef TESTROBOT_H -> #ifndef SINUROBOT_H #define TESTROBOT_H -> #define SINUROBOT_H
Ja asendada kõik TestRobot SinuRobot'iga