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 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