ruby-player 0.2.0 → 0.3.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 +5 -0
- data/README.md +2 -1
- data/examples/simple_example.rb +1 -1
- data/examples/world/test.cfg +1 -1
- data/examples/world/test.world +19 -0
- data/lib/ruby-player.rb +1 -0
- data/lib/ruby-player/common.rb +22 -0
- data/lib/ruby-player/gripper.rb +171 -0
- data/lib/ruby-player/position2d.rb +25 -26
- data/lib/ruby-player/power.rb +1 -4
- data/lib/ruby-player/ranger.rb +7 -8
- data/lib/ruby-player/version.rb +1 -1
- data/spec/gripper_spec.rb +122 -0
- data/spec/position2d_spec.rb +2 -2
- metadata +17 -15
data/NEWS.md
CHANGED
data/README.md
CHANGED
@@ -11,6 +11,7 @@ API coverage
|
|
11
11
|
The list of support objects and devices of Player.
|
12
12
|
|
13
13
|
* Client object
|
14
|
+
* Gripper
|
14
15
|
* Position2d
|
15
16
|
* Power
|
16
17
|
* Ranger
|
@@ -30,7 +31,7 @@ Example
|
|
30
31
|
pos2d.set_speed(vx: 1, vy: 0, va: 0.2)
|
31
32
|
#main loop
|
32
33
|
robot.loop do
|
33
|
-
puts "Position: x=%{px}, y=%{py}, a=%{pa}" % pos2d.
|
34
|
+
puts "Position: x=%{px}, y=%{py}, a=%{pa}" % pos2d.state
|
34
35
|
puts "Rangers: #{ranger.rangers}"
|
35
36
|
end
|
36
37
|
end
|
data/examples/simple_example.rb
CHANGED
@@ -4,7 +4,7 @@ Player::Client.connect("localhost") do |robot|
|
|
4
4
|
ranger = robot.subscribe(:ranger)
|
5
5
|
#main loop
|
6
6
|
robot.loop(0.05) do
|
7
|
-
puts "Position: x=%{px}, y=%{py}, a=%{pa}" % pos2d.
|
7
|
+
puts "Position: x=%{px}, y=%{py}, a=%{pa}" % pos2d.state
|
8
8
|
r = ranger.rangers
|
9
9
|
puts "Rangers: #{r}"
|
10
10
|
|
data/examples/world/test.cfg
CHANGED
data/examples/world/test.world
CHANGED
@@ -54,6 +54,11 @@ define bender_ranger ranger
|
|
54
54
|
)
|
55
55
|
)
|
56
56
|
|
57
|
+
define bender_gripper gripper
|
58
|
+
(
|
59
|
+
size [0.5 0.5 0.5]
|
60
|
+
)
|
61
|
+
|
57
62
|
define bender2dx position
|
58
63
|
(
|
59
64
|
color "grey"
|
@@ -72,6 +77,12 @@ define bender2dx position
|
|
72
77
|
drive "omni"
|
73
78
|
|
74
79
|
bender_ranger()
|
80
|
+
|
81
|
+
bender_gripper
|
82
|
+
(
|
83
|
+
pose [0.8 0 -0.80 0]
|
84
|
+
color "blue"
|
85
|
+
)
|
75
86
|
size [1 1 1]
|
76
87
|
)
|
77
88
|
|
@@ -81,6 +92,14 @@ carton
|
|
81
92
|
pose [ 3 0 0 0.0]
|
82
93
|
)
|
83
94
|
|
95
|
+
carton
|
96
|
+
(
|
97
|
+
name "b1"
|
98
|
+
pose [1 1 0 0.0]
|
99
|
+
size [0.2 0.2 0.5]
|
100
|
+
|
101
|
+
)
|
102
|
+
|
84
103
|
bender2dx
|
85
104
|
(
|
86
105
|
name "bender"
|
data/lib/ruby-player.rb
CHANGED
data/lib/ruby-player/common.rb
CHANGED
@@ -59,8 +59,30 @@ module Player
|
|
59
59
|
""
|
60
60
|
end
|
61
61
|
|
62
|
+
def fill_hash!(hash, ary)
|
63
|
+
hash.keys.each do |k|
|
64
|
+
if ary.empty?
|
65
|
+
break
|
66
|
+
else
|
67
|
+
hash[k] = ary.shift
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
62
72
|
def unexpected_message(hdr)
|
63
73
|
warn "Get unexpection message type #{hdr.type_name}::#{hdr.subtype_name} for #@addr"
|
64
74
|
end
|
75
|
+
|
76
|
+
def geom_to_s(geom)
|
77
|
+
"px=%.2f, py=%.2f, pz=%.2f, proll=%.2f, ppitch=%.2f, pyaw=%.2f, sw=%.2f, sl=%.2f, sh=%.2f" % geom.values
|
78
|
+
end
|
79
|
+
|
80
|
+
def pose_to_s(pose)
|
81
|
+
"px=%.2f, py=%.2f, pz=%.2f, proll=%.2f, ppitch=%.2f, pyaw=%.2f" % pose.values
|
82
|
+
end
|
83
|
+
|
84
|
+
def size_to_s(size)
|
85
|
+
"sw=%.2f, sl=%.2f, sh=%.2f" % size.values
|
86
|
+
end
|
65
87
|
end
|
66
88
|
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
# Ruby Player - Ruby client library for Player (tools for robots)
|
2
|
+
#
|
3
|
+
# Copyright (C) 2012 Timin Aleksey
|
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
|
+
# Gripper interface.
|
17
|
+
#
|
18
|
+
# The gripper interface provides access to a robotic gripper.
|
19
|
+
# A gripper is a device capable of closing around and carrying an object
|
20
|
+
# of suitable size and shape. On a mobile robot, a gripper is typically mounted near the floor on the front,
|
21
|
+
# or on the end of a robotic limb. Grippers typically have two "fingers" that close around an object. i
|
22
|
+
# Some grippers can detect whether an objcet is within the gripper (using, for example, light beams).
|
23
|
+
# Some grippers also have the ability to move the a carried object into a storage system,
|
24
|
+
# freeing the gripper to pick up a new object, and move objects from the storage system back into the gripper.
|
25
|
+
class Gripper < Device
|
26
|
+
# The gripper interface returns the current state of the gripper
|
27
|
+
# and information on a potential object in the gripper.
|
28
|
+
#
|
29
|
+
# *:state* may be PLAYER_GRIPPER_STATE_OPEN, PLAYER_GRIPPER_STATE_CLOSED,
|
30
|
+
# PLAYER_GRIPPER_STATE_MOVING or PLAYER_GRIPPER_STATE_ERROR.
|
31
|
+
#
|
32
|
+
# *:beams* provides information on how far into the gripper an object is.
|
33
|
+
# For most grippers, this will be a bit mask, with each bit representing whether
|
34
|
+
# a beam has been interrupted or not.
|
35
|
+
#
|
36
|
+
# *:stored* - Number of currently stored objects
|
37
|
+
#
|
38
|
+
# @return [Hash] { :state, :beams, :stored }
|
39
|
+
attr_reader :state
|
40
|
+
|
41
|
+
|
42
|
+
# Geometry data of gripper
|
43
|
+
#
|
44
|
+
# *:pose* - Gripper pose, in robot cs (m, m, m, rad, rad, rad).
|
45
|
+
#
|
46
|
+
# *:outer_size* - Outside dimensions of gripper (m, m, m).
|
47
|
+
#
|
48
|
+
# *:inner_size* - Inside dimensions of gripper, i.e.
|
49
|
+
#
|
50
|
+
# *:number_beams* - Number of breakbeams the gripper has.
|
51
|
+
#
|
52
|
+
# *:capacity* - Capacity for storing objects - if 0, then the gripper can't store.
|
53
|
+
#
|
54
|
+
# @return [Hash] { :pose => {:px,:py,:pz,:proll,:ppitch,:pyaw,
|
55
|
+
# :outer_size => { :sw, :sl, :sh },
|
56
|
+
# :inner_size => { :sw, :sl, :sh },
|
57
|
+
# :number_beams, :capacity
|
58
|
+
# }
|
59
|
+
attr_reader :geom
|
60
|
+
|
61
|
+
def initialize(addr, client)
|
62
|
+
super
|
63
|
+
@state = { state: PLAYER_GRIPPER_STATE_OPEN, beams: 0, stored: 0 }
|
64
|
+
@geom = {
|
65
|
+
pose: { px: 0.0, py: 0.0, pz: 0.0, proll: 0.0, ppitch: 0.0, pyaw: 0.0 },
|
66
|
+
outer_size: { sw: 0.0, sl: 0.0, sh: 0.0 },
|
67
|
+
inner_size: { sw: 0.0, sl: 0.0, sh: 0.0 },
|
68
|
+
number_beams: 0,
|
69
|
+
capacity: 0
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
# Query gripper geometry
|
74
|
+
# @return self
|
75
|
+
def query_geom
|
76
|
+
send_message(PLAYER_MSGTYPE_REQ, PLAYER_RANGER_REQ_GET_GEOM)
|
77
|
+
self
|
78
|
+
end
|
79
|
+
|
80
|
+
# Check openinig
|
81
|
+
def open?
|
82
|
+
state[:state] & PLAYER_GRIPPER_STATE_OPEN > 0
|
83
|
+
end
|
84
|
+
|
85
|
+
# Check closing
|
86
|
+
def closed?
|
87
|
+
state[:state] & PLAYER_GRIPPER_STATE_CLOSED > 0
|
88
|
+
end
|
89
|
+
|
90
|
+
# Check moving
|
91
|
+
def moving?
|
92
|
+
state[:state] & PLAYER_GRIPPER_STATE_MOVING > 0
|
93
|
+
end
|
94
|
+
|
95
|
+
# Check error
|
96
|
+
def error?
|
97
|
+
state[:state] & PLAYER_GRIPPER_STATE_ERROR > 0
|
98
|
+
end
|
99
|
+
|
100
|
+
# Tells the gripper to open
|
101
|
+
def open!
|
102
|
+
send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_OPEN)
|
103
|
+
self
|
104
|
+
end
|
105
|
+
|
106
|
+
# Tells the gripper to close
|
107
|
+
def close!
|
108
|
+
send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_CLOSE)
|
109
|
+
self
|
110
|
+
end
|
111
|
+
|
112
|
+
# Tells the gripper to stop
|
113
|
+
def stop!
|
114
|
+
send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_STOP)
|
115
|
+
self
|
116
|
+
end
|
117
|
+
|
118
|
+
# Tells the gripper to store whatever it is holding.
|
119
|
+
def store!
|
120
|
+
send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_STORE)
|
121
|
+
self
|
122
|
+
end
|
123
|
+
|
124
|
+
# Tells the gripper to retrieve a stored object (so that it can be put back into the world).
|
125
|
+
# The opposite of store.
|
126
|
+
def retrieve!
|
127
|
+
send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_RETRIEVE)
|
128
|
+
self
|
129
|
+
end
|
130
|
+
|
131
|
+
def fill(hdr, msg)
|
132
|
+
case hdr.subtype
|
133
|
+
when PLAYER_GRIPPER_DATA_STATE
|
134
|
+
read_state(msg)
|
135
|
+
else
|
136
|
+
undexpected_message hdr
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def handle_response(hdr, msg)
|
141
|
+
case hdr.subtype
|
142
|
+
when PLAYER_GRIPPER_REQ_GET_GEOM
|
143
|
+
read_geom(msg)
|
144
|
+
else
|
145
|
+
undexpected_message hdr
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
private
|
150
|
+
def read_state(msg)
|
151
|
+
fill_hash!(@state, msg.unpack("NNN"))
|
152
|
+
debug("Get gripper state state=%d, beams=%d, stored=%d" % @state.values)
|
153
|
+
end
|
154
|
+
|
155
|
+
def read_geom(msg)
|
156
|
+
data = msg.unpack("G12NN")
|
157
|
+
fill_hash!(@geom[:pose], data)
|
158
|
+
debug "Get gripper pose: " + pose_to_s(@geom[:pose])
|
159
|
+
|
160
|
+
fill_hash!(@geom[:outer_size], data)
|
161
|
+
debug "Get gripper outer size: " + size_to_s(@geom[:outer_size])
|
162
|
+
|
163
|
+
fill_hash!(@geom[:inner_size], data)
|
164
|
+
debug "Get gripper inner size: " + size_to_s(@geom[:inner_size])
|
165
|
+
|
166
|
+
@geom[:number_beams] = data.shift
|
167
|
+
@geom[:capacity] = data.shift
|
168
|
+
debug("Get number_beams=%{number_beams}, capacity=%{capacity}" % @geom)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -24,13 +24,13 @@ module Player
|
|
24
24
|
# #update data from server
|
25
25
|
# client.read!
|
26
26
|
# #read velocityand position by X,Y and angle
|
27
|
-
# pos2d.
|
27
|
+
# pos2d.state #=> { :px => 0.2321, :py => 0,01, :pa => 0.2, :vx => 1.2, :vy => 0.1, :va => 0.3, :stall => 1 }
|
28
28
|
# pos2d.stop!
|
29
29
|
class Position2d < Device
|
30
30
|
|
31
31
|
# Position of robot
|
32
32
|
# @return [Hash] hash position {:px, :py, :pa, :vx, :vy, :va, :stall }
|
33
|
-
attr_reader :
|
33
|
+
attr_reader :state
|
34
34
|
|
35
35
|
# Device geometry
|
36
36
|
# @return [Hash] geometry { :px, :py. :pz, :proll, :ppitch, :pyaw, :sw, :sl, :sh }
|
@@ -39,10 +39,16 @@ module Player
|
|
39
39
|
|
40
40
|
def initialize(addr, client)
|
41
41
|
super
|
42
|
-
@
|
42
|
+
@state = {px: 0.0, py: 0.0, pa: 0.0, vx: 0.0, vy: 0.0, va: 0.0, stall: 0}
|
43
43
|
@geom = {px: 0.0, py: 0.0, pz: 0.0, proll: 0.0, ppitch: 0.0, pyaw: 0.0, sw: 0.0, sl: 0.0, sh: 0.0}
|
44
44
|
end
|
45
45
|
|
46
|
+
# Depricated alias for data
|
47
|
+
def position
|
48
|
+
warn "Method `position` is deprecated. Pleas use `data` for access to position"
|
49
|
+
state
|
50
|
+
end
|
51
|
+
|
46
52
|
# Query robot geometry
|
47
53
|
# @return self
|
48
54
|
def query_geom
|
@@ -163,10 +169,10 @@ module Player
|
|
163
169
|
# @return self
|
164
170
|
def set_speed(speeds)
|
165
171
|
data = [
|
166
|
-
speeds[:vx] || @
|
167
|
-
speeds[:vy] || @
|
168
|
-
speeds[:va] || @
|
169
|
-
speeds[:stall] || @
|
172
|
+
speeds[:vx] || @state[:vx],
|
173
|
+
speeds[:vy] || @state[:vy],
|
174
|
+
speeds[:va] || @state[:va],
|
175
|
+
speeds[:stall] || @state[:stall]
|
170
176
|
]
|
171
177
|
send_message(PLAYER_MSGTYPE_CMD, PLAYER_POSITION2D_CMD_VEL, data.pack("GGGN"))
|
172
178
|
self
|
@@ -178,8 +184,8 @@ module Player
|
|
178
184
|
# @option speeds :a turning angle (rad).
|
179
185
|
def set_car(speeds)
|
180
186
|
data = [
|
181
|
-
speeds[:vx] || @
|
182
|
-
speeds[:a] || @
|
187
|
+
speeds[:vx] || @state[:vx],
|
188
|
+
speeds[:a] || @state[:pa]
|
183
189
|
]
|
184
190
|
send_message(PLAYER_MSGTYPE_CMD, PLAYER_POSITION2D_CMD_CAR, data.pack("GG"))
|
185
191
|
self
|
@@ -192,8 +198,8 @@ module Player
|
|
192
198
|
# @option speeds :a absolutle angle (rad).
|
193
199
|
def set_speed_head(speeds)
|
194
200
|
data = [
|
195
|
-
speeds[:vx] || @
|
196
|
-
speeds[:a] || @
|
201
|
+
speeds[:vx] || @state[:vx],
|
202
|
+
speeds[:a] || @state[:pa]
|
197
203
|
]
|
198
204
|
send_message(PLAYER_MSGTYPE_CMD, PLAYER_POSITION2D_CMD_VEL_HEAD, data.pack("GG"))
|
199
205
|
self
|
@@ -203,7 +209,7 @@ module Player
|
|
203
209
|
# State of motor
|
204
210
|
# @return [Boolean] true - on
|
205
211
|
def power
|
206
|
-
@
|
212
|
+
@state[:stall] == 1
|
207
213
|
end
|
208
214
|
|
209
215
|
# Stop robot set speed to 0
|
@@ -214,13 +220,13 @@ module Player
|
|
214
220
|
|
215
221
|
# Check of robot state
|
216
222
|
def stoped?
|
217
|
-
|
223
|
+
@state[:vx] == 0 && @state[:vy] == 0 && @state[:va] == 0
|
218
224
|
end
|
219
225
|
|
220
226
|
def fill(hdr, msg)
|
221
227
|
case hdr.subtype
|
222
228
|
when PLAYER_POSITION2D_DATA_STATE
|
223
|
-
|
229
|
+
read_state(msg)
|
224
230
|
when PLAYER_POSITION2D_DATA_GEOM
|
225
231
|
read_geom(msg)
|
226
232
|
else
|
@@ -240,21 +246,14 @@ module Player
|
|
240
246
|
end
|
241
247
|
|
242
248
|
private
|
243
|
-
def
|
244
|
-
|
245
|
-
|
246
|
-
@position[k] = data[i]
|
247
|
-
end
|
248
|
-
debug("Get position px=%.2f py=%.2f pa=%.2f; vx=%.2f, vy=%.2f, va=%.2f, stall=%d" % position.values)
|
249
|
+
def read_state(msg)
|
250
|
+
fill_hash!(@state, msg.unpack("GGGGGGN"))
|
251
|
+
debug("Get state px=%.2f py=%.2f pa=%.2f; vx=%.2f, vy=%.2f, va=%.2f, stall=%d" % @state.values)
|
249
252
|
end
|
250
253
|
|
251
254
|
def read_geom(msg)
|
252
|
-
|
253
|
-
|
254
|
-
@geom[k] = data[i]
|
255
|
-
end
|
256
|
-
debug("Get geom px=%.2f py=%.2f pz=%.2f; proll=%.2f, ppitch=%.2f, pyaw=%.2f, sw=%.2f, sl=%.2f, sh=%.2f" % @geom.values)
|
255
|
+
fill_hash!(@geom, msg.unpack("G*"))
|
256
|
+
debug "Get geom " + geom_to_s(@geom)
|
257
257
|
end
|
258
|
-
|
259
258
|
end
|
260
259
|
end
|
data/lib/ruby-player/power.rb
CHANGED
@@ -95,10 +95,7 @@ module Player
|
|
95
95
|
|
96
96
|
private
|
97
97
|
def read_state(msg)
|
98
|
-
|
99
|
-
@state.keys.each_with_index do |k,i|
|
100
|
-
@state[k] = data[i]
|
101
|
-
end
|
98
|
+
fill_hash!(@state, msg.unpack("NggggN"))
|
102
99
|
debug("Get power state valid=%x volts=%.2f, percent=%.2f, joules=%.2f; watts=%.2f, charging=%d" % @state.values)
|
103
100
|
end
|
104
101
|
end
|
data/lib/ruby-player/ranger.rb
CHANGED
@@ -129,22 +129,21 @@ module Player
|
|
129
129
|
when 2..4
|
130
130
|
nil
|
131
131
|
when PLAYER_RANGER_REQ_GET_CONFIG
|
132
|
-
|
133
|
-
[:min_angle, :max_angle, :angular_res, :min_range, :max_range, :range_res, :frequecy].each_with_index do |k,i|
|
134
|
-
@config[k] = data[i]
|
135
|
-
end
|
132
|
+
read_config(msg)
|
136
133
|
else
|
137
134
|
unexpected_message hdr
|
138
135
|
end
|
139
136
|
end
|
140
137
|
|
141
138
|
private
|
139
|
+
def read_config(msg)
|
140
|
+
fill_hash!(@config, msg.unpack("G*"))
|
141
|
+
end
|
142
|
+
|
142
143
|
def read_geom(msg)
|
143
144
|
data = msg[0,72].unpack("G*")
|
144
|
-
|
145
|
-
|
146
|
-
end
|
147
|
-
debug("Get geom px=%.2f py=%.2f pz=%.2f; proll=%.2f, ppitch=%.2f, pyaw=%.2f, sw=%.2f, sl=%.2f, sh=%.2f" % @geom.values)
|
145
|
+
fill_hash!(@geom, data)
|
146
|
+
debug("Get geom: " + geom_to_s(@geom))
|
148
147
|
|
149
148
|
|
150
149
|
p_count = msg[72,8].unpack("NN")
|
data/lib/ruby-player/version.rb
CHANGED
@@ -0,0 +1,122 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/spec_helper"
|
2
|
+
|
3
|
+
include Player
|
4
|
+
describe Player::Position2d do
|
5
|
+
before do
|
6
|
+
client = mock_client
|
7
|
+
@gripper = Player::Gripper.new(
|
8
|
+
Player::DevAddr.new(host: 0, robot:0, interface: PLAYER_GRIPPER_CODE, index: 0),
|
9
|
+
client
|
10
|
+
)
|
11
|
+
|
12
|
+
mock_sending_message(@gripper)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have default values' do
|
16
|
+
@gripper.state.should eql(state: PLAYER_GRIPPER_STATE_OPEN, beams: 0, stored: 0)
|
17
|
+
@gripper.geom.should eql(pose: { px: 0.0, py: 0.0, pz: 0.0, proll: 0.0, ppitch: 0.0, pyaw: 0.0 },
|
18
|
+
outer_size: { sw: 0.0, sl: 0.0, sh: 0.0 },
|
19
|
+
inner_size: { sw: 0.0, sl: 0.0, sh: 0.0 },
|
20
|
+
number_beams: 0,
|
21
|
+
capacity: 0
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should have open? attribute' do
|
26
|
+
@gripper.should_receive(:state).and_return(state: PLAYER_GRIPPER_STATE_OPEN)
|
27
|
+
@gripper.open?.should be_true
|
28
|
+
|
29
|
+
@gripper.should_receive(:state).and_return(state: 0)
|
30
|
+
@gripper.open?.should be_false
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should have closed? attribute' do
|
34
|
+
@gripper.should_receive(:state).and_return(state: PLAYER_GRIPPER_STATE_CLOSED)
|
35
|
+
@gripper.closed?.should be_true
|
36
|
+
|
37
|
+
@gripper.should_receive(:state).and_return(state: 0)
|
38
|
+
@gripper.closed?.should be_false
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should have moving? attribute' do
|
42
|
+
@gripper.should_receive(:state).and_return(state: PLAYER_GRIPPER_STATE_MOVING)
|
43
|
+
@gripper.moving?.should be_true
|
44
|
+
|
45
|
+
@gripper.should_receive(:state).and_return(state: 0)
|
46
|
+
@gripper.moving?.should be_false
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should have error? attribute' do
|
50
|
+
@gripper.should_receive(:state).and_return(state: PLAYER_GRIPPER_STATE_ERROR)
|
51
|
+
@gripper.error?.should be_true
|
52
|
+
|
53
|
+
@gripper.should_receive(:state).and_return(state: 0)
|
54
|
+
@gripper.error?.should be_false
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should open gripper' do
|
58
|
+
should_send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_OPEN)
|
59
|
+
@gripper.open!
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should close gripper' do
|
63
|
+
should_send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_CLOSE)
|
64
|
+
@gripper.close!
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should stop gripper' do
|
68
|
+
should_send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_STOP)
|
69
|
+
@gripper.stop!
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should store whatever it is holding' do
|
73
|
+
should_send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_STORE)
|
74
|
+
@gripper.store!
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should retrieve stored object' do
|
78
|
+
should_send_message(PLAYER_MSGTYPE_CMD, PLAYER_GRIPPER_CMD_RETRIEVE)
|
79
|
+
@gripper.retrieve!
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should query geom' do
|
83
|
+
should_send_message(PLAYER_MSGTYPE_REQ, PLAYER_GRIPPER_REQ_GET_GEOM)
|
84
|
+
@gripper.query_geom
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should fill state data' do
|
88
|
+
state = { state: PLAYER_GRIPPER_STATE_CLOSED, beams: 3, stored: 4 }
|
89
|
+
|
90
|
+
msg = state.values.pack("NNN")
|
91
|
+
@gripper.fill(
|
92
|
+
Player::Header.from_a([0,0,PLAYER_GRIPPER_CODE,0, PLAYER_MSGTYPE_DATA, PLAYER_POWER_DATA_STATE, 0.0, 0, msg.bytesize]),
|
93
|
+
msg
|
94
|
+
)
|
95
|
+
@gripper.state.should eql(state)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should get geom by request' do
|
99
|
+
geom = { pose: { px: 1.0, py: 2.0, pz: 3.0, proll: 4.0, ppitch: 5.0, pyaw: 6.0 },
|
100
|
+
outer_size: { sw: 7.0, sl: 8.0, sh: 9.0 },
|
101
|
+
inner_size: { sw: 10.0, sl: 11.0, sh: 12.0 },
|
102
|
+
number_beams: 13,
|
103
|
+
capacity: 14
|
104
|
+
}
|
105
|
+
|
106
|
+
msg = geom[:pose].values.pack("G*") + geom[:outer_size].values.pack("G*") + geom[:inner_size].values.pack("G*")
|
107
|
+
msg << [geom[:number_beams], geom[:capacity]].pack("NN")
|
108
|
+
@gripper.handle_response(
|
109
|
+
Player::Header.from_a([0,0,4,0, PLAYER_MSGTYPE_RESP_ACK, PLAYER_GRIPPER_REQ_GET_GEOM, 0.0, 0, msg.bytesize]),
|
110
|
+
msg
|
111
|
+
)
|
112
|
+
@gripper.geom.should eql(geom)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should not puts warn message for ACK subtypes 1' do
|
116
|
+
@gripper.should_not_receive(:unexpected_message)
|
117
|
+
@gripper.stub!(:read_geom)
|
118
|
+
@gripper.handle_response(
|
119
|
+
Player::Header.from_a([0,0,PLAYER_GRIPPER_CODE,0, PLAYER_MSGTYPE_RESP_ACK, PLAYER_GRIPPER_REQ_GET_GEOM, 0.0, 0, 0]),
|
120
|
+
"")
|
121
|
+
end
|
122
|
+
end
|
data/spec/position2d_spec.rb
CHANGED
@@ -13,7 +13,7 @@ describe Player::Position2d do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'should have default values' do
|
16
|
-
@pos2d.
|
16
|
+
@pos2d.state.should eql(px:0.0, py:0.0, pa:0.0, vx:0.0, vy:0.0, va:0.0, stall: 0)
|
17
17
|
@pos2d.geom.should eql(px:0.0, py:0.0, pz:0.0, proll:0.0, ppitch:0.0, pyaw:0.0, sw:0.0, sl:0.0, sh:0.0)
|
18
18
|
end
|
19
19
|
|
@@ -82,7 +82,7 @@ describe Player::Position2d do
|
|
82
82
|
Player::Header.from_a([0,0,4,0, PLAYER_MSGTYPE_DATA, PLAYER_POSITION2D_DATA_STATE, 0.0, 0, 52]),
|
83
83
|
pos.values.pack("GGGGGGN")
|
84
84
|
)
|
85
|
-
@pos2d.
|
85
|
+
@pos2d.state.should eql(pos)
|
86
86
|
end
|
87
87
|
|
88
88
|
it 'should fill geom data' do
|
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.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-16 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: isna
|
16
|
-
requirement: &
|
16
|
+
requirement: &18940320 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.0.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *18940320
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &18939820 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '2.7'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *18939820
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &18939180 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0.9'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *18939180
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: pry
|
49
|
-
requirement: &
|
49
|
+
requirement: &18938680 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *18938680
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: yard
|
60
|
-
requirement: &
|
60
|
+
requirement: &18938080 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *18938080
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: redcarpet
|
71
|
-
requirement: &
|
71
|
+
requirement: &18937400 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *18937400
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: guard-rspec
|
82
|
-
requirement: &
|
82
|
+
requirement: &18936740 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *18936740
|
91
91
|
description: Ruby Player - Ruby client library for Player (tools for robots)
|
92
92
|
email:
|
93
93
|
- atimin@gmail.com
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- lib/ruby-player/constants.rb
|
114
114
|
- lib/ruby-player/dev_addr.rb
|
115
115
|
- lib/ruby-player/device.rb
|
116
|
+
- lib/ruby-player/gripper.rb
|
116
117
|
- lib/ruby-player/header.rb
|
117
118
|
- lib/ruby-player/position2d.rb
|
118
119
|
- lib/ruby-player/power.rb
|
@@ -120,6 +121,7 @@ files:
|
|
120
121
|
- lib/ruby-player/version.rb
|
121
122
|
- ruby-player.gemspec
|
122
123
|
- spec/client_spec.rb
|
124
|
+
- spec/gripper_spec.rb
|
123
125
|
- spec/position2d_spec.rb
|
124
126
|
- spec/power_spec.rb
|
125
127
|
- spec/ranger_spec.rb
|