crubyflie 0.1.3 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +3 -1
- data/README.md +21 -23
- data/bin/crubyflie +4 -0
- data/configs/joystick_default.yaml +4 -1
- data/crubyflie.gemspec +1 -1
- data/examples/params_and_logging.rb +3 -3
- data/lib/crubyflie/crazyflie.rb +1 -1
- data/lib/crubyflie/driver/crtp_packet.rb +5 -1
- data/lib/crubyflie/driver/radio_driver.rb +19 -6
- data/lib/crubyflie/input/input_reader.rb +15 -2
- data/lib/crubyflie/input/joystick_input_reader.rb +27 -11
- data/lib/crubyflie/version.rb +1 -1
- data/spec/crazyradio_spec.rb +1 -1
- data/spec/crtp_packet_spec.rb +4 -4
- metadata +26 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04d9de96a95fe890f80b47c44948a9cf42a513e2
|
4
|
+
data.tar.gz: 2c24cd98c51b5eefaf917aa6e4ff5ae3d59b9855
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7957cf55bcb9ba87577d4de93e0229b9554c06a1d4b53e06cc229426e5eda6123abe0c88268fb7d61420a66566346ecf4e13f3a0758e004b706c66daa5923e7d
|
7
|
+
data.tar.gz: d81068bc9673af8375f418cd9d7fe7382ba2813e048cac334a62e2cdfa807da48c4ab546ffadf6ef97572a9899c639c9e724b1993d3a9f1626df7eb50621f2ea
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
Crubyflie - A Ruby client for Crazyflie
|
2
2
|
=======================================
|
3
3
|
|
4
|
-
[](https://travis-ci.org/hsanjuan/crubyflie) [](https://coveralls.io/r/hsanjuan/crubyflie)
|
4
|
+
[](http://badge.fury.io/rb/crubyflie) [](https://travis-ci.org/hsanjuan/crubyflie) [](https://coveralls.io/r/hsanjuan/crubyflie)
|
5
5
|
|
6
|
-
Crubyflie is a Ruby rewrite of the [Crazyflie quadcopter](http://www.bitcraze.se/category/crazyflie/) Python [client libraries](https://
|
6
|
+
Crubyflie is a Ruby rewrite of the [Crazyflie 1.0 quadcopter](http://www.bitcraze.se/category/crazyflie/) Python [client libraries](https://github.com/bitcraze/crazyflie-clients-python), with some customizations.
|
7
7
|
|
8
|
-
The Crazyflie is awesome, but I did not know where to start contributing. Therefore I thought that rewriting the code in Ruby would be one way of knowing what is going on and how it works. Along the way I took the time to document all the code so that others can understand it
|
8
|
+
The Crazyflie is awesome, but I did not know where to start contributing. Therefore I thought that rewriting the code in Ruby would be one way of knowing what is going on and how it works. Along the way I took the time to document all the code so that others can understand it.
|
9
9
|
|
10
10
|
You may be also interested in some other unofficial Crazyflie clients:
|
11
11
|
|
@@ -13,25 +13,22 @@ You may be also interested in some other unofficial Crazyflie clients:
|
|
13
13
|
* Node.js: https://github.com/ceejbot/aerogel
|
14
14
|
* Haskell: https://github.com/orclev/crazyflie-haskell
|
15
15
|
|
16
|
-
Disclaimer
|
17
|
-
----------
|
18
|
-
|
19
|
-
Crubyflie is in early stage of development, very untested.
|
20
|
-
|
21
16
|
Features
|
22
17
|
--------
|
23
18
|
|
24
19
|
* Crubyflie can be used to fly a Crazyflie device using a Joystick and the Crazyradio USB dongle
|
25
20
|
* Crubyflie exposes an API that allows to control the copter, read logging, parameters and console easily
|
26
|
-
* Crubyflie runs headless
|
21
|
+
* Crubyflie runs headless
|
27
22
|
* Lightweight: If you just want to fly, Crubyflie consumes around 1/2 memory and 1/3 CPU compared to the original Python `cfheadless` utility.
|
23
|
+
* Hovering mode (see requirements below)
|
24
|
+
|
25
|
+
Requirements
|
26
|
+
------------
|
27
|
+
|
28
|
+
Crubyflie versions `>= 0.2.0` support hovering mode and are compatible with the latest firmware of `Crazyradio` ([Version 0.53](https://github.com/bitcraze/crazyradio-firmware/releases/tag/0.53)) and `Crazyflie` ([Version 2015.1](https://github.com/bitcraze/crazyflie-firmware/releases/tag/2015.1))
|
29
|
+
|
30
|
+
Old versions should probably work, otherwise you can try with the `0.1.3` gem version.
|
28
31
|
|
29
|
-
Not included...
|
30
|
-
----------------
|
31
|
-
* No fancy UI.
|
32
|
-
* No flash utility (yet?).
|
33
|
-
* No idea how this works in other OSs that are not Linux, but in theory it should work in all with some small fixes. I welcome you to take on this task if you are interested.
|
34
|
-
* No support for Ruby <= 1.8.7 (maybe it works who knows... I haven't tested but since Crubyflie relies heavily on threading probably it does not work so good).
|
35
32
|
|
36
33
|
Installation
|
37
34
|
------------
|
@@ -42,17 +39,17 @@ Crubyflie depends on `rubysdl`, for which you will need the SDL library and head
|
|
42
39
|
|
43
40
|
That's all.
|
44
41
|
|
45
|
-
|
42
|
+
Flying the Crazyflie
|
46
43
|
--------------------
|
47
44
|
|
48
45
|
The easiest way to do it is to `gem install crubyflie` and then run the `crubyflie` command. This will connect to the first visible quadcopter using the first available joystick on your computer (you can modify this parameters with the appropiate flags):
|
49
46
|
|
50
|
-
>
|
47
|
+
> crubyflie -h
|
51
48
|
Options:
|
52
49
|
--joystick-id, -j <i>: Joystick ID (default: 0)
|
53
50
|
--cf-uri, -f <s>: Crazyflie URI (defaults to first one found in scan)
|
54
51
|
--config, -c <s>: Joystick configuration, defaults to default cfg in configs/ (default:
|
55
|
-
/usr/lib64/ruby/gems/2.
|
52
|
+
/usr/lib64/ruby/gems/2.1.0/gems/crubyflie-0.2.0/lib/crubyflie/input/../../../configs/joystick_default.yaml)
|
56
53
|
--help, -h: Show this message
|
57
54
|
|
58
55
|
There is a [template/default configuration file](https://github.com/hsanjuan/crubyflie/blob/master/configs/joystick_default.yaml) with instructions (which works for me and my PS3-like controller :) ). You should modify this file to fit it to your needs (configuration parameters are commented). The most tricky parameter in axis is the `:max_change_rate`. Depending on your controller, you will find the input is excessively throotled or not. I recommend that you play with this value.
|
@@ -96,15 +93,15 @@ end
|
|
96
93
|
|
97
94
|
|
98
95
|
# Interface to the param facility
|
99
|
-
@cf.param.get_value(
|
96
|
+
@cf.param.get_value('param1.name') do |value|
|
100
97
|
...
|
101
98
|
end
|
102
99
|
|
103
|
-
@cf.param.get_value(
|
100
|
+
@cf.param.get_value('param2.name') do |value|
|
104
101
|
...
|
105
102
|
end
|
106
103
|
|
107
|
-
@cf.param.set_value(
|
104
|
+
@cf.param.set_value('param.name', 1)
|
108
105
|
|
109
106
|
# Interface to the commander facility
|
110
107
|
@cf.commander.send_setpoint(...)
|
@@ -115,10 +112,11 @@ end
|
|
115
112
|
end
|
116
113
|
```
|
117
114
|
|
118
|
-
That's pretty much all. As you see, instead of declaring callbacks, registering them etc. We let the user pass blocks, which are run when the data is available.
|
115
|
+
That's pretty much all. As you see, instead of declaring callbacks, registering them etc. We let the user pass blocks, which are run when the data is available.
|
116
|
+
|
119
117
|
In Crubyflie, params are read and set synchronously, while the block passed to `start_logging()` will be called repeteadly and asynchrnously until `stop_logging()` is invoked. Console offers both synchronous `read()` and asynchronous `start_reading()` options.
|
120
118
|
|
121
|
-
There are some examples in the `examples` folder
|
119
|
+
**There are some examples in the `examples` folder**. Read the gem documentation to get full information of the parameters for each function call.
|
122
120
|
|
123
121
|
|
124
122
|
Contributing
|
data/bin/crubyflie
CHANGED
@@ -17,6 +17,8 @@
|
|
17
17
|
# You should have received a copy of the GNU General Public License
|
18
18
|
# along with Crubyflie. If not, see <http://www.gnu.org/licenses/>
|
19
19
|
|
20
|
+
$: << File.join(File.dirname(__FILE__), '..', 'lib')
|
21
|
+
|
20
22
|
require 'crubyflie'
|
21
23
|
require 'trollop'
|
22
24
|
|
@@ -73,6 +75,8 @@ Signal.trap("SIGINT") do
|
|
73
75
|
exit = true
|
74
76
|
end
|
75
77
|
|
78
|
+
logger.info("Cleared for take-off!")
|
79
|
+
|
76
80
|
while cf.active? && !exit do
|
77
81
|
start_time = Time.now.to_f
|
78
82
|
joystick.read_input()
|
@@ -42,6 +42,7 @@
|
|
42
42
|
# :pitch - Controls pitch. Assignable a axis or a button with value tag.
|
43
43
|
# :thrust - Controls thrust. Assignable a axis or a button with value tag.
|
44
44
|
# :yaw - Controls yaw. Assignable a axis or a button with value tag.
|
45
|
+
# :hover - Enables/disables hovering mode
|
45
46
|
# :switch_xmode - Enables/disables xmode. Assignable to a button.
|
46
47
|
# :close_link - Kills the link and shuts Crubyflie. Assignable to a button.
|
47
48
|
# :switch_scaled_output_mode - Enables/disabled scaled output mode. Assignable
|
@@ -103,4 +104,6 @@
|
|
103
104
|
# When enabled, this mode will will multiply axis readings (except thrust)
|
104
105
|
# by the value of the button (must be a positive number)
|
105
106
|
:action: :switch_scaled_output_mode
|
106
|
-
:value: 0.50 # Softer output, useful for landing
|
107
|
+
:value: 0.50 # Softer output, useful for landing
|
108
|
+
5:
|
109
|
+
:action: :hover
|
data/crubyflie.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
Client library to control a Crazyflie. This library allows to talk to a
|
30
30
|
crazyflie using the USB radio dongle.
|
31
31
|
EOF
|
32
|
-
spec.summary = "
|
32
|
+
spec.summary = "A Ruby client for the Crazyflie quadcopter"
|
33
33
|
spec.homepage = "https://github.com/hsanjuan/crubyflie"
|
34
34
|
spec.license = "GPLv3"
|
35
35
|
|
@@ -44,13 +44,13 @@ puts cf.param.toc.to_s
|
|
44
44
|
|
45
45
|
# Read some parameters
|
46
46
|
puts "--------"
|
47
|
-
cf.param.get_value("
|
47
|
+
cf.param.get_value("pid_attitude.pitch_kp") do |value|
|
48
48
|
puts "kp_pitch: #{value}"
|
49
49
|
end
|
50
|
-
cf.param.get_value("
|
50
|
+
cf.param.get_value("pid_attitude.pitch_ki") do |value|
|
51
51
|
puts "ki_pitch: #{value}"
|
52
52
|
end
|
53
|
-
cf.param.get_value("
|
53
|
+
cf.param.get_value("pid_attitude.pitch_kd") do |value|
|
54
54
|
puts "kd_pitch: #{value}"
|
55
55
|
end
|
56
56
|
puts "--------"
|
data/lib/crubyflie/crazyflie.rb
CHANGED
@@ -106,7 +106,7 @@ module Crubyflie
|
|
106
106
|
sleep 0.5 # Allow setup and failures
|
107
107
|
setup_connection() if @link
|
108
108
|
rescue Exception
|
109
|
-
#logger.warn $!.backtrace.join("\n")
|
109
|
+
# logger.warn $!.backtrace.join("\n")
|
110
110
|
call_cb(:connection_failed, $!.message)
|
111
111
|
close_link()
|
112
112
|
end
|
@@ -26,6 +26,7 @@ module Crubyflie
|
|
26
26
|
:console => 0x00,
|
27
27
|
:param => 0x02,
|
28
28
|
:commander => 0x03,
|
29
|
+
:mem => 0x04,
|
29
30
|
:logging => 0x05,
|
30
31
|
:debugdriver => 0x0E,
|
31
32
|
:linkctrl => 0x0F,
|
@@ -134,7 +135,10 @@ module Crubyflie
|
|
134
135
|
# Concat the header and the data and return it
|
135
136
|
# @return [Array] header concatenated with data
|
136
137
|
def pack
|
137
|
-
|
138
|
+
# According to official client, bytes 3 and 4 need
|
139
|
+
# to be set for legacy support of the bootloader
|
140
|
+
# (no matter what)
|
141
|
+
[@header | 0x3 << 2].concat(@data)
|
138
142
|
end
|
139
143
|
|
140
144
|
# Pack the data of the packet into unsigned chars when needed
|
@@ -29,12 +29,12 @@ module Crubyflie
|
|
29
29
|
# Small URI class since Ruby URI < 1.9.3 gives problems parsing
|
30
30
|
# Crazyflie URIs
|
31
31
|
class CrubyflieURI
|
32
|
-
attr_reader :scheme, :dongle, :channel, :rate
|
32
|
+
attr_reader :scheme, :dongle, :channel, :rate, :address
|
33
33
|
# Initialize an URI
|
34
34
|
# @param uri_str [String] the URI
|
35
35
|
def initialize(uri_str)
|
36
36
|
@uri_str = uri_str
|
37
|
-
@scheme, @dongle, @channel, @rate = split()
|
37
|
+
@scheme, @dongle, @channel, @rate, @address = split()
|
38
38
|
if @scheme.nil? || @dongle.nil? || @channel.nil? || @rate.nil? ||
|
39
39
|
@scheme != 'radio'
|
40
40
|
raise InvalidURIException.new('Bad URI')
|
@@ -67,7 +67,7 @@ module Crubyflie
|
|
67
67
|
# Default size for the outgoing queue
|
68
68
|
OUT_QUEUE_MAX_SIZE = 50
|
69
69
|
# Default number of retries before disconnecting
|
70
|
-
RETRIES_BEFORE_DISCONNECT =
|
70
|
+
RETRIES_BEFORE_DISCONNECT = 10
|
71
71
|
|
72
72
|
attr_reader :uri
|
73
73
|
attr_reader :retries_before_disconnect, :out_queue_max_size
|
@@ -110,6 +110,19 @@ module Crubyflie
|
|
110
110
|
dongle_number = @uri.dongle.to_i
|
111
111
|
channel = @uri.channel.to_i
|
112
112
|
rate = @uri.rate
|
113
|
+
address = @uri.address
|
114
|
+
|
115
|
+
if address
|
116
|
+
begin
|
117
|
+
# The official driver does this. Takes address as decimal
|
118
|
+
# number, calculate the binary and pack it as 5 byte.
|
119
|
+
hex_addr = address.to_i.to_s(16)
|
120
|
+
bin_addr = hex_addr.scan(/../).map { |x| x.hex }.pack('C*')
|
121
|
+
address = bin_addr.unpack('CCCCC')
|
122
|
+
rescue
|
123
|
+
raise InvalidURIException.new("Address not valid: #{$!.message}")
|
124
|
+
end
|
125
|
+
end
|
113
126
|
|
114
127
|
# @todo this should be taken care of in crazyradio
|
115
128
|
case rate
|
@@ -140,7 +153,8 @@ module Crubyflie
|
|
140
153
|
# Initialize Crazyradio and run thread
|
141
154
|
cradio_opts = {
|
142
155
|
:channel => channel,
|
143
|
-
:data_rate => rate
|
156
|
+
:data_rate => rate,
|
157
|
+
:address => address
|
144
158
|
}
|
145
159
|
@crazyradio = Crazyradio.factory(cradio_opts)
|
146
160
|
start_radio_thread()
|
@@ -221,8 +235,7 @@ module Crubyflie
|
|
221
235
|
raise
|
222
236
|
rescue Exception
|
223
237
|
retries ||= 0
|
224
|
-
logger.error("
|
225
|
-
@crazyradio.reopen()
|
238
|
+
logger.error("Error scanning interface: #{$!}")
|
226
239
|
retries += 1
|
227
240
|
if retries < 2
|
228
241
|
logger.error("Retrying")
|
@@ -39,7 +39,7 @@ module Crubyflie
|
|
39
39
|
:roll_inc_cal, :roll_dec_cal,
|
40
40
|
:pitch_inc_cal, :pitch_dec_cal,
|
41
41
|
:switch_scaled_output_mode,
|
42
|
-
:switch_xmode,
|
42
|
+
:switch_xmode, :hover, :close_link]
|
43
43
|
|
44
44
|
attr_reader :axis, :buttons, :axis_readings, :button_readings
|
45
45
|
attr_accessor :xmode
|
@@ -55,6 +55,7 @@ module Crubyflie
|
|
55
55
|
@buttons = buttons
|
56
56
|
@calibrations = {}
|
57
57
|
@xmode = false
|
58
|
+
@hover = false
|
58
59
|
@output_scale = 0 # off
|
59
60
|
|
60
61
|
# Calibrate defaults to 0
|
@@ -105,9 +106,12 @@ module Crubyflie
|
|
105
106
|
:roll => nil,
|
106
107
|
:pitch => nil,
|
107
108
|
:yaw => nil,
|
108
|
-
:thrust => nil
|
109
|
+
:thrust => nil,
|
110
|
+
:hover => 0
|
109
111
|
}
|
110
112
|
|
113
|
+
set_althold = false
|
114
|
+
|
111
115
|
@button_readings.each do |action, value|
|
112
116
|
case action
|
113
117
|
when :roll
|
@@ -118,6 +122,12 @@ module Crubyflie
|
|
118
122
|
setpoint[:yaw] = value
|
119
123
|
when :thrust
|
120
124
|
setpoint[:thrust] = value
|
125
|
+
when :hover
|
126
|
+
if value > 0
|
127
|
+
@hover = !@hover
|
128
|
+
logger.info("Hover is #{@hover}")
|
129
|
+
set_althold = true
|
130
|
+
end
|
121
131
|
when :roll_inc_cal
|
122
132
|
@calibrations[:roll] += 1
|
123
133
|
when :roll_dec_cal
|
@@ -173,6 +183,9 @@ module Crubyflie
|
|
173
183
|
crazyflie.commander.send_setpoint(roll, pitch, yaw, thrust,
|
174
184
|
@xmode)
|
175
185
|
end
|
186
|
+
if set_althold
|
187
|
+
crazyflie.param.set_value('flightmode.althold', @hover ? 1 : 0)
|
188
|
+
end
|
176
189
|
end
|
177
190
|
|
178
191
|
private
|
@@ -43,6 +43,7 @@ module Crubyflie
|
|
43
43
|
"configs", "joystick_default.yaml")
|
44
44
|
THRUST_MAX = 60000
|
45
45
|
THRUST_MIN = 9500
|
46
|
+
THRUST_IDLE = 32767 # for hovering
|
46
47
|
|
47
48
|
attr_reader :config, :joystick_index
|
48
49
|
# Initializes the Joystick configuration and the SDL library
|
@@ -226,8 +227,12 @@ module Crubyflie
|
|
226
227
|
# How much have we changed/ms
|
227
228
|
change = (value - last_value) / timespan_ms.to_f
|
228
229
|
|
229
|
-
#
|
230
|
-
|
230
|
+
# Rate limitation applies to all inputs except thrust
|
231
|
+
# Thrust is only affected when no hovering and decreasing
|
232
|
+
# except thrust+hovering
|
233
|
+
# and thrust increase (needs to be quick)
|
234
|
+
if !is_thrust ||
|
235
|
+
(is_thrust && !@hover && change <= 0)
|
231
236
|
# If the change rate exceeds the max change rate per ms...
|
232
237
|
if change.abs > max_chrate
|
233
238
|
# new value is the max change possible for the timespan
|
@@ -249,7 +254,16 @@ module Crubyflie
|
|
249
254
|
# Returns integer from 9.500 to 60.000 which is what the crazyflie
|
250
255
|
# expects
|
251
256
|
def normalize_thrust(value, input_range, output_range)
|
252
|
-
|
257
|
+
# Yes, we now can have negative values for althold mode
|
258
|
+
value = 0 if value < 0 if !@hover
|
259
|
+
if @hover && value == 0
|
260
|
+
return THRUST_IDLE
|
261
|
+
end
|
262
|
+
# in any other case,
|
263
|
+
# first normalize to -100->100
|
264
|
+
# and then if not @hovering, put the value in users
|
265
|
+
# output-range (which is 0 to 100%). Finally,
|
266
|
+
# normalize to Crazyflie THRUST_MIN -> MAX
|
253
267
|
range = {
|
254
268
|
:start => -100.0,
|
255
269
|
:end => 100.0,
|
@@ -257,15 +271,17 @@ module Crubyflie
|
|
257
271
|
}
|
258
272
|
value = normalize(value, input_range, range)
|
259
273
|
|
260
|
-
if
|
261
|
-
|
262
|
-
|
274
|
+
if !@hover
|
275
|
+
if value > output_range[:end] then value = output_range[:end]
|
276
|
+
elsif value < output_range[:start] then value = output_range[:start]
|
277
|
+
end
|
263
278
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
279
|
+
range = {
|
280
|
+
:start => 0.0,
|
281
|
+
:end => 100.0,
|
282
|
+
:width => 100.0
|
283
|
+
}
|
284
|
+
end
|
269
285
|
|
270
286
|
cf_range = {
|
271
287
|
:start => THRUST_MIN,
|
data/lib/crubyflie/version.rb
CHANGED
data/spec/crazyradio_spec.rb
CHANGED
data/spec/crtp_packet_spec.rb
CHANGED
@@ -57,14 +57,14 @@ describe CRTPPacket do
|
|
57
57
|
|
58
58
|
describe "#unpack" do
|
59
59
|
it "should return an empty package if data is empty or not array" do
|
60
|
-
CRTPPacket.unpack("abc").pack.should == [
|
61
|
-
CRTPPacket.unpack([]).pack.should == [
|
60
|
+
CRTPPacket.unpack("abc").pack.should == [0b00001100]
|
61
|
+
CRTPPacket.unpack([]).pack.should == [0b00001100]
|
62
62
|
end
|
63
63
|
|
64
64
|
it "should unpack a data array correctly into header and data" do
|
65
65
|
packet = CRTPPacket.unpack([1,2,3])
|
66
66
|
packet.data.should == [2,3]
|
67
|
-
packet.header.should ==
|
67
|
+
packet.header.should == 0b00000001
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
@@ -73,7 +73,7 @@ describe CRTPPacket do
|
|
73
73
|
header = 0b11101010 # channel 10; port 1110
|
74
74
|
payload = [1,2,3]
|
75
75
|
packet = CRTPPacket.new(header, payload)
|
76
|
-
packet.pack.should == [
|
76
|
+
packet.pack.should == [0b11101110, 1, 2, 3]
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
metadata
CHANGED
@@ -1,139 +1,139 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crubyflie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hector Sanjuan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: libusb
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rubysdl
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: trollop
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.3'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.3'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: yard
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: simplecov
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: coveralls
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
description: |
|
@@ -146,8 +146,8 @@ executables:
|
|
146
146
|
extensions: []
|
147
147
|
extra_rdoc_files: []
|
148
148
|
files:
|
149
|
-
- .gitignore
|
150
|
-
- .travis.yml
|
149
|
+
- ".gitignore"
|
150
|
+
- ".travis.yml"
|
151
151
|
- Gemfile
|
152
152
|
- LICENSE.txt
|
153
153
|
- README.md
|
@@ -202,20 +202,20 @@ require_paths:
|
|
202
202
|
- lib
|
203
203
|
required_ruby_version: !ruby/object:Gem::Requirement
|
204
204
|
requirements:
|
205
|
-
- -
|
205
|
+
- - ">="
|
206
206
|
- !ruby/object:Gem::Version
|
207
207
|
version: '0'
|
208
208
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
209
209
|
requirements:
|
210
|
-
- -
|
210
|
+
- - ">="
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: '0'
|
213
213
|
requirements: []
|
214
214
|
rubyforge_project:
|
215
|
-
rubygems_version: 2.
|
215
|
+
rubygems_version: 2.2.2
|
216
216
|
signing_key:
|
217
217
|
specification_version: 4
|
218
|
-
summary:
|
218
|
+
summary: A Ruby client for the Crazyflie quadcopter
|
219
219
|
test_files:
|
220
220
|
- spec/commander_spec.rb
|
221
221
|
- spec/console_spec.rb
|