2012/02/27

Роботоор хөл бөмбөг тоглох: Бөмбөг таних

Гурван сарын өмнө Robocup SPL гэдэг роботын хөл бөмбөгийн тэмцээнд орох санаатай хэдэн робот авсан юм. Тэр тэмцээн нь нэг иймэрхүү:




Монголчууд Robocon гэдэг тэмцээнд ороод байдаг. Тэрнээс ялгаатай нь гэвэл роботууд нь 100% биеэ дааж ямар нэгэн алсын удирдлагагүйгээр хөл бөмбөг тоглоно.

Тэгээд сүүлийн хэдэн сар роботоо хөл бөмбөг тоглодог болгох гэж баахан үйлээ үзэв. Та хэдэд бас иймэрхүү зүйл сонирхолтой байх болов уу гээд энэ тухай бичиж байхаар шийдлээ.

Роботоо хөл бөмбөг тоглуулъя гэвэл хамгийн түрүүнд хийх ёстой зүйл бол камераас ирж байгаа зурагнаас хөл бөмбөгийн талбай, бөмбөг, хаалга болон бусад роботууд хаана байгааг олох явдал юм. Үүнийг хийх хамгийн амархан бөгөөд өргөн дэлгэрсэн арга бол өнгөөр хайх. Хөл бөмбөгийн талбай ногоон өнгөтэй, бөмбөг улбар шар өнгөтэй, хаалга нь цэнхэр юм уу шар өнгөтэй тул энэ өнгүүдтэй төстэй өнгүүдийг зурагнаас ялгаж аваад тэндээсээ хайсан объектуудаа олно.

Ингэж зурагнаас ямар нэгэн объект хайх, таних талаар судалдаг мэдээлэл технологийн салбарыг англиар Computer Vision гэж нэрлэнэ. Үүнд зориулсан янз бүрийн бэлэн library байдгаас хамгийн өргөн тархсан нь OpenCV (Open Computer Vision). Та үүнийг ашиглаад C, Python болон Java дээр computer vision программ бичиж болно.

Энэ бичлэгтээ хэрхэн OpenCV ашиглан Python дээр бөмбөг таних талаар бичье. Доорх зурагнаас бөмбөг хайх болно:


Эхлээд OpenCV импортлоод дараа нь зургийн файлаа зургийн объект болгох хэрэгтэй:


Ямар нэгэн өнгөтэй төстэй өнгө хайхад та бидний мэддэг RGB color space сайн тохирдоггүй тул HSV юм уу YCrCb гэх мэт color space ашиглах хэрэгтэй болдог.  HSV ашиглавал хүний арьсны өнгө хайхад амар гэдэг бөгөөд бусад тохиолдолд нь YCrCb ашиглавал зүгээр гэдэг тул бөмбөг хайхдаа YCrCb өнгө ашиглая.  Улаан, ногоон, цэнхэр өнгө ашиглаж RGB color space бусад бүх өнгийг үүсгэдэг бол YCrCb color space маань хар/цагаан (Y), цэнхэр/шар (Cb), улаан/ногоон (Cr) 3 өнгөний компонент ашиглаж бусад бүх өнгийг үүсгэдэг аж. Аналог телевизийн сигнал бас яг иймэрхүү color space ашигладаг бөгөөд хар цагаан телевиз бол зөвхөн Y компонент үзүүлээд харин өнгөт телевиз бол бүгдийг нь үзүүлдэг юм байна. Одоо зургаа RGB-аас (OpenCV яг RGB ашигладаггүй харин BGR ашиглана, цэнхэр болон улаан өнгө хадгалах байрлал урвуу) YCrCb-руу хөрвүүлье:


Хайх гэж байгаа өнгө yColor, crColor, cvColor гэсэн ямар нэгэн утгатай байг. Тэгвэл энэ өнгөтэй төстэй өнгөнүүд энэ 3 утгатай ойролцоо байх бөгөөд хир ойр хол байхыг yThreshold, crThreshold болон cbTreshold утга заадаг байг. Тэгвэл доорх аргаар бүх төстэй өнгөтэй цэгүүдийг ялгаж авч болно:


Жишээ болгож хөл бөмбөгийн талбайн ногоон өнгөтэй бүх цэгүүдийг яалгаж авч нэг цонх дээр үзүүлье:


