Quadcopter training game

It turns out that whilst I have the ability to build a quadcopter (it’s actually not that hard) I don’t quite have the ability to fly the thing around without risking crashing it into nearby fleshy things, or trees.

And whilst there is a little glee involved in a crash (it gives you things to fix, yay!) it slows the learning process somewhat and the propeller smashing can be expensive.

I tried to get the flightgear simulator working so I could practice on my computer, but it’s really complicated and I had little success.

Quadcopter training game

So I wrote a game to help me practice. It’s a 2D top-down quadcopter simulator. It makes no attempt to seriously simulate real physics or even a real a quadcopter. Instead, it aims to just help you become familiar with the transposing of controls as the aircraft rotates around. It’s meant to be controlled using your real radio control, via an ArduPilot controller.

You can see it in action here:

It doesn’t really have a goal at the moment, you just fly around the screen. Once it a while it randomly perturbs the aircraft, sending it spinning off in some direction as if it clipped the ground or something and you have to rectify it. The perturbing is interesting, because I do fine flying around slowly but panic when I clip something.

I was very bad when I first started playing, but I’ve been getting better and it’s definitely translated to better real-world flying.

I wrote it in Ruby, using the Gosu game library (which has a few native dependencies). I’ve only tested it on Linux (Ubuntu). The code is on github. Works for me.

Several test flights later

Quadcopter
I’ve been doing a few test flights of my Arducopter-based quadcopter over the last couple of weeks, when it wasn’t snowing. The first flight test wasn’t so successful. Whilst it flew, I couldn’t get it much above about 1-2 metres off the ground even at full throttle. This turned out to be due to miscalibrated ESCs, which didn’t know what a full throttle signal from my transmitter looked like.

Once recalibrated, it flew pretty well but my inexperience led to a few crash landings and a few broken propellers (no major damage though). It also drifted around quite a bit, but I improved that by recalibrating the accelerometers much more carefully.

I tested out the “return to launch” (RTL) feature a few times too. The idea is that the quadcopter remembers the gps coordinates of the launch point, and when RTL mode is enabled, it flies home automatically. The exact behaviour involves it flying up to a safe altitude (above any possible trees and such), then flies home, holds it’s position there for 5 seconds and then lands.

The first time I tested this, it seemed to work but instead of holding its position, it flew off into a nearby tree. I tested it a couple more times and it worked once, but veered off again another time. I later discovered reported problems with gps accuracy with the Arducopter firmware version I was using (2.9.1). Upgrading to 2.9.1b seems to have improved the behaviour a lot, but RTL isn’t yet something I’m comfortable trusting.

I did discover that the arducopter firmware keeps quite detailed telemetry logs of its flights, along with gps coordinates and altitude. Very good for figuring out what went wrong afterwards.

Control-wise, a major breakthrough for me was realising I didn’t necessarily need to keep pointing the “front” of the aircraft where I wanted to fly. It can go in any direction at any time, you just need to keep track of where the front is pointing to know where roll and pitch will get you. This is admittedly a bit hard to keep track of, so I think I’ll paint the legs or something to help with that. When it’s up high, especially with the light behind it, it’s quite hard to tell whether it is turning towards or away from you. Need more practise.

I also had some problems with the legs sticking in the ground (or breaking) on heavy landings. I’m making some improvements and might blog about that later.

And I stuck an old plastic takeaway container on top to protect a bit from rain and snow. Which worked well until I crash landed it today and smashed it.

IMG_1977_cropped

And today, I strapped an old Android smartphone to it and recorded a first person view of a flight. It was an old cheap phone so the video quality is poor, but it’s still exciting. I’m researching what cameras I can get to record higher definition video atm – I’ll post about that later.

Overall, it’s been quite stable and much sturdier than I’d imagined. It’s a little stressful to fly but I’ve managed to resist the urge to panic and drop throttle any time I’m not certain what is going on. I’d definitely recommend doing your test flights in a large empty grassy field (not a hard road surface), well away from people and buying quite a few spare propellers (which I did).

I’ve gathered all my videos so far into this Youtube playlist.

Quadcopter build, aluminium frame

quadcopter frame take 1

I decided very early on that I wanted to build my own frame rather than buy a kit or anything. I wanted to learn some new skills, but I also expected to be crashing this thing quite a lot and didn’t want to have to keep waiting for new parts to be shipped out (or worse, find them out of stock!).

After some research, I decided to skip carbon fiber (for now?) and use aluminium. It’s strong, lightweight, cheap and pretty easy to work with. I asked around a few local fabrication companies but there apparently aren’t any aluminium stockists in Bradford any more. I gave up and bought online from aluminiumwarehouse.co.uk which worked out nicely, except for the £15 delivery charge.

I bought some square tubing of various sizes for the arms and a length of flat for some odd jobs (perhaps the landing legs). It’s pretty cheap (especially compared to buying from a diy store) so I bought about 10 metres in total. I could build a fleet of quadcopters with this.

