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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02c5195ea21e56d89557355913944da49b894f21
4
- data.tar.gz: 92b4e05341df2db63e05149e82b17099d5015eb3
3
+ metadata.gz: 04d9de96a95fe890f80b47c44948a9cf42a513e2
4
+ data.tar.gz: 2c24cd98c51b5eefaf917aa6e4ff5ae3d59b9855
5
5
  SHA512:
6
- metadata.gz: a141f33049bae4a6bb67a80164514d42141cc303d66d460a0b3987c73c716ecd3ce2bbd5d181cc69f706ca3dc933f5de479e32f5fb8a6ffd32956b016468d805
7
- data.tar.gz: a34a3b8d723f5154d2f71753f3345d25d42d6b54d818d47b5d7f13edf344125268d1c69c48c4184805dde548e7950f3a250b0876300d8dda5807ed94f9ed5688
6
+ metadata.gz: 7957cf55bcb9ba87577d4de93e0229b9554c06a1d4b53e06cc229426e5eda6123abe0c88268fb7d61420a66566346ecf4e13f3a0758e004b706c66daa5923e7d
7
+ data.tar.gz: d81068bc9673af8375f418cd9d7fe7382ba2813e048cac334a62e2cdfa807da48c4ab546ffadf6ef97572a9899c639c9e724b1993d3a9f1626df7eb50621f2ea
data/.travis.yml CHANGED
@@ -3,6 +3,8 @@ rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
5
  - 2.0.0
6
+ - 2.1.6
7
+ - 2.2.2
6
8
  before_install:
7
9
  - sudo apt-get update -qq
8
- - sudo apt-get install -qq libsdl1.2-dev
10
+ - sudo apt-get install -qq libsdl1.2-dev
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://bitbucket.org/bitcraze/crazyflie-pc-client), with some customizations.
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 and create tests.
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
- Fyling the Crazyflie
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
- > crubyflie2.0 -h
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.0.0/gems/crubyflie-0.0.1/lib/crubyflie/input/../../../configs/joystick_default.yaml)
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(...) do |value|
96
+ @cf.param.get_value('param1.name') do |value|
100
97
  ...
101
98
  end
102
99
 
103
- @cf.param.get_value(...) do |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. Read the gem documentation to get full information of the parameters for each function call.
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 = "Crazyflie ruby client"
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("attitudepid.kp_pitch") do |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("attitudepid.ki_pitch") do |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("attitudepid.kd_pitch") do |value|
53
+ cf.param.get_value("pid_attitude.pitch_kd") do |value|
54
54
  puts "kd_pitch: #{value}"
55
55
  end
56
56
  puts "--------"
@@ -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
- [@header].concat(@data)
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 = 20
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("Unknown error scanning interface: #{$!}")
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, :close_link]
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
- # Skip rate limitation if change is positive and this is thurst
230
- if !is_thrust || (is_thrust && change <= 0)
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
- value = 0 if value < 0
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 value > output_range[:end] then value = output_range[:end]
261
- elsif value < output_range[:start] then value = output_range[:start]
262
- end
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
- range = {
265
- :start => 0.0,
266
- :end => 100.0,
267
- :width => 100.0
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,
@@ -18,5 +18,5 @@
18
18
 
19
19
  module Crubyflie
20
20
  # Current gem version
21
- VERSION = "0.1.3"
21
+ VERSION = "0.2.0"
22
22
  end
@@ -79,7 +79,7 @@ describe Crazyradio do
79
79
 
80
80
  describe "#has_fw_scan" do
81
81
  it "should say false" do
82
- @crazyradio.has_fw_scan.should be_false
82
+ @crazyradio.has_fw_scan.should be(nil)
83
83
  end
84
84
  end
85
85
 
@@ -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 == [0]
61
- CRTPPacket.unpack([]).pack.should == [0]
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 == 1
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 == [0b11101010, 1, 2, 3]
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.1.3
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: 2013-08-14 00:00:00.000000000 Z
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.0.0
215
+ rubygems_version: 2.2.2
216
216
  signing_key:
217
217
  specification_version: 4
218
- summary: Crazyflie ruby client
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