ruby-player 0.5.1 → 0.6.0
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.
- data/NEWS.md +12 -0
- data/README.md +11 -8
- data/TODO.md +0 -6
- data/lib/ruby-player.rb +1 -0
- data/lib/ruby-player/aio.rb +73 -0
- data/lib/ruby-player/client.rb +10 -2
- data/lib/ruby-player/position2d.rb +30 -29
- data/lib/ruby-player/ranger.rb +3 -29
- data/lib/ruby-player/version.rb +1 -1
- data/ruby-player.gemspec +3 -3
- data/spec/aio_spec.rb +48 -0
- data/spec/client_spec.rb +14 -3
- data/spec/position2d_spec.rb +7 -0
- metadata +59 -20
data/NEWS.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## 2012-06-17 0.6.0
|
2
|
+
|
3
|
+
* Deleted deprecated methods.
|
4
|
+
* Added method Position2d#set_pose.
|
5
|
+
* Added alternate method for subscribing:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
robot.ranger(1) # eql robot.subscribe(:ranger, index: 1)
|
9
|
+
```
|
10
|
+
|
11
|
+
* Added *aio* interface.
|
12
|
+
|
1
13
|
## 2012-04-13 0.5.1
|
2
14
|
|
3
15
|
* Fixed bugs in XDR array for ActArray, BlobFinder and Ranger classes.
|
data/README.md
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
-
Ruby Player -
|
1
|
+
Ruby Player - client library for the Player (operation system for robots) in pure Ruby. [](http://travis-ci.org/flipback/ruby-player)
|
2
2
|
|
3
3
|
Summary
|
4
4
|
-------------------------------------
|
5
5
|
Ruby Player provide high level client library to access to Player server in pure Ruby.
|
6
6
|
|
7
|
-
This project is active developing now! *Please don't use it in serious projects.*
|
8
|
-
|
9
7
|
Why?
|
10
8
|
-------------------------------------
|
11
9
|
The Player project distributes bindings of client libraries for Ruby and Python but I think that this project has several reasons to be:
|
@@ -22,17 +20,19 @@ Install
|
|
22
20
|
Example
|
23
21
|
-------------------------------------
|
24
22
|
|
23
|
+
```ruby
|
25
24
|
require 'ruby-player'
|
26
25
|
Player::Client.connect("localhost") do |robot|
|
27
|
-
pos2d = robot.
|
28
|
-
ranger = robot.
|
26
|
+
pos2d = robot.position2d(1)
|
27
|
+
ranger = robot.ranger
|
29
28
|
pos2d.set_speed(vx: 1, vy: 0, va: 0.2)
|
30
29
|
#main loop
|
31
30
|
robot.loop do
|
32
31
|
puts "Position: x=%{px}, y=%{py}, a=%{pa}" % pos2d.state
|
33
|
-
puts "Rangers: #{ranger.collect
|
32
|
+
puts "Rangers: #{ranger.collect(&:range)}"
|
34
33
|
end
|
35
34
|
end
|
35
|
+
```
|
36
36
|
|
37
37
|
API coverage
|
38
38
|
-------------------------------------
|
@@ -40,6 +40,7 @@ The list of support objects and devices of Player.
|
|
40
40
|
|
41
41
|
* Client object
|
42
42
|
* ActArray
|
43
|
+
* AIO
|
43
44
|
* BlobFinder
|
44
45
|
* Gripper
|
45
46
|
* Position2d
|
@@ -57,13 +58,15 @@ Requirements
|
|
57
58
|
References
|
58
59
|
-------------------------------------
|
59
60
|
|
60
|
-
[Home page](http://
|
61
|
+
[Home page](http://flipback.github.com/ruby-player/)
|
62
|
+
|
63
|
+
[Wiki](https://github.com/flipback/ruby-player/wiki)
|
61
64
|
|
62
65
|
[Documentation](http://rubydoc.info/gems/ruby-player/)
|
63
66
|
|
64
67
|
[Player project](http://playerstage.sourceforge.net/)
|
65
68
|
|
66
|
-
[C API Player](http://playerstage.sourceforge.net/doc/Player-
|
69
|
+
[C API Player](http://playerstage.sourceforge.net/doc/Player-svn/player/group__player__clientlib__libplayerc.html)
|
67
70
|
|
68
71
|
Authors
|
69
72
|
-------------------------------------
|
data/TODO.md
CHANGED
@@ -5,10 +5,6 @@ For supported devices
|
|
5
5
|
|
6
6
|
Implement PLAYER_RANGER_DATA_RANGESTAMPED and PLAYER_RANGER_DATA_INTNSTAMPED
|
7
7
|
|
8
|
-
**position2d** - The position2d proxy provides an interface to a mobile robot base
|
9
|
-
|
10
|
-
Implement PLAYER_POSITION2D_CMD_POS command
|
11
|
-
|
12
8
|
Candidates for support
|
13
9
|
--------------------------------------
|
14
10
|
|
@@ -21,8 +17,6 @@ Candidates for support
|
|
21
17
|
Device proxies are not started to develop
|
22
18
|
--------------------------------------
|
23
19
|
|
24
|
-
**aio** - The aio proxy provides an interface to the analog input/output sensors.
|
25
|
-
|
26
20
|
**audio** - The audio proxy provides access to drivers supporting the audio_interface.
|
27
21
|
|
28
22
|
**blinkenlight** - The blinkenlight proxy provides an interface to a (possibly colored and/or blinking) indicator light.
|
data/lib/ruby-player.rb
CHANGED
@@ -0,0 +1,73 @@
|
|
1
|
+
# Ruby Player - Ruby client library for Player (tools for robots)
|
2
|
+
#
|
3
|
+
# Copyright (C) 2012 Aleksey Timin
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
|
15
|
+
module Player
|
16
|
+
# The aio interface provides access to an analog I/O device.
|
17
|
+
class AIO < Device
|
18
|
+
include Enumerable
|
19
|
+
|
20
|
+
attr_reader :state
|
21
|
+
|
22
|
+
def initialize(dev, client)
|
23
|
+
super
|
24
|
+
@state = { voltages: [] }
|
25
|
+
end
|
26
|
+
|
27
|
+
# The samples [V]
|
28
|
+
# @retrun [Array]
|
29
|
+
def voltages
|
30
|
+
state[:voltages]
|
31
|
+
end
|
32
|
+
|
33
|
+
# The aio interface allows for the voltage level on one output to be set
|
34
|
+
# @param id [Integer] which I/O output to command.
|
35
|
+
# @param voltage [Float] voltage level to set.
|
36
|
+
# @return [AIO] self
|
37
|
+
def set_voltage(id, voltage)
|
38
|
+
send_message(PLAYER_MSGTYPE_CMD, PLAYER_AIO_CMD_STATE, [id, voltage].pack("Ng"))
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def fill(hdr, msg)
|
43
|
+
case hdr.subtype
|
44
|
+
when PLAYER_AIO_DATA_STATE
|
45
|
+
read_state(msg)
|
46
|
+
else
|
47
|
+
unexpected_message hdr
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Get single sample [V]
|
52
|
+
# @return [Float]
|
53
|
+
def [](id)
|
54
|
+
state[:voltages][id]
|
55
|
+
end
|
56
|
+
|
57
|
+
# @see #set_voltage
|
58
|
+
def []=(id, voltage)
|
59
|
+
set_voltage(id, voltage)
|
60
|
+
end
|
61
|
+
|
62
|
+
def each
|
63
|
+
state[:voltages].each { |v| yield v }
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
def read_state(msg)
|
68
|
+
data = msg.unpack("NNg*")
|
69
|
+
@state[:voltages] = data[2..-1]
|
70
|
+
debug "Got voltages #{data[2..-1]}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/ruby-player/client.rb
CHANGED
@@ -137,10 +137,10 @@ module Player
|
|
137
137
|
# read device identifier
|
138
138
|
dev_addr = DevAddr.decode(msg[0,PLAYERXDR_DEVADDR_SIZE])
|
139
139
|
# read the granted access and driver name
|
140
|
-
data = msg[PLAYERXDR_DEVADDR_SIZE,8].unpack("
|
140
|
+
data = msg[PLAYERXDR_DEVADDR_SIZE,8].unpack("NN")
|
141
141
|
access = data[0]
|
142
142
|
# read driver name
|
143
|
-
drv_name = msg[-data[1]-
|
143
|
+
drv_name = msg[-data[1]-3..-1]
|
144
144
|
|
145
145
|
if access == PLAYER_ERROR_MODE
|
146
146
|
raise_error "Error subscribing to " + dev_addr.interface_name + ":" + dev_addr.index
|
@@ -219,5 +219,13 @@ module Player
|
|
219
219
|
debug "Read #{hdr}"
|
220
220
|
hdr
|
221
221
|
end
|
222
|
+
|
223
|
+
def method_missing(name, *args)
|
224
|
+
if Player.constants.include?("PLAYER_#{name.to_s.upcase}_CODE".to_sym)
|
225
|
+
subscribe(name, index:args[0], access:args[1])
|
226
|
+
else
|
227
|
+
super
|
228
|
+
end
|
229
|
+
end
|
222
230
|
end
|
223
231
|
end
|
@@ -14,7 +14,6 @@
|
|
14
14
|
|
15
15
|
module Player
|
16
16
|
# The position2d proxy provides an interface to a mobile robot base
|
17
|
-
# TODO: Implement PLAYER_POSITION2D_CMD_POS command
|
18
17
|
#
|
19
18
|
# @example
|
20
19
|
# # get proxy object
|
@@ -86,18 +85,6 @@ module Player
|
|
86
85
|
state[:stall] != 0
|
87
86
|
end
|
88
87
|
|
89
|
-
# @deprecated Use {#power?}
|
90
|
-
def power
|
91
|
-
warn "Method `power` is deprecated. Pleas use `power?`"
|
92
|
-
power?
|
93
|
-
end
|
94
|
-
|
95
|
-
# @deprecated Use {#state}
|
96
|
-
def position
|
97
|
-
warn "Method `position` is deprecated. Pleas use `data` for access to position"
|
98
|
-
state
|
99
|
-
end
|
100
|
-
|
101
88
|
# Query robot geometry
|
102
89
|
# @return [Position2d] self
|
103
90
|
def query_geom
|
@@ -112,12 +99,6 @@ module Player
|
|
112
99
|
self
|
113
100
|
end
|
114
101
|
|
115
|
-
# @deprecated Use {#power_on!}
|
116
|
-
def turn_on!
|
117
|
-
warn "Method `turn_on!` is deprecated. Pleas use `power_on!`"
|
118
|
-
power_on!
|
119
|
-
end
|
120
|
-
|
121
102
|
# Turn off motor
|
122
103
|
# @return [Position2d] self
|
123
104
|
def power_off!
|
@@ -125,12 +106,6 @@ module Player
|
|
125
106
|
self
|
126
107
|
end
|
127
108
|
|
128
|
-
# @deprecated Use {#power_off!}
|
129
|
-
def turn_off!
|
130
|
-
warn "Method `turn_off!` is deprecated. Pleas use `power_off!`"
|
131
|
-
power_off!
|
132
|
-
end
|
133
|
-
|
134
109
|
# @return [Position2d] self
|
135
110
|
def direct_speed_control!
|
136
111
|
send_message(PLAYER_MSGTYPE_REQ, PLAYER_POSITION2D_REQ_VELOCITY_MODE, [0].pack("N"))
|
@@ -233,7 +208,7 @@ module Player
|
|
233
208
|
# @option speeds :va rotational speed (rad/s).
|
234
209
|
# @option speeds :stall state of motor
|
235
210
|
# @return [Position2d] self
|
236
|
-
def set_speed(speeds)
|
211
|
+
def set_speed(speeds={})
|
237
212
|
data = [
|
238
213
|
speeds[:vx] || @state[:vx],
|
239
214
|
speeds[:vy] || @state[:vy],
|
@@ -249,7 +224,7 @@ module Player
|
|
249
224
|
# @option speeds :vx forward speed (m/s)
|
250
225
|
# @option speeds :a turning angle (rad).
|
251
226
|
# @return [Position2d] self
|
252
|
-
def set_car(speeds)
|
227
|
+
def set_car(speeds={})
|
253
228
|
data = [
|
254
229
|
speeds[:vx] || @state[:vx],
|
255
230
|
speeds[:a] || 0
|
@@ -264,15 +239,41 @@ module Player
|
|
264
239
|
# @option speeds :vx forward speed (m/s)
|
265
240
|
# @option speeds :a absolutle angle (rad).
|
266
241
|
# @return [Position2d] self
|
267
|
-
def set_speed_head(speeds)
|
242
|
+
def set_speed_head(speeds={})
|
268
243
|
data = [
|
269
244
|
speeds[:vx] || @state[:vx],
|
270
|
-
speeds[:a] || @state[:pa]
|
245
|
+
speeds[:a] || @state[:pa],
|
271
246
|
]
|
272
247
|
send_message(PLAYER_MSGTYPE_CMD, PLAYER_POSITION2D_CMD_VEL_HEAD, data.pack("GG"))
|
273
248
|
self
|
274
249
|
end
|
275
250
|
|
251
|
+
# Set the target pose with motion vel. (gx, gy, ga) is the target pose in the
|
252
|
+
# odometric coordinate system.
|
253
|
+
# @param [Hash] pose
|
254
|
+
# @option pose :gx x coordinate [m]
|
255
|
+
# @option pose :gy y coordinate [m]
|
256
|
+
# @option pose :ga angle [rad]
|
257
|
+
# @option pose :vx forward vel [m/s] (default current)
|
258
|
+
# @option pose :vy sideways vel [m/s] (default current)
|
259
|
+
# @option pose :va rotational speed [rad/s] (default current)
|
260
|
+
# @option pose :stall state of motor (default current)
|
261
|
+
# @return [Position2d] self
|
262
|
+
def set_pose(pose={})
|
263
|
+
data = [
|
264
|
+
pose[:gx].to_f,
|
265
|
+
pose[:gy].to_f,
|
266
|
+
pose[:ga].to_f,
|
267
|
+
pose[:vx] || @state[:vx],
|
268
|
+
pose[:vy] || @state[:vy],
|
269
|
+
pose[:va] || @state[:va],
|
270
|
+
pose[:stall] || @state[:stall]
|
271
|
+
]
|
272
|
+
|
273
|
+
send_message(PLAYER_MSGTYPE_CMD, PLAYER_POSITION2D_CMD_POS, data.pack("GGGGGGN"))
|
274
|
+
self
|
275
|
+
end
|
276
|
+
|
276
277
|
# Stop robot set speed to 0
|
277
278
|
# @return [Position2d] self
|
278
279
|
def stop!
|
data/lib/ruby-player/ranger.rb
CHANGED
@@ -15,19 +15,17 @@
|
|
15
15
|
module Player
|
16
16
|
# The ranger proxy provides an interface to the ranger sensors built into robots
|
17
17
|
# TODO Implement PLAYER_RANGER_DATA_RANGESTAMPED and PLAYER_RANGER_DATA_INTNSTAMPED
|
18
|
-
#
|
18
|
+
# TODO Implement state attr => { ranges: [0.0, 0.0], intensity: [0.0, 0.0] }
|
19
19
|
# @example
|
20
20
|
# ranger = robot.subscribe(:ranger, index: 0)
|
21
21
|
# ranger[0].range #=> 0.2
|
22
22
|
class Ranger < Device
|
23
23
|
include Enumerable
|
24
24
|
|
25
|
-
|
26
25
|
# Configuration of ranger
|
27
26
|
# @see #set_config
|
28
27
|
attr_reader :config
|
29
28
|
|
30
|
-
|
31
29
|
# Device geometry
|
32
30
|
# @return [Hash] geometry { :px, :py. :pz, :proll, :ppitch, :pyaw, :sw, :sl, :sh, :sensors => [geom of sensors] }
|
33
31
|
attr_reader :geom
|
@@ -39,18 +37,6 @@ module Player
|
|
39
37
|
@config = { min_angle: 0.0, max_angle: 0.0, angular_res: 0.0, min_range: 0.0, max_range: 0.0, range_res: 0.0, frequecy: 0.0 }
|
40
38
|
end
|
41
39
|
|
42
|
-
# @deprecated use `ranger.collect { |r| r.range }
|
43
|
-
def rangers
|
44
|
-
warn "Method `rangers` is deprecated. Pleas use `ranger.collect { |r| r.range }`"
|
45
|
-
@sensors.collect { |s| s.range }
|
46
|
-
end
|
47
|
-
|
48
|
-
# @deprecated use `ranger.collect { |r| r.intensity }
|
49
|
-
def intensities
|
50
|
-
warn "Method `intensities` is deprecated. Pleas use `ranger.collect { |r| r.intensity }`"
|
51
|
-
@sensors.collect { |s| s.intensity }
|
52
|
-
end
|
53
|
-
|
54
40
|
# Query ranger geometry
|
55
41
|
# @return [Ranger] self
|
56
42
|
def query_geom
|
@@ -65,12 +51,6 @@ module Player
|
|
65
51
|
self
|
66
52
|
end
|
67
53
|
|
68
|
-
# @deprecated Use {#power_on!}
|
69
|
-
def turn_on!
|
70
|
-
warn "Method `turn_on!` is deprecated. Pleas use `power_on!`"
|
71
|
-
power_on!
|
72
|
-
end
|
73
|
-
|
74
54
|
# Turn off ranger
|
75
55
|
# @return [Ranger] self
|
76
56
|
def power_off!
|
@@ -78,12 +58,6 @@ module Player
|
|
78
58
|
self
|
79
59
|
end
|
80
60
|
|
81
|
-
# @deprecated Use {#power_off!}
|
82
|
-
def turn_off!
|
83
|
-
warn "Method `turn_off!` is deprecated. Pleas use `power_off!`"
|
84
|
-
power_off!
|
85
|
-
end
|
86
|
-
|
87
61
|
# @return [Ranger] self
|
88
62
|
def intensity_enable!
|
89
63
|
send_message(PLAYER_MSGTYPE_REQ, PLAYER_RANGER_REQ_INTNS, [1].pack("N"))
|
@@ -122,6 +96,7 @@ module Player
|
|
122
96
|
def fill(hdr, msg)
|
123
97
|
case hdr.subtype
|
124
98
|
when PLAYER_RANGER_DATA_RANGE
|
99
|
+
# TODO: remove to separate method read_range
|
125
100
|
data = msg.unpack("NNG*")
|
126
101
|
data[2..-1].each_with_index do |r, i|
|
127
102
|
self[i].state[:range] = r
|
@@ -129,6 +104,7 @@ module Player
|
|
129
104
|
|
130
105
|
debug "Got rangers #{@sensors.collect { |s| s.state[:range] }}"
|
131
106
|
when PLAYER_RANGER_DATA_INTNS
|
107
|
+
# TODO: remove to separate method read_intns
|
132
108
|
data = msg.unpack("NNG*")
|
133
109
|
data[2..-1].each_with_index do |ints, i|
|
134
110
|
self[i].state[:intensity] = ints
|
@@ -196,8 +172,6 @@ module Player
|
|
196
172
|
.each_with_index { |k,j| self[i].geom[k] = sizes[3*i + j] }
|
197
173
|
debug("Got sizes for ##{i} sensor: sw=%.2f, sl=%.2f, sh=%.2f" % @sensors[i].geom.values[6,3])
|
198
174
|
end
|
199
|
-
|
200
175
|
end
|
201
|
-
|
202
176
|
end
|
203
177
|
end
|
data/lib/ruby-player/version.rb
CHANGED
data/ruby-player.gemspec
CHANGED
@@ -7,9 +7,9 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Player::VERSION
|
8
8
|
s.authors = ["Aleksey Timin"]
|
9
9
|
s.email = ["atimin@gmail.com"]
|
10
|
-
s.homepage = "http://
|
11
|
-
s.summary = %q{Ruby
|
12
|
-
s.description = %q{Ruby Player -
|
10
|
+
s.homepage = "http://flipback.github.com/ruby-player/"
|
11
|
+
s.summary = %q{Ruby player - client library for the Player (operation system for robots) in pure Ruby.}
|
12
|
+
s.description = %q{Ruby Player - client library for the Player (operation system for robots) in pure Ruby.}
|
13
13
|
|
14
14
|
s.files = `git ls-files`.split("\n")
|
15
15
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/spec/aio_spec.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/spec_helper"
|
2
|
+
|
3
|
+
include Player
|
4
|
+
describe AIO do
|
5
|
+
before do
|
6
|
+
client = mock_client
|
7
|
+
@aio = Player::AIO.new(
|
8
|
+
Player::DevAddr.new(host: 0, robot:0, interface: PLAYER_AIO_CODE, index: 0),
|
9
|
+
client
|
10
|
+
)
|
11
|
+
|
12
|
+
mock_sending_message(@aio)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have default values' do
|
16
|
+
@aio.state.should eql(voltages: [])
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should have #voltages attr' do
|
20
|
+
@aio.should_receive(:state).and_return(voltages: [0.2])
|
21
|
+
@aio.voltages.should eql([0.2])
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should set output' do
|
25
|
+
should_send_message(PLAYER_MSGTYPE_CMD, PLAYER_AIO_CMD_STATE, [0, 0.5].pack("Ng"))
|
26
|
+
@aio.set_voltage(0, 0.5)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should set output by #[]=' do
|
30
|
+
should_send_message(PLAYER_MSGTYPE_CMD, PLAYER_AIO_CMD_STATE, [0, 0.5].pack("Ng"))
|
31
|
+
@aio[0] = 0.5
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should fill data' do
|
35
|
+
msg = [ 4, 4, 0.5, 1.0, 2.0, 4.0 ].pack('NNg*')
|
36
|
+
@aio.fill(
|
37
|
+
Player::Header.from_a([0,0,PLAYER_AIO_CODE,0, PLAYER_MSGTYPE_DATA, PLAYER_AIO_DATA_STATE, 0.0, 0, msg.bytesize]),
|
38
|
+
msg
|
39
|
+
)
|
40
|
+
|
41
|
+
@aio.state[:voltages].should eql([0.5, 1.0, 2.0, 4.0])
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should implement Enumerable' do
|
45
|
+
@aio.stub(:state).and_return(voltages: [0.2, 0.4])
|
46
|
+
@aio.each_with_index { |v, i| v.should eql(@aio[i]) }
|
47
|
+
end
|
48
|
+
end
|
data/spec/client_spec.rb
CHANGED
@@ -124,22 +124,33 @@ describe Player::Client do
|
|
124
124
|
end
|
125
125
|
|
126
126
|
describe "Subscribe" do
|
127
|
-
def mock_subscribe(code, index=0)
|
127
|
+
def mock_subscribe(code, index=0, mode=PLAYER_OPEN_MODE)
|
128
128
|
should_send_message(
|
129
129
|
hdr(0, 0, 1, 0, PLAYER_MSGTYPE_REQ, PLAYER_PLAYER_REQ_DEV, 0.0, 0, 28),
|
130
|
-
[0, 0, code, index,
|
130
|
+
[0, 0, code, index, mode, 0, 0].pack("N*")
|
131
131
|
)
|
132
132
|
|
133
133
|
should_request_data
|
134
134
|
|
135
135
|
should_read_message(
|
136
136
|
hdr(16777343, 6665, PLAYER_PLAYER_CODE, 0, PLAYER_MSGTYPE_RESP_ACK, PLAYER_PLAYER_REQ_DEV, 0.0, 0, 35),
|
137
|
-
[0, 6665, code, index,
|
137
|
+
[0, 6665, code, index, mode, 5, 5].pack("N*") + "mock"
|
138
138
|
)
|
139
139
|
|
140
140
|
should_recive_sync
|
141
141
|
end
|
142
142
|
|
143
|
+
it 'should have alternate method for subscribing' do
|
144
|
+
mock_subscribe(PLAYER_POSITION2D_CODE)
|
145
|
+
@cl.position2d
|
146
|
+
|
147
|
+
mock_subscribe(PLAYER_RANGER_CODE, 1)
|
148
|
+
@cl.ranger(1)
|
149
|
+
|
150
|
+
mock_subscribe(PLAYER_GRIPPER_CODE, 2, PLAYER_CLOSE_MODE)
|
151
|
+
@cl.gripper(2, PLAYER_CLOSE_MODE)
|
152
|
+
end
|
153
|
+
|
143
154
|
it 'should for unique devices' do
|
144
155
|
mock_subscribe(PLAYER_POSITION2D_CODE)
|
145
156
|
@cl.subscribe("position2d")
|
data/spec/position2d_spec.rb
CHANGED
@@ -162,6 +162,13 @@ describe Player::Position2d do
|
|
162
162
|
@pos2d.set_speed_head(speed)
|
163
163
|
end
|
164
164
|
|
165
|
+
it 'should set pose' do
|
166
|
+
pose = { gx: 0.4, gy: 0.5, ga: 0.7, vx: 0.1, vy: 0.2, va: 0.3, stall: 1 }
|
167
|
+
should_send_message(PLAYER_MSGTYPE_CMD, PLAYER_POSITION2D_CMD_POS, pose.values.pack("GGGGGGN"))
|
168
|
+
|
169
|
+
@pos2d.set_pose(pose)
|
170
|
+
end
|
171
|
+
|
165
172
|
it 'should have stop' do
|
166
173
|
@pos2d.should_receive(:set_speed).with(vx: 0, vy: 0, va: 0)
|
167
174
|
@pos2d.stop!
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-player
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: isna
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 0.0.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.0.4
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '2.7'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '2.7'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: rake
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0.9'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.9'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: pry
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: yard
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: redcarpet
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ! '>='
|
@@ -76,10 +101,15 @@ dependencies:
|
|
76
101
|
version: '0'
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: guard-rspec
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
115
|
- - ! '>='
|
@@ -87,8 +117,14 @@ dependencies:
|
|
87
117
|
version: '0'
|
88
118
|
type: :development
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
91
|
-
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
description: Ruby Player - client library for the Player (operation system for robots)
|
127
|
+
in pure Ruby.
|
92
128
|
email:
|
93
129
|
- atimin@gmail.com
|
94
130
|
executables: []
|
@@ -110,6 +146,7 @@ files:
|
|
110
146
|
- lib/ruby-player.rb
|
111
147
|
- lib/ruby-player/actarray.rb
|
112
148
|
- lib/ruby-player/actuator.rb
|
149
|
+
- lib/ruby-player/aio.rb
|
113
150
|
- lib/ruby-player/blob.rb
|
114
151
|
- lib/ruby-player/blob_finder.rb
|
115
152
|
- lib/ruby-player/client.rb
|
@@ -127,6 +164,7 @@ files:
|
|
127
164
|
- ruby-player.gemspec
|
128
165
|
- spec/actarray_spec.rb
|
129
166
|
- spec/actuator_spec.rb
|
167
|
+
- spec/aio_spec.rb
|
130
168
|
- spec/blob_finder_spec.rb
|
131
169
|
- spec/blob_spec.rb
|
132
170
|
- spec/client_spec.rb
|
@@ -138,7 +176,7 @@ files:
|
|
138
176
|
- spec/power_spec.rb
|
139
177
|
- spec/ranger_spec.rb
|
140
178
|
- spec/spec_helper.rb
|
141
|
-
homepage: http://
|
179
|
+
homepage: http://flipback.github.com/ruby-player/
|
142
180
|
licenses: []
|
143
181
|
post_install_message:
|
144
182
|
rdoc_options: []
|
@@ -158,9 +196,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
196
|
version: '0'
|
159
197
|
requirements: []
|
160
198
|
rubyforge_project:
|
161
|
-
rubygems_version: 1.8.
|
199
|
+
rubygems_version: 1.8.23
|
162
200
|
signing_key:
|
163
201
|
specification_version: 3
|
164
|
-
summary: Ruby
|
202
|
+
summary: Ruby player - client library for the Player (operation system for robots)
|
203
|
+
in pure Ruby.
|
165
204
|
test_files: []
|
166
205
|
has_rdoc:
|