I looked into getting the center plates laser cut by a local firm, but it turned out slightly too expensive. £5 each for up to 10 isn’t too bad really, but I wanted quite a few plates in case of crashes and I want a bit more flexibility with the layout as I develop the design. So instead I just got some blank square plates cut to size by aluminiumwarehouse at about 50p each (for 140mm x 140mm x 2mm) and am drilling them manually. I think the 2mm is a bit overkill, and each plate weighs in at 100 grams. I reckon I could have gotten away with 1mm even.

I’m using titanium-coated drill bits; a high rotational speed is recommended for aluminium, but I’ve done just fine with my battery powered drill which isn’t that fast.

And just a reminder to clamp your plates down firmly so the drill doesn’t catch them and fling them around like blunt alloy throwing stars.

I’ve started out with the 12.7mm x 12.7mm x 1.6mm tubing for now – it seems more than solid enough. Drilling the center plate has proven a little fiddlier than I’d hoped and one of my arms isn’t mounted as square as I need. But that’s why I bought lots of extra blank plates!

I cut the tubing using a hacksaw but it came out with uneven ends which makes it difficult to measure and align things. Next time I’ll use the mitre saw (for which I bought metal cutting blades just for this purpose, doh!).

The finished arms and plates (and screws) come in at 400 grams in total. I’m planning to cut some holes in the plates which might lighten it a bit, much not much.

Open source pasta sauce

Pasta sauce

This is my pork and beef mince pasta sauce recipe, heavily inspired by my Grandma’s recipe. I cook it in a casserole dish with a lid in the oven for about 4 hours. This is not quick food, but it’s well worth the wait and this recipe makes about 6-7 big portions, suitable for freezing.

Ingredients

  • 500g pork mince
  • 500g beef mince
  • a little olive oil
  • 2 onions
  • 8 cloves of garlic
  • 4 x 400g cans of chopped tomatoes
  • 2 x 140g cans tomato purée
  • 2 teaspoons salt
  • 2 teaspoons brown sugar
  • Couple of fists full of fresh basil leaves
  • 2 bay leaves
  • 1 teaspoon ground black pepper

Process

  1. Chop the onions and fry them in the olive oil for 5 mins (don’t brown them)
  2. Finely chop and add the garlic and fry for a few more minutes
  3. Add the pork and beef mince, fry on a high heat until it’s no longer pink
  4. Tear up the basil into little bits and add to pot
  5. Add everything else, mix well and bring to boil
  6. Put lid on pot, put in pre-heated oven at 150 degrees Celsius
  7. Cook for 4 hours, stirring once an hour or so

It’s interesting to taste the sauce as it cooks – it really does get better and better the longer you cook it. I used to cook it on a regular stove top but it required almost constant stirring to avoid burning so now I cook it in the casserole dish. Maybe your stove can go lower than mine. A friend tried it with a slow cooker (after frying everything on the stove) and said it works just fine but I’ve yet to give that a go myself. My Grandma used to just sit and stir it all day.

If you like it wetter, add some passata. You can probably leave out the brown sugar – I’ve not really been able to tell a difference with or without it myself.

Serve with some pasta, with plenty of Parmesan cheese and black pepper.

UPDATE: I’ve changed the recipe from 1kg pork mince to 50/50 pork/beef mince after some feedback from friends, and some experimentation of my own. It’s a lot tastier like this and it turns out, this is actually what my grandma used to do!

UPDATE: I’ve changed the recipe, switching out the “mixed dry Italian herbs” for actual real fresh basil leaves. My mum told me that’s what my Grandma used and it really makes a major difference to the flavour.

Quadcopter build, first steps

After weeks of research, and then days of cultivating a Farnell
shopping basket, I finally handed over some cash for the first parts
for my quadcopter. Lots of nuts and bolts, cable ties, spacers and
other misc. Plus Amazon and Ebay purchases too: heat shrink stuff,
connectors, various tools and nice new variable power soldering iron
to replace my (admittedly very trusty) 25W Weller.

The frame stuff was in excess of the cost of a off-the-shelf
quadcopter frame kit, which did make me almost reconsider building my
own. A kit obviously gives you all the parts for one frame, and I have
enough parts here to rebuild my own frame 10 times over, for around
the same cost (though I’ve still to buy the aluminium, but that’s
quite cheap). From what I’ve read, frame breakage is to be expected,
especially if you’ve not flown anything before, so the idea is this
will pay for itself. It’s also going to be way more fun, and I’ve
already learned loads of new things about lots of diverse subjects!

I also ordered an Ardupilot APM 2.5+ flight controller, with the gps
addon. I went without the telemetry module for now – looking to
integrate it with my (to be chosen) transmitter’s built-in telemetry
display.

I’ve yet to choose transmitter, motors, escs, props or battery.

Plan is to get this flying and learn how to fly it before starting
down the first-person-view video setup.

