понедельник, 21 мая 2007 г.

И движется за палкой с черепком...



Sigfpe в своем блоге A Neighborhood of Infinity опубликовал интересную заметку о своих экспериментах с собственным роботом. Там же Вы найдете небольшое видео, кадры из которого я поместил слева и внизу. Этот небольшой самодельный робот состоит из трех частей:



  1. Микроконтроллера MAKE (сделан на основе микроконтроллеров ARM (более точно Atmel AT91SAM7X256 или сокращенно SAM7X))
    Программируется на С или ASM, способен работать под управлением FreeRTOS (Open Source ОС реального времени).
    Перефирию мк MAKE унаследовал от SAM7X - Ethernet, USB 2.0, RS232, SPI, TWI (or I2C), JTAG, CAN. Более детальное описание этих интерфейсов на русском - здесь.
  2. ИК датчиков от фирмы Sharp
  3. Станины Rigel Robot Base

Для программирования этого робота Sigfpe использовал Haskell, точнее Sigfpe написал DSL(Domain Specific Language), переводящий код Haskell в код на C с вызовами API FreeRTOS. Таким образом он программирует своего робота, не задумываясь о всех низкоуровневых копашениях, которые требуются при работе с FreeRTOS из C.

















Вот пример кода на Haskell, который заставляет робота двигаться за палкой как это происходит на видео(кстати Sigfpe пишет, что на конце палки укреплен черепок, оставшийся у него еще с Halloween'a, жаль этого не видно на видео):


main = writeMakeController "rigel" f where
f inp = Output {
servoSpeed0 = 545+leftSpeed,
servoSpeed1 = 550-rightSpeed,
servoSpeed2 = 550+leftSpeed,
servoSpeed3 = 540-rightSpeed
}
where
rightSpeed = larger (threshold 300 leftSensor)
(threshold 300 centreSensor)
leftSpeed = larger (threshold 300 rightSensor)
(threshold 300 centreSensor)
centreSensor = smooth $ adc0 inp
leftSensor = smooth $ adc5 inp
rightSensor = smooth $ adc4 inp
smooth x = (x + delay 0 x + delay 0 (delay 0 x) + delay 0 (delay 0 (delay 0 x)))/4
threshold m x = x />=/ m ? (256,0)
larger x y = x />=/y ? (x,y)


Код может быть не очень понятен, но мне нравится :).
Источник - A Neighborhood of Infinity