Историята, че е "Марсоход" е дост дълга, но накратко в програмата на всички второкурсни в моята специалност влиза едно отборно състезание. То протича по предтекст, че се изследва друга планета и трябва да се снемат данни - карта на района, температура, сезимична дейност, записване и разкодиране на звукови съобщения и т.н. Отборът, който се справи най-добре е победител и получава разни награди от Microchip. Миналата година аз бях победител и реших тази година като третокурсник да участвам отново, но само за слава :Р Тъй като съм член на LEGO клуба в университета реших да е LEGO робот.
Та сега по същество - софутера го сглобих за 20на часа, така че сигурно има много концептуални недоглеждания, но ни трябваше нещо бързо и работещо. В основата на софтуера на робота седи Robot Operating System. Това е дистрибутирана псевдо-операционна система позволяваща управлението и комуникацията между много процеси върху множество компютри. Защо псевдо - защото върви върху линукс и управлява линукски процеси.
Имайки предвид архитектурата на ROS, ето как е организиран и софта за робота. Първо има един възел, който чете джойстика и публикува съобщения с позицията и натиснатите копчета. Идеята на възела е, че публикувайки информацията други n на брой възела (процеса), работещи на различни машини, имат достъп до нея. Освен това възелът идва с ROS и всичко се свежда само да пускането му с един ред в терминала, не губихме време да четем сами джойстика. Възелът е основната функционална единица на ROS - аналогично на процес при конвенционалните операционни системи.
Защо малкия лаптоп - защото искахме да стане бързо. Беше най-лесно да имаме машина с ROS на робота (то така се прави принципно с истинските и скъпите роботи управлявани от ROS). Освен това лаптопа има WiFi и камера - 1 куршум, много зайци
Написах втори възел (езикът е С++), който върви върху лаптопа на робота, слуша за съобщения от джойстика, обработва информацията и пресмята ориентацията и скоростта на колелата. След като пресметне тези параметри ги праща към два стандартни LEGO микроконтролерни модула - RCX, чрез инфраред. RCX модулите управляват колелата и следят ротационните енкодери. За съжаление разполагаме със старите LEGO модули, с които може да се комуникара единствено чрез инфраред. Инфраред трансмитера е стандартна LEGO инфрачервена "кула" - на видето можете да я видите зад екрана на малкия лаптоп върху робота. Успях да намеря библиотека, която да управлява "кулата" кодирайки съобщението с информацията, така че двата RCX-a да го разберат.
Та работата на лаптопа се свежда до търкаляне на ROS възел, който слуша информация от джойстика, пресмята ориентацията и скоростта на колелата и изпраща тези параметри чрез инфраред до двата RCX-a. Както казах, възела го написах на C++, а средата gedit + gxx
Просто още не съм седнал да видя как се правят ROS възли с Еclipse.
Двата RCX-а принципно имат стандартен LEGO фърмуер, който обаче е малко ограничен от към комуникация по инфраред - не поддържа адресиране, а тъй като имаме 2 RCX-a това е необходимо. Затова ги префлашнахме с къстъм фърмуер наречен BrickOS. Този BrickOS позволява да си пишеш С код, като използваш техните библиотеки, после само крос компайлваш с gcc за Hitachi H8/300 - това е микроконтролера в RCX-a. Библиотеките на BrickOS позволяват да контролираш скоростта на всеки мотор, да четеш ротационните енкодери и т.н., така че кода за самите RCX-ове е сравнително елементарен също.
Ето обобщение как преминава информацията:
Джойстик => Стационарен Лаптоп => ROS Възел - Джойстик => WiFi => ROS Възел - Мобилен Робот => Мобилен Лаптоп => Кинематичен Модел => Ифраред трансмитер => ляв и десен RCX => скорост и ориентация на четирите колела
Знам, че е малко пресилено и същото нещо може да се реализира много по-ефективно, но това не е комерсиален проект, трябваше да стане бързо, а и все пак нещо да понауча
Най-готиното на това решение, според мен, е че ако имаме още един идентичен робот, просто пускаме захранването му и той ще прави абсолютно същото - тоест това решение позволява управлението на множество роботи (друг е въпросът дали има смисъл да управляваш множество роботи да изпълняват еднакви движения).