Иймэрхүү харагдаж байна:
Талбай, бөмбөг, хаалга гурвыг хайгаад өнгө оруулбал:
Ингэхэд yColor, crColor, cbColor, yThreshold, crThreshold болон cbThreshold -ын утгуудыг хэрхэн тохируулах вэ? Жишээ нь бөмбөг улбар шар өнгөтэй гэж цаанаас нь зааж өгсөн боловч тэмцээн зохион байгуулж байгаа тал яг ямар өнгөтэй бөмбөг ашигласан,  тэмцээн болох өрөөний гэрэлтүүлэг ямар байгаа (хурц гэрэл бөмбөг дээр гялбахад улбар шар өнгө шал өөр өнгө болж харагдана), камерын линз болон sensor ямар нэгэн асуудалтай байх гэх мэт өчнөөн шалтгаанаас болоод  бөмбөг яг ийм өнгөтэй байж ёстой гэж шууд утга оноож болохгүй. Тийм учир тухайн нөхцөл байдлаас хамаараад тэмцээн эхлэхийн өмнө камераас ирж байгаа зураг дээр энэ бөмбөг энэ талбай гэх мэтээр хулганаар зааж өгч yColor, crColor болон cbColor хувьсагчуудад утга онооно. Дараа нь yThreshold, crThreshold болон cbThreshold -уудыг нэмж хасаж объект хир таньж байгаагаас хамааруулж тохируулна.

Төстэй өнгөтэй цэгүүдийг олсны дараа тэр цэгүүдээ групп болгож яг хайсан объект мөн эсэхийг шалгах хэрэгтэй. Жишээ нь бөмбөг бөөрөнхий байх ёстой (арай амархан шалгаж болох нөхцөл: бөмбөг квадрат дотор багтах ёстой) харин хаалга бол босоо хоёр дөрвөлжин хэвтээ нэг дөрвөлжнөөс бүтнэ. Доорх код олдсон цэгүүд дотор 10x10 аас том хэмжээтэй бөгөөд квадрат дотор багтах цул байгаа эсэхийг шалгана:


Бөмбөг олсныг тойруулж дөрвөлжин зурсан байдал:
Ингээд хэдхэн мөр код ашиглаад зурагнаас бөмбөг олох боломжтой аж. Гэхдээ жинхэнэ амьдрал дээр мэдээж ийм хялбар биш л дээ. Робот зурагнаас объект танихаас гадна өөрийгөө талбай дээр хаана байгаад мэдэх (localisation), зураг дээр дүрслэгдээгүй роботууд болон бөмбөг хаана байгааг мэдэх (tracking), унахгүй явах (motion control) гэх мэт өчнөөн зүйл хийдэг тул Computer Vision-д нэг их CPU time оногддоггүй. Ийм учир нэлээд өөрөөр (мэдээж хэцүүгээр) хийх хэрэгтэй болдог.

Дээрх зургуудыг үүсгэхэд ашигласан эх кодыг доор хавсаргав. Зураг дээр хулганаар дарж хайх өнгөө тохируулна, threshold утгуудыг trackbar-аар тохируулна

