crubyflie 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build Status](https://travis-ci.org/hsanjuan/crubyflie.png?branch=master)](https://travis-ci.org/hsanjuan/crubyflie) [![Coverage Status](https://coveralls.io/repos/hsanjuan/crubyflie/badge.png)](https://coveralls.io/r/hsanjuan/crubyflie)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/crubyflie.svg)](http://badge.fury.io/rb/crubyflie) [![Build Status](https://travis-ci.org/hsanjuan/crubyflie.png?branch=master)](https://travis-ci.org/hsanjuan/crubyflie) [![Coverage Status](https://coveralls.io/repos/hsanjuan/crubyflie/badge.png)](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
|