Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RoRoRoomba - Ruby on Rails on Roomba - RailsConf 2012

cwabbott
April 27, 2012

RoRoRoomba - Ruby on Rails on Roomba - RailsConf 2012

RoRoRoomba slides about the github.com/tokyorails/rrroomba project. Given at RailsConf 2012 in Austin, TX.

cwabbott

April 27, 2012
Tweet

Other Decks in Programming

Transcript

  1. • Charles Abbott • • Life in Japan www.forthecode.org •

    “The greatest obstacle... konnichiwa Friday, April 27, 2012
  2. “The greatest obstacle to discovery is not ignorance, but the

    illusion of knowledge” - Daniel J. Boorstin “Greatest obstacle... Friday, April 27, 2012
  3. Roomba on Ruby on Rails • SerialPort + Ruby controls

    Roomba • Rails site that routes remote requests • ??? • Profit! Friday, April 27, 2012
  4. Resources • http://hackingroomba.com/ (Open source Java package) • http://www.dprg.org/projects/ 2009-07a/

    • http://roombahacking.com/ roombahacks/roombacmd/ • http://www.arduino.cc/ Friday, April 27, 2012
  5. Debugging Pains [137] [255] [56] [1] [244] Disconnect, Connect, Disconnect

    Headless Documentation woes Friday, April 27, 2012
  6. Writing Code def initialize(port, baud=115200) @serial = SerialPort.new(port, baud, 8,

    1, SerialPort::NONE) sleep 0.2 api_setup_start sleep 0.1 api_setup_control end Friday, April 27, 2012
  7. Writing Opcodes # Must call this first to start the

    serial command interface def api_setup_start write(128) end # Enables user control of Roomba, puts SCI in safe mode def api_setup_control write(130) end # Starts a normal cleaning cycle. def api_clean write(135) end Friday, April 27, 2012
  8. Modeling the ROI # api_drive(255, 0, 0, 0) //go backward

    # api_drive(0, 255, 0, 0) //go forward # api_drive(0, 0, 0, 0) // stop def api_drive(velocity_high, velocity_low, radius_high, radius_low) write(137, velocity_high, velocity_low, radius_high, radius_low) end Friday, April 27, 2012
  9. The Bottom of the Barrel def write(*args) args.each do |a|

    @serial.write a.chr end end Friday, April 27, 2012
  10. The Bottom of the Barrel def read(timeout=50) @serial.read_timeout= timeout bytes

    = [] until (x = @serial.getbyte).nil? bytes.push(x) end bytes end Friday, April 27, 2012
  11. Pulling it Together ls /dev/tty.* find your serial device then

    jump into rails console roo = Roomba.new(“/dev/tty.usbserial-xxx”) => #<Roomba:0x00000103e5bec0 @serial=#<SerialPort:fd 9>> Friday, April 27, 2012
  12. “Hello Roomba” Demo “Don’t Assume It--Prove It” - Tip, The

    Pragmatic Programmer Friday, April 27, 2012
  13. Dealing With Binary down the rabbit hole def signed_integer(bytes) case

    bytes.size when 1 return (bytes[0] & ~(1 << 7)) - (bytes[0] & (1 << 7)) when 2 sixteenbit = bytes[0] << 8 | bytes[1] return (sixteenbit & ~(1 << 15)) - (sixteenbit & (1 << 15)) end end learn more: http://en.wikipedia.org/wiki/Two%27s_complement#Calculating_two.27s_complement Friday, April 27, 2012
  14. Distance & Time # distance is in mm # velocity

    is in mm/s (-500 to 500) def move(distance, degree=0, velocity=200) distance = distance.to_i.abs #distance can never be negative if distance == 0 #not moving, just spinning on axis # time = wheelbase * PI / 360degrees * degrees / velocity ABS time_in_seconds = calculate_spin_time(velocity, degree) else time_in_seconds = (distance.to_f / velocity.to_f).abs end Friday, April 27, 2012
  15. High Byte, Low Byte # distance is in mm #

    velocity is in mm/s (-500 to 500) def move(distance, degree=0, velocity=200) distance = distance.to_i.abs #distance can never be negative if distance == 0 #not moving, just spinning on axis # time = wheelbase * PI / 360degrees * degrees / velocity ABS # wheelbase might be different for different roombas time_in_seconds = calculate_spin_time(velocity, degree) # now that we know how long to spin, set degree to 1 so it will spin roomba instead of put it on an arc degree = 1 else time_in_seconds = (distance.to_f / velocity.to_f).abs end set_velocity(velocity) set_degree(degree) Friday, April 27, 2012
  16. Move! api_drive(@velocity_high, @velocity_low, @radius_high, @radius_low) start_moving = Time.now until (start_moving

    - Time.now).abs >= time_in_seconds sensors = get_readings(:bumps_and_drops, :wall) break if sensors[:bumps_and_drops][:formatted].to_i(2) > 0 end api_drive(0,0,0,0) sensors Friday, April 27, 2012
  17. Cut out the Middle Men *Arduino is still awesome, and

    I encourage you to try it. Friday, April 27, 2012
  18. SerialPort || TCPSocket All we need is an IP address

    and a Port! Friday, April 27, 2012
  19. All you get is #$@#! Pitfall #3 .4....U. ......V. .-....L.

    .7....T. ./....S. .0....O. .4....V. .-....S. .0....Y. .*....V. .-....U. ......R. .1....W. .,....R. .1....V. .-....S. .0....N. .5....[. .(....M. .6....R. .1....Q. .2....V. .-....P. .3....Y. .*....S. .0....U. ......L. .7....T. ./....R. .1...... ......+. .`....N. .=...... ........ ......H. .B...... ........ ........ ......e. .!...... ........ .l....,. .W....V. .-....R. .1....M. .6....B. .A....V. .-....V. .-....N. .5....H. .;....T. ./....L. .7....M. .6....H. .;....K. .8....S. .0....U. ......O. .4....U. ......Q. .2....P. .3....R. .1....W. .,....U. ......I. .:....T. ./....L. .7....M. .6....Q. .2....L. .7....U. ......P. .3....O. .4....W. .,....L. .7....U. ......V. .-....Z. .)....Q. .2....V. .-....^. .%....Q. .2....O. .4....M. .6....Q. .2....T. ./....M. .6....X. .+....N. .5....N. .5....U. ......R. .1....`. .#....Q. .2....U. ......R. .1....J. .9....P. .3....O. .4....[. .(....R. .1....X. .+....Y. .*....S. .0....T. ./....Y. .*....Y. .*....\. .'....T. ./....W. .,....U. ......Q. .2....L. .7....T. ./....[. .(....V. .-....N. .5....Q. .2....U. ......N. .5....V. .-....Q. .2....T. ./....O. .4....U. ......Q. .2....O. .4....W. .,....N. .5....W. .,....S. .0....X. .+....S. .0....Q. .2....T. ./....L. .7....T. ./....V. .-....N. .5....S. .0....O. .4....N. .5....N. .5....P. .3....O. Friday, April 27, 2012
  20. All you get is #$@#! Pitfall #3 Solution #3: RTFM,

    again... Friday, April 27, 2012
  21. All you get is #$@#! Pitfall #3 Solution #3: RTFM,

    again... Friday, April 27, 2012
  22. Wifly Configuration P195:~ charles$ telnet 169.254.1.1 2000 Trying 169.254.1.1... Connected

    to 169.254.1.1. Escape character is '^]'. *HELLO* $$$ CMD set comm close 0 AOK <2.23>set comm open 0 <2.23>set sys printlvl 0 <2.23> save Storing in config <2.23> reboot Friday, April 27, 2012
  23. The Stateless Web Tax def initialize(port, baud=115200) sleep 0.2 api_setup_start

    sleep 0.1 api_setup_control Hurdle 2 Friday, April 27, 2012
  24. Socket Server Roomba Socket Server start server = TCPServer.open(port) #

    Socket to listen on roomba = Roomba.new(location) Thread.abort_on_exception = true loop do puts "Roomba Socket Server Running! (15 second timeout)" Thread.start(server.accept) do |client| # => Read the incoming TCP Socket request # => Pass the command to the roomba client.close # Disconnect from the client end end Pseudocode Hurdle 2 & 3 Friday, April 27, 2012
  25. Extended Demo “Coding Ain’t Done ‘Til All The Tests Run”

    - Tip 63, The Pragmatic Programmer Friday, April 27, 2012
  26. Testing Drones • How do you run software tests on

    something in the physical world? Friday, April 27, 2012
  27. Challenges If i tape a marker on Roomba... Map out

    a room... Friday, April 27, 2012
  28. Already http://techcrunch.com/2012/02/14/the-number-of-mobile-devices-will-exceed-worlds- population-by-2012-other-shocking-figures/ “By 2016, there will be 1.4 mobile

    devices per capita. That year, there will be over 10 billion mobile- connected devices, including machine-to-machine (M2M) modules.” Friday, April 27, 2012
  29. People then Things Ericsson White Paper 284 23-3149 Uen |

    February 2011 Friday, April 27, 2012
  30. “A Pragmatic Philosophy” Invest Regularly in Your Knowledge Portfolio -

    Tip 8, The Pragmatic Programmer “Simon Stevin!” Friday, April 27, 2012
  31. Who is Simon Stevin? •waterway, spillways, sluices •navigation, steering •interest

    rate tables •The Art of Fortification •Copernican system •treatise on perspective •musical tuning •civil unrest handbook •Trigonometry •hydrostatic paradox •optics, geography, philosophy •and more... Friday, April 27, 2012
  32. Changes the World “What seems a wonder, is not really

    a wonder.” - Simon Stevin Friday, April 27, 2012