I’ll try to keep up with blogging about it and file them all together here in the Quadcopter category.

Visualising the Ruby Global VM Lock

I’m working on Ruby bindings for Ceph’s RADOS client library – it’s the first native C Ruby extension I’ve written so I’m learning lots of new things.

I’m keen to ensure my extension releases Ruby’s Global VM Lock (GVL) wherever it’s waiting on IO, so that other threads can do work and I’ve written a few simple test scripts to prove to myself it’s working correctly. The result is a textual visualisation of how releasing the GVL can improve the behaviour of threads in Ruby.

For example, I just added basic read and write support to my library so you can read and write objects stored in a Ceph RADOS cluster. My first pass was written without releasing the GVL – it just blocks waiting until Ceph has completed the read or write.

My test script starts three threads, one doing rados write operations in a loop and outputting a “w” to STDOUT when they succeed, one doing rados read operations and writing a “r” and one just doing some cpu work in Ruby and writing a “.”

This is the output from the script before I added GVL releases:

As you can see, it’s almost as if Ruby is switching round-robin style between the threads, waiting for each one to complete one iteration. In some cases, the cpu worker doesn’t get a look in for several read and write iterations!

So then I extracted the blocking parts out to a separate function and called them using Ruby 1.9’s rb_thread_blocking_region function, which releases the GVL, and then reran my test script:

As you can see, the thread doing CPU work in Ruby gets considerably more work done when the GVL is released. Those network-based IO operations can block for quite some time.

It’s exactly what is expected, but it’s neat to see it in action so clearly.

The code for the library is here on github, but but it’s under heavy development at the moment and is in no way complete – I’ve only pushed it out so early so I can write this blog. And this is commit showing just where I made the read/write operations release the gvl.

Beautiful command-line interface design talk

I spoke about writing beautiful command-line interfaces at Scottish Ruby Conference back in June and they’ve published the video, which is freely available for viewing now.

The slides are available here in pdf format (if you’re interested, they were made using emacs org mode and beamer.

There were loads of great talks recorded so check out the videos of them all here on the schedule.

Domes on Mars – Pathfinder Mission

The recent NASA “Curiosity” mission that just landed reminded me of something I did the last time a robot was exploring up there.

It was July 1997, and I was 18 years old and relatively new to the Internet (having been knocking around it for only a couple of years at that point, by my recollection). I was a keen computer artist, using Lightwave 3D at the time.

So when the Mars Pathfinder robot landed and made big news, it was only natural that I rendered some domes onto the first photos they published and put them on the Internet, claiming them to be “The images NASA doesn’t want you to see”.

Much to my surprise, the counter on the free webspace I had with my Demon Internet dial-up account quickly starting increasing. Many hundreds of thousands of hits, which was a lot in those days (as it took 20 minutes just to connect to the Internet and the only way to find things was with gopher and downloading a photo was something you left running overnight and it all cost so much money, unless you used stolen “Red Hot Ant” free dialup numbers which everyone did all the time).

Anyway, long story short, it attracted lots of attention. I was interviewed live on some American crackpot Art Bell radio show (I told them I found the images in the bins round the back of NASA). It was in magazines (well, one). And I became rich and famous and banned from ever visiting Mars.

Anyway, the Internet Archive unfortunately doesn’t have a copy of it (or technically can’t show the copies it has) and I’ve long since lost any copy of the site, but I managed to find this one image some daft consipiracy website had kept a copy of. And here it is in all it’s glory.

And there began my long career of being a dick on the Internet.

UPDATE: The Way Back When machine is able to show my original site now and it has all my silly explanation of the origin of the photos (plus this bonus photo shows a figure stood in the distance)

UPDATE: I found an old issue of “Connect” magazine a friend gave me at the time, back when magazines still existed. Connect was basically just a list of links to funny stuff on the Internet this week and they reviewed the site in their Conspiracies section.

Heaton Royds School

Louisa, Lily the dog and I went for a walk in the woods near my parents home in Heaton, Bradford and we came across the now closed down Heaton Royds school. It seems to have closed down around March 2009 and has been vandalised a number of times. I took a few photos and scared a fox who had apparently moved in.

Rate limiting with Apache and mod-security

Rate limiting by request in Apache isn’t easy, but I finally figured out a satisfactory way of doing it using the mod-security Apache module. We’re using it at Brightbox to prevent buggy scripts rinsing our metadata service. In particular, we needed th e ability to allow a high burst of initial requests, as that’s our normal usage pattern. So here’s how to do it.

Install mod-security (on Debian/Ubuntu, just install the libapache2-modsecurity package) and configure it in your virtual host definition like this:

SecRuleEngine On

<LocationMatch "^/somepath">
  SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
  SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
  SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
  SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
  Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>

ErrorDocument 509 "Rate Limit Exceeded"

Continue reading Rate limiting with Apache and mod-security