artoo 0.5.0 → 1.0.0.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/.yardopts +1 -1
- data/CONTRIBUTORS.md +16 -0
- data/Gemfile +10 -9
- data/Gemfile.lock +31 -35
- data/README.md +110 -19
- data/Rakefile +0 -1
- data/api/assets/javascripts/artoo/controllers/robot.js.coffee +5 -8
- data/api/public/core.js +7 -12
- data/api/public/partials/robot-detail.html +1 -1
- data/bin/robi +1 -1
- data/examples/christmas_roomba.rb +16 -19
- data/examples/hello_api_multiple.rb +3 -2
- data/examples/notifications.rb +2 -2
- data/examples/sphero_messages.rb +9 -3
- data/lib/artoo/adaptors/test.rb +28 -0
- data/lib/artoo/connection.rb +5 -0
- data/lib/artoo/delegator.rb +1 -1
- data/lib/artoo/device.rb +13 -0
- data/lib/artoo/drivers/counter.rb +28 -0
- data/lib/artoo/drivers/pinger.rb +8 -11
- data/lib/artoo/drivers/random.rb +27 -0
- data/lib/artoo/drivers/test.rb +23 -0
- data/lib/artoo/master.rb +4 -2
- data/lib/artoo/robot.rb +11 -103
- data/lib/artoo/robot_class_methods.rb +147 -0
- data/lib/artoo/version.rb +1 -1
- data/test/robot_test.rb +3 -3
- data/test/test_helper.rb +1 -2
- metadata +10 -44
- data/bin/sphero.sh +0 -8
- data/bin/sphero_linux_bind.sh +0 -25
- data/bin/sphero_linux_socat.sh +0 -8
- data/examples/sphero2.rb +0 -26
- data/lib/artoo/adaptors/ardrone.rb +0 -41
- data/lib/artoo/adaptors/ardrone_navigation.rb +0 -33
- data/lib/artoo/adaptors/ardrone_video.rb +0 -35
- data/lib/artoo/adaptors/firmata.rb +0 -33
- data/lib/artoo/adaptors/roomba.rb +0 -51
- data/lib/artoo/adaptors/sphero.rb +0 -58
- data/lib/artoo/drivers/ardrone.rb +0 -15
- data/lib/artoo/drivers/ardrone_navigation.rb +0 -25
- data/lib/artoo/drivers/ardrone_video.rb +0 -27
- data/lib/artoo/drivers/button.rb +0 -59
- data/lib/artoo/drivers/led.rb +0 -48
- data/lib/artoo/drivers/motor.rb +0 -69
- data/lib/artoo/drivers/pinger2.rb +0 -27
- data/lib/artoo/drivers/roomba.rb +0 -179
- data/lib/artoo/drivers/servo.rb +0 -59
- data/lib/artoo/drivers/sphero.rb +0 -105
- data/lib/artoo/drivers/wiichuck.rb +0 -61
- data/lib/artoo/drivers/wiiclassic.rb +0 -139
- data/lib/artoo/drivers/wiidriver.rb +0 -102
- data/test/adaptors/ardrone_test.rb +0 -24
- data/test/adaptors/firmata_test.rb +0 -25
- data/test/adaptors/sphero_test.rb +0 -24
- data/test/drivers/ardrone_navigation_test.rb +0 -11
- data/test/drivers/ardrone_test.rb +0 -11
- data/test/drivers/ardrone_video_test.rb +0 -11
- data/test/drivers/led_test.rb +0 -56
- data/test/drivers/motor_test.rb +0 -40
- data/test/drivers/roomba_test.rb +0 -87
- data/test/drivers/servo_test.rb +0 -45
- data/test/drivers/sphero_test.rb +0 -54
- data/test/drivers/wiichuck_test.rb +0 -11
- data/test/drivers/wiiclassic_test.rb +0 -11
- data/test/drivers/wiidriver_test.rb +0 -54
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'artoo/adaptors/adaptor'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Adaptors
|
5
|
-
# Connect to a ARDrone 2.0 video data stream
|
6
|
-
# @see http://rubydoc.info/gems/hybridgroup-argus/0.2.0/Argus/TcpVideoStreamer TCP Video Streamer Documentation
|
7
|
-
# @see http://rubydoc.info/gems/hybridgroup-argus/0.2.0/Argus/PaVEParser PaVEParser Documentation
|
8
|
-
class ArdroneVideo < Adaptor
|
9
|
-
attr_reader :ardrone, :video_parser
|
10
|
-
|
11
|
-
# Creates connection to Argus TCP Video Streamer and
|
12
|
-
# Argus PaVE Parser starting a stream with ardrone device
|
13
|
-
# @return [Boolean]
|
14
|
-
def connect
|
15
|
-
require 'argus' unless defined?(::Argus)
|
16
|
-
@ardrone = Argus::VideoStreamer.new(connect_to_tcp, port.host, port.port)
|
17
|
-
@ardrone.start(connect_to_udp)
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
# Closes ardrone connection
|
22
|
-
# @return [Boolean]
|
23
|
-
def disconnect
|
24
|
-
ardrone.close
|
25
|
-
super
|
26
|
-
end
|
27
|
-
|
28
|
-
# Calls ardrone actions using method missing
|
29
|
-
# @see https://github.com/hybridgroup/argus/blob/master/lib/argus/drone.rb hybridgroup-argus Drone
|
30
|
-
def method_missing(method_name, *arguments, &block)
|
31
|
-
ardrone.send(method_name, *arguments, &block)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'artoo/adaptors/adaptor'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Adaptors
|
5
|
-
# Connect to Arduino using Firmata
|
6
|
-
# @see http://rubydoc.info/gems/hybridgroup-firmata/0.3.0/Firmata/Board HybridGroup Firmata Documentation
|
7
|
-
class Firmata < Adaptor
|
8
|
-
attr_reader :firmata
|
9
|
-
|
10
|
-
# Creates connection with firmata board
|
11
|
-
# @return [Boolean]
|
12
|
-
def connect
|
13
|
-
require 'firmata' unless defined?(::Firmata)
|
14
|
-
@firmata = ::Firmata::Board.new(connect_to)
|
15
|
-
@firmata.connect
|
16
|
-
super
|
17
|
-
return true
|
18
|
-
end
|
19
|
-
|
20
|
-
# Closes connection with firmata board
|
21
|
-
# @return [Boolean]
|
22
|
-
def disconnect
|
23
|
-
super
|
24
|
-
end
|
25
|
-
|
26
|
-
# Uses method missing to call Firmata Board methods
|
27
|
-
# @see http://rubydoc.info/gems/hybridgroup-firmata/0.3.0/Firmata/Board Firmata Board Documentation
|
28
|
-
def method_missing(method_name, *arguments, &block)
|
29
|
-
firmata.send(method_name, *arguments, &block)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'artoo/adaptors/adaptor'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Adaptors
|
5
|
-
# Connect to a Roomba
|
6
|
-
# @see http://www.irobot.com/en/us/robots/Educators/Create.aspx Roomba information
|
7
|
-
class Roomba < Adaptor
|
8
|
-
finalizer :finalize
|
9
|
-
attr_reader :sp
|
10
|
-
|
11
|
-
# Closes connection if already connected
|
12
|
-
# @return [Boolean]
|
13
|
-
def finalize
|
14
|
-
if connected?
|
15
|
-
@sp.close
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# Creates serial or tcp connection
|
20
|
-
# @return [Boolean]
|
21
|
-
def connect
|
22
|
-
if port.is_serial?
|
23
|
-
@sp = connect_to_serial
|
24
|
-
@sp.dtr = 0
|
25
|
-
@sp.rts = 0
|
26
|
-
else
|
27
|
-
@sp = connect_to_tcp
|
28
|
-
end
|
29
|
-
super
|
30
|
-
end
|
31
|
-
|
32
|
-
# Send bytes to device
|
33
|
-
def send_bytes(bytes)
|
34
|
-
bytes = [bytes] unless bytes.respond_to?(:map)
|
35
|
-
bytes.map!(&:chr)
|
36
|
-
Logger.debug "sending: #{bytes.inspect}"
|
37
|
-
res = []
|
38
|
-
bytes.each{|b| res << @sp.write(b) }
|
39
|
-
Logger.debug "returned: #{res.inspect}"
|
40
|
-
end
|
41
|
-
|
42
|
-
# Closes connection to device
|
43
|
-
# @return [Boolean]
|
44
|
-
def disconnect
|
45
|
-
@sp.close
|
46
|
-
super
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'artoo/adaptors/adaptor'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Adaptors
|
5
|
-
# Connect to a Sphero device
|
6
|
-
# @see http://gosphero.com Sphero information
|
7
|
-
# @see http://rubydoc.info/gems/hybridgroup-sphero HybridGroup Sphero Documentation
|
8
|
-
class Sphero < Adaptor
|
9
|
-
finalizer :finalize
|
10
|
-
attr_reader :sphero
|
11
|
-
|
12
|
-
# Number of retries when connecting
|
13
|
-
RETRY_COUNT = 5
|
14
|
-
|
15
|
-
# Closes connection with device if connected
|
16
|
-
# @return [Boolean]
|
17
|
-
def finalize
|
18
|
-
if connected?
|
19
|
-
sphero.close
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Creates a connection with Sphero object with retries
|
24
|
-
# @return [Boolean]
|
25
|
-
def connect
|
26
|
-
@retries_left = RETRY_COUNT
|
27
|
-
require 'sphero' unless defined?(::Sphero)
|
28
|
-
begin
|
29
|
-
@sphero = ::Sphero.new(connect_to)
|
30
|
-
super
|
31
|
-
return true
|
32
|
-
rescue Errno::EBUSY => e
|
33
|
-
@retries_left -= 1
|
34
|
-
if @retries_left > 0
|
35
|
-
retry
|
36
|
-
else
|
37
|
-
Logger.error e.message
|
38
|
-
Logger.error e.backtrace.inspect
|
39
|
-
return false
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Closes connection with device
|
45
|
-
# @return [Boolean]
|
46
|
-
def disconnect
|
47
|
-
sphero.close
|
48
|
-
super
|
49
|
-
end
|
50
|
-
|
51
|
-
# Uses method missing to call sphero actions
|
52
|
-
# @see http://rubydoc.info/gems/hybridgroup-sphero/Sphero Sphero documentation
|
53
|
-
def method_missing(method_name, *arguments, &block)
|
54
|
-
sphero.send(method_name, *arguments, &block)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Ardrone driver behaviors
|
6
|
-
# @see https://github.com/hybridgroup/argus/blob/master/lib/argus/drone.rb Argus::Drone docs for supported actions
|
7
|
-
class Ardrone < Driver
|
8
|
-
COMMANDS = [:start, :stop, :hover, :land, :take_off, :emergency, :front_camera, :bottom_camera, :up, :down, :left, :right, :forward, :backward, :turn_left, :turn_right].freeze
|
9
|
-
|
10
|
-
def start
|
11
|
-
connection.start(false) # send false, so Argus does not use NavMonitor
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Ardrone navigation driver behaviors
|
6
|
-
class ArdroneNavigation < Driver
|
7
|
-
|
8
|
-
# Starts driver and handle updates from device
|
9
|
-
def start_driver
|
10
|
-
every(interval) do
|
11
|
-
handle_update
|
12
|
-
end
|
13
|
-
|
14
|
-
super
|
15
|
-
end
|
16
|
-
|
17
|
-
# Receives data from navigation and publishes
|
18
|
-
# and event in update topic for it
|
19
|
-
def handle_update
|
20
|
-
navdata = connection.receive_data
|
21
|
-
publish(event_topic_name("update"), navdata)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Ardrone video driver behaviors
|
6
|
-
class ArdroneVideo < Driver
|
7
|
-
|
8
|
-
# Starts drives and handles video frame
|
9
|
-
def start_driver
|
10
|
-
every(interval) do
|
11
|
-
handle_frame
|
12
|
-
end
|
13
|
-
|
14
|
-
super
|
15
|
-
end
|
16
|
-
|
17
|
-
# Retrieves frame from video connection
|
18
|
-
# and publishes data to update and frame
|
19
|
-
# event topics
|
20
|
-
def handle_frame(*params)
|
21
|
-
video = connection.receive_data
|
22
|
-
publish(event_topic_name("update"), "video", video)
|
23
|
-
publish(event_topic_name("frame"), video.frame)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/artoo/drivers/button.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Button driver behaviors for Firmata
|
6
|
-
class Button < Driver
|
7
|
-
COMMANDS = [:is_pressed?].freeze
|
8
|
-
|
9
|
-
DOWN = 1
|
10
|
-
UP = 0
|
11
|
-
|
12
|
-
# @return [Boolean] True if pressed
|
13
|
-
def is_pressed?
|
14
|
-
(@is_pressed ||= false) == true
|
15
|
-
end
|
16
|
-
|
17
|
-
# Sets values to read and write from button
|
18
|
-
# and starts driver
|
19
|
-
def start_driver
|
20
|
-
connection.set_pin_mode(pin, Firmata::Board::INPUT)
|
21
|
-
connection.toggle_pin_reporting(pin)
|
22
|
-
|
23
|
-
every(interval) do
|
24
|
-
connection.read_and_process
|
25
|
-
handle_events
|
26
|
-
end
|
27
|
-
|
28
|
-
super
|
29
|
-
end
|
30
|
-
|
31
|
-
def handle_events
|
32
|
-
while i = find_event("digital-read-#{pin}") do
|
33
|
-
update(events.slice!(i).data.first)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def find_event(name)
|
38
|
-
events.index {|e| e.name == name}
|
39
|
-
end
|
40
|
-
|
41
|
-
def events
|
42
|
-
connection.async_events
|
43
|
-
end
|
44
|
-
|
45
|
-
# Publishes events according to the button feedback
|
46
|
-
def update(value)
|
47
|
-
if value == DOWN
|
48
|
-
@is_pressed = true
|
49
|
-
publish(event_topic_name("update"), "push", value)
|
50
|
-
publish(event_topic_name("push"), value)
|
51
|
-
else
|
52
|
-
@is_pressed = false
|
53
|
-
publish(event_topic_name("update"), "release", value)
|
54
|
-
publish(event_topic_name("release"), value)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/lib/artoo/drivers/led.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# The LED driver behaviors
|
6
|
-
class Led < Driver
|
7
|
-
|
8
|
-
COMMANDS = [:on, :off, :toggle, :brightness].freeze
|
9
|
-
|
10
|
-
# @return [Boolean] True if on
|
11
|
-
def is_on?
|
12
|
-
(@is_on ||= false) == true
|
13
|
-
end
|
14
|
-
|
15
|
-
# @return [Boolean] True if off
|
16
|
-
def is_off?
|
17
|
-
(@is_on ||= false) == false
|
18
|
-
end
|
19
|
-
|
20
|
-
# Sets led to on status
|
21
|
-
def on
|
22
|
-
@is_on = true
|
23
|
-
connection.set_pin_mode(pin, Firmata::Board::OUTPUT)
|
24
|
-
connection.digital_write(pin, Firmata::Board::HIGH)
|
25
|
-
end
|
26
|
-
|
27
|
-
# Sets led to off status
|
28
|
-
def off
|
29
|
-
@is_on = false
|
30
|
-
connection.set_pin_mode(pin, Firmata::Board::OUTPUT)
|
31
|
-
connection.digital_write(pin, Firmata::Board::LOW)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Toggle status
|
35
|
-
# @example on > off, off > on
|
36
|
-
def toggle
|
37
|
-
is_off? ? on : off
|
38
|
-
end
|
39
|
-
|
40
|
-
# Change brightness level
|
41
|
-
# @param [Integer] level
|
42
|
-
def brightness(level=0)
|
43
|
-
connection.set_pin_mode(pin, Firmata::Board::PWM)
|
44
|
-
connection.analog_write(pin, level)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
data/lib/artoo/drivers/motor.rb
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# L293 or other H-bridge style motor driver behaviors for Firmata
|
6
|
-
class Motor < Driver
|
7
|
-
COMMANDS = [:forward, :backward, :stop, :speed, :current_speed].freeze
|
8
|
-
|
9
|
-
attr_reader :leg1_pin, :leg2_pin, :speed_pin, :current_speed
|
10
|
-
|
11
|
-
# Create new Motor
|
12
|
-
def initialize(params={})
|
13
|
-
super
|
14
|
-
|
15
|
-
raise "Invalid pins, please pass an array in format [leg1, leg2, speed]" unless (pin && pin.is_a?(Array) && pin.size == 3)
|
16
|
-
@leg1_pin = pin[0]
|
17
|
-
@leg2_pin = pin[1]
|
18
|
-
@speed_pin = pin[2]
|
19
|
-
@current_speed = 0
|
20
|
-
end
|
21
|
-
|
22
|
-
# Starts connection to read and process and driver
|
23
|
-
def start_driver
|
24
|
-
every(interval) do
|
25
|
-
connection.read_and_process
|
26
|
-
end
|
27
|
-
|
28
|
-
super
|
29
|
-
end
|
30
|
-
|
31
|
-
# Sets movement forward
|
32
|
-
# @param [Integer] s speed
|
33
|
-
def forward(s)
|
34
|
-
set_legs(Firmata::Board::LOW, Firmata::Board::HIGH)
|
35
|
-
speed(s)
|
36
|
-
end
|
37
|
-
|
38
|
-
# Sets movement backward
|
39
|
-
# @param [Integer] s speed
|
40
|
-
def backward(s)
|
41
|
-
set_legs(Firmata::Board::HIGH, Firmata::Board::LOW)
|
42
|
-
speed(s)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Stops
|
46
|
-
def stop
|
47
|
-
speed(0)
|
48
|
-
end
|
49
|
-
|
50
|
-
# Set motor speed
|
51
|
-
# @param [Integer] s speed (must be an integer between 0-255)
|
52
|
-
def speed(s)
|
53
|
-
raise "Motor speed must be an integer between 0-255" unless (s.is_a?(Numeric) && s >= 0 && s <= 255)
|
54
|
-
@current_speed = s
|
55
|
-
connection.set_pin_mode(speed_pin, Firmata::Board::PWM)
|
56
|
-
connection.analog_write(speed_pin, s)
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def set_legs(l1, l2)
|
62
|
-
connection.set_pin_mode(leg1_pin, Firmata::Board::OUTPUT)
|
63
|
-
connection.digital_write(leg1_pin, l1)
|
64
|
-
connection.set_pin_mode(leg2_pin, Firmata::Board::OUTPUT)
|
65
|
-
connection.digital_write(leg2_pin, l2)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'artoo/drivers/driver'
|
2
|
-
|
3
|
-
module Artoo
|
4
|
-
module Drivers
|
5
|
-
# Pings itself
|
6
|
-
class Pinger2 < Driver
|
7
|
-
|
8
|
-
COMMANDS = [:ping].freeze
|
9
|
-
|
10
|
-
# Publishes events to update and alive event topics
|
11
|
-
# with random number
|
12
|
-
def start_driver
|
13
|
-
every(interval) do
|
14
|
-
@count = rand(100000)
|
15
|
-
publish(event_topic_name("update"), "alive", @count)
|
16
|
-
publish(event_topic_name("alive"), @count)
|
17
|
-
end
|
18
|
-
|
19
|
-
super
|
20
|
-
end
|
21
|
-
|
22
|
-
def ping
|
23
|
-
"pong"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|