Robovision: Difference between revisions
Line 128: | Line 128: | ||
<source lang="cpp"> | <source lang="cpp"> | ||
class Object { | class Object { | ||
public: int type; // BALL, | public: int type; // BALL, GOAL_RED, GOAL_BLUE | ||
CvPoint center; // center coordiantes | CvPoint center; // center coordiantes | ||
CvRect rect; // bounding rectangle | CvRect rect; // bounding rectangle | ||
Line 135: | Line 135: | ||
}; | }; | ||
</source> | </source> | ||
*type - objekti tüüp: pall või värav | *type - objekti tüüp: pall või värav | ||
: BALL (1), | : BALL (1), GOAL_RED - punane värav, GOAL_BLUE - sinine värav | ||
*center - objekti keskpunkt: kaks int tüüpi muutujat ''x, y'' | *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'' | *rect - objekti ümbritsev kujuteldav ristkülik: neli int tüüpi muutujat ''x, y, width, height'' | ||
**x - ristküliku vasaku nurga x koordinaat | |||
**y - ristküliku vastaku nurga y koordinaat | |||
**width - ristküliku laius | |||
**height - ristküliku pikkus | |||
*area - objekti pindala | *area - objekti pindala | ||
: obj.area = fabs(cvContourArea(c, CV_WHOLE_SEQ)); | : obj.area = fabs(cvContourArea(c, CV_WHOLE_SEQ)); | ||
*distanceH - horisontaalne kaugus pildi keskkoha ja objekti keskkoha vahel | *distanceH - horisontaalne kaugus pildi keskkoha ja objekti keskkoha vahel | ||
: obj.distanceH = obj.center.x - (width / 2); | : obj.distanceH = obj.center.x - (width / 2); |
Latest revision as of 16:47, 31 October 2010
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
- instaleeri QT4 koos arendus failidega
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_RED 2
#define GOAL_BLUE 3
Objekti kirjeldavad elemendid:
class Object {
public: int type; // BALL, GOAL_RED, GOAL_BLUE
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_RED - punane värav, GOAL_BLUE - sinine värav
- 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
- x - ristküliku vasaku nurga x koordinaat
- y - ristküliku vastaku nurga y koordinaat
- width - ristküliku laius
- height - ristküliku pikkus
- 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
Autorid ja ajalugu
- Vers 1 - Linux, SDL ja Framegrab teekide baasil loodud rakendus. Autorid Jaan Oras, Margus Ernits
- Vers 2 - Linux, SDL ja V4L v1 teekide baasil. Autorid Juri Prokofjev, Margus Ernits
- Vers 3 - Linux, OpenCV. Autorid Valdur Kaldvee, Margus Ernits. Mikk Mangus, Mart Mangus ja teised
- Vers 2009 - Linux, OpenCV. Autorid Valdur Kaldvee, Margus Ernits, Madis Toom, Janek Sarjas, Mikk Pärast
- Pooleli Vers 2010 - Linux, OpenCV. Autorid Valdur Kaldvee, Margus Ernits, Mikk Pärast, Mauno Pihelgas