18 comments:

  1. Энэ гэхдээ яг вебкамераар frame авах үед дээш доошоо зурааснууд гүйлдээд contour хайлтад тасалдал гаргаад байдаг юм. Тэрийг яаж зохицуулах уу?

    ReplyDelete
    Replies
    1. Жаахан мартсан байж магадгүй буруу байвал Төгөлдөр залруулна биз, гэхдээ иймэрхүү нарийн зураасуудыг эхлээд нь blur эффект өгөөд дараа нь буцааж sharpen болгож алга болгодог байсан санагдаж байна. вэб камерийн зураг бол нэг их өндөр зуралттай биш болохоор real time ажиллах үед бараг болох байх аа.

      Delete
    2. noise ihtei bol blur hiij bolno. Gehdee threshold hiigeed iluu dutuu jijig blob iig ustgah esvel haisan blob oo tomruulah tohioldold morphology open, close geed operaturuud ashiglaj bolno. Tegeed ch webcamera aas irj baigaa zuragnaas objekt 100% tanih shaardlaga baihgui. Objekt oo neg olchihson baihad filter ashiglaad tracking hiigeed baihad hangalttai.

      Delete
  2. Роботууд нь уначихаад босож ирэхдээ "Ёооё, яг унах шахлаа.." гэж хэлж байвал зүгээр юм уу? :)

    ReplyDelete
  3. 2 yanzaar bumbug haij boldog sanagdaj bna. Neg ni unguur, nuguu ni radiusaar... Unguur haihad zaaval tuhain gereltuulegt range-d taaruulj uguh hereg boldog, aa harin radiusaar haihad yamarch ungutei hamaagui olj boldog sanagdaj bna. OpenCV-giin lekts orj bh ued bagsh iimerhuu daalgavar uguud bsan um.

    ReplyDelete
    Replies
    1. radius aar haij bolno. hamgiin amarhan arga gevel bol hough circle haih. Gehdee ongoor haisnaas hamaagui ih tsag orno. Brute force geh yum uu daa. Humuusiig haraad baihad ihevchlen oiroltsoo ongo haigaad ter ni circle dotor bagtaj baina uu gej shalgaad baih shig baigaa. Ter ni hamgiin hurdan. ene NAO robot uud yordoo 500 Mhz iin hurdtai CPU tai bolohoor ali boloh l hurdan baih heregtei. Naidvartai baih ni neg ih chuhal bish. Teriigee tracking aar zaschihaj bolno.

      Delete
    2. Aan teguul unguur haisan ni iluu deer um bna. Bi QT/C++ deer web cameraar tennisiin bumbug tracking hiideg um hiij bsan 2langaar ni. Er ni bol OpenCV-gees ali boloh zugataah heregtei bhaa! Ta yu gej bodnov?
      Minii bodloor ter bratari hiij bgaa nuhriig shpagat suulgachuul l boloh um shig sanagdaad bna hehe. Nuguu taliinhaa esvel uuriin taliin robotiin coordinat-iig herhen todorhoiloh ve? Tiim shaardlaga bii yu? Pass damjuulah tal deer?
      Neeree zaluustaa sonirhuulj helehed aichallenge.org deer iimerhuu "bot" bichih uraldaan boldog bsan orostsood uzeerei gej zuvloe!

      Delete
    3. @Anonymous

      yag minii hiij baigaa arga bol end bichsenees shal oor. OpenCV gui plain C geer hiij baigaa. OpenCV ashiglahaar temporary matrix uusgeh ene ter geed neleed performance muutai. Blog deer l python/OpenCV ashiglaj oruulsan yum. Code ni bogino bolno geed :)

      NAO spagat suuj chadahgui. Tiim bolohoor garaa deesh ni orgoj baigaad hajuu tiisheegee unana daa.

      Robot bol ooriigoo particle filter ashiglaad haana baigaagaa todorhoilno. Bombog iig bol Kalman filter eer haana baigaag ni tracking hiine gej bodoj baigaa. Yvaandaa blog deer baga bagaar ni oruulna aa.

      Pass bol damjuulahgui. Ene jijig talbai deer niit 8 robot togloh bolohoor pass hiih barag bolomjgui.

      Tennisnii bombog: tennis nii bombog chin camera naas garahgui bol camshift geed neg method bii. Ter iimerhuu yumand ug ni hamgiin sain ajildag.

      Delete
  4. Harin ihenh Computer visiongiin humuus OpenCV-g(Matlab, Mathematica) turshilt hiih maygaar ashiglaad uursdiin problemdoo taaruulaad C|C++ code bichdeg.

    NAO-g buhel togloomiin tursh hevtee bailgah horiotoi yu?

    Kalman filter, unscented Kalman filter gej bdag sanagdaj bna... Kalman-g GPS signal-d urgun heregledeg gej duulsan - koordinatiin aldaag bagasgahiin tuld

    Camshift-g kalman filtertei esvel gaussian blur ashiglaj bj tsulgai(tsagaan) bish fon deer ajilluuldag gej duulsan ashiglaj uzeeguie.
    Zaza tand sportiin undur amjilt husie, blog deer iimerhuu Computer Visionii(esvel embedded electronics) umnuud iheer oruulj bgaarai :)

    ReplyDelete
  5. Гоол хийхээрээ баярлаж ямар нэгэн гоолын баяр тэмдгэлдэг байвал гоё юм биш үү :D

    ReplyDelete
  6. Янзтай ^^ Энэ робот хэр үнэтэй байдаг вэ?

    ReplyDelete
    Replies
    1. Robocup temtseend orno geed academic discount toi negiig ni 5000 euro oor avsan. Huvi hun avbal neg ni 12000$ gej sonsogdoh shig bolson.

      Delete
    2. Oorto chini yaj holbogdohuu ho

      Delete
    3. Ene open cv programmiin talaar tuslamj heregtei bna.

      Delete
  7. Yoo tataj uhlee. yamar ineetei yum bee. bi yamar ch ter blur mlur, HSV MecgSV gedgiig chine medehgui l dee. Zugeerl hunii nudeer harhaar yostoi ineedtei yumaa. muuhan hoshin shog uzsnees l deer yum baina. Ta nart ineedtei huurhun haragdahgui baina uu?

    ReplyDelete
    Replies
    1. Хөгжилтэйн хувьд ч үнэхээр инээд авмаар юм байна лээ. Одоо тэгээд бараг долоо хоногийн дараа German Open эхэллээ дээ.

      Delete
    2. German Open тэмцээнд нь амжилт хүсье. Тэмцээнд өөрийн роботуудын тоглосон бичлэгээсээ дараа тавиарай.

      Delete
  8. sain bna uu
    OpenCV-гийн талаар мэдээлэл оруулж өгч туслаач
    монголоор мэдээлэл хэрэгтэй байна

    ReplyDelete