Older blog entries for hudson (starting at number 12)

I just spent the past three hours with Aaron Kahn, former IARC contestant and now UAV designer for ITT. He gave me an indepth description of how Kalman filters work and how to use them to process our gyro and acceleration sensor data. I'm greatly indebited to him for the assistance.

Most of the online tutorials on the filter are very abstract, so I've written a description of the Kalman filter that focuses on its use for attitude reference. It is a little heavy on the math and matrix arithmetic, but I think it does a good job of describing the process. I don't go into the theory for two reasons:

  • There are lots of descriptions of the theory online
  • I don't fully understand it.

My source code to implement an AHRS is online. It uses a simple matrix library that was provided by Aaron. As a bonus there are ECEF transforms for once we start building a GPS aided INS. I plan to recode the common matrix cases as inline functions to ensure type-safety and hopefully speed things up.

The ahrs program doesn't do anything yet, but it will read angular rates and linear acceleration data (in the strapdown inertial reference frame) from stdin and write out the estimated Euler angles in the North/East/Down reference frame. Right not it just test the algorithm in a steady state.

Interestingly, we could build a decent two-axis IMU with the code. It wouldn't have heading information, but would be able to track the attitude fairly well. We do have the problem that in a continuous coordinated bank the filter will slowly erect the attitude, but that plagues both two and three axis strapdown systems.

In response to Matt Minnis' review of the DAS20 dual-axis clinometer, what are the advantages over a dual-axis accelerometer like the ADXL202?

The usable static range of the DAS20 is listed as +/- 20 degrees, while an accelerometer in a static tilt environment will be usable in the full 3D range. Additionally, the size of the DAS20 exceedes the surface mount ADXL202 or even the through-hole ADXL202-EB. I couldn't find a price for the DAS20, but the Analog unit is $10 for SMD or $30 for through-hole.

Both sensors are subject to linear-acceleration errors and not be usable for attitude reference without angular rate sensors. Am I missing something?

Release 2.1 of the realtime code came out on 27 Jan 2002. The major change was to smush all functionality into one file, mainloop.c that dealt with accelerometer sampling, UART handling, servo input, engine tachometer, ADC sampling and all that stuff.

Since the release, the latest version of mainloop.c has a sliding window averaging for the sensor values rather than the discrete time steps that it did before. This means that sensor data never gets "stale" as it used to, but it also means that the readings fluctuate more frequently. Comparison plots of the accelerometer before and after are online.

Tower Hobbies has discontinued the sale of the White man flying stand that I planned to use to teach the software how to hover the aerial robot. Does anyone know where I can find them? Other than eBay, that is.

The older GyroPoint mice arrived and I've stripped one down to get at the Murata ENC05-EA and -EB gyros. They appear to have some applification / filtering circuits on the daughterboard. The gyros are the silver components on the small board to the right in the image.

I summed up most of my observations on post to the autopilot-devel mailing list.

I haven't finished decoding the wiring harness, but Marc Ramsey seems to have done so. I hope to get some code sampling these new gyros this weekend.

In other news, the software for the realtime board will need to be redesigned. I tried to do a very modular, easily maintained design with lots of high-level readable functions. And it is too slow, has too much interrupt overhead and causes servo jitter. My plan is to squish it all into one mainloop, hand code portions in assembly and generally make it a pain to port or extract code out for other projects.

Sorry about that....

Another day lost to a dead glow plug ignitor... I met Mike Pearson to fly his Eco 8 electric and my 10cc prototype, but was unable to get the large prototype engine started. I believe the problem is that my glow plug driver needed to be charged.

So, in a fit of frustration I build a new field box that incorporates a "Power Panel" with step down circuitry to drive the glowplug from my 20 AH gel cell. It required a new case to fit properly, but on the plus side the fuel bottle is now stored upright and the transmitter is better protected.

I also tried to characterize the errors in the accelerometer sampling code. There is a plot of data readings for ten minutes of the IMU (image) on a stationary workbench.

I'm working this evening on tuning the PID loop with a static leveling test. It is no where near as difficult as the actual helicopter stabilization system, but a good workout for the IMU boards, the servo controlls, the accelerometer sampling and PID tuning.

So I built a small "level bot"(click for an image) that has one servo to control its roll axis. Based on the accelerometer readings fed into the PID code, the servo rotates to adjust the angle of the board. The HS-81 micro-servo has an allen wrench for the lever-arm since the servo arm barely reaches to ground...

You can see a textual graph of the leveling action in my post to the autopilot-devel mailing list.

15 Jan 2002 (updated 17 Jan 2002 at 03:41 UTC) »

Last night's all night hacking session has produced an iMac styled case for the autopilot. I also installed magnets in the fan disc for the N1 engine tach. The Hal effect sensor does not seem sensitive enough. I might have to purchase different ones. More details are in my post to the mailing list.

I also made Release 2.0 available over the weekend. This release is named "fly-by-wire" and is the first to support the Mega163 on the custom PCB. It has support for the servo outputs, sampling the gyros and accelerometer data as well as reading commands from the serial port.

My goal for the next release is to have the engine tach functioning and the PID loop governing the engine speed. I don't know much about control loop tuning, but I'll figure it out as I go...

I made good progress today on the realtime board. First, the good news:

  • Crystal clock problems have been resolved.

    Rather than frying another chip with uisp, I tried PonyProg2000. It's an IDE style programmer for just about every serial chip on the market and has GPLed some versions of the code. The latest is a binary-only release for Linux that includes suppot for the Mega163. Download it from:


    Based on John Cunningham's suggestion, I set the CLKSEL fuse bits to 1011 and the little board is now screaming along at 4.0 Mhz or so. The toasted chip is still in paperweight mode. I haven't tried resurrecting it yet.

  • Servo output works and is jitter free.

    Nothing really had to change. The 163 does have a direction control for Port C, while the 103 does not. Simple code change to set DDRC for output. I've tested it with the Futaba S3001 and HiTec HS-81 servos from our two prototype aircraft.

  • Accelerometer sampling looks good and fairly smooth.

    The faster clock rate helps give us a bit more precision. I've added a very simple weighted average to the sampling. The response is fairly good.

The Bad news:

  • Analog voltage sampling is still hosed.

    No matter what I try I can not get the internal voltage reference to come online. The bandgap is enabled (BODEN) and I can sample it and confirm that it is at 1.22 volts. But the reference voltage will not change from AVcc = 5.0V. Any ideas? You can see the ADC code here:


  • The board is UGLY.

    All those jumpers and cut traces offend me. Rev 1.0 is a mess and needs to be cleaned up. The boards are available if anyone wants one. Just add parts.

  • Murata gyros will mess it all up.

    I'll have to redesign the board, but that is life.

11 Jan 2002 (updated 11 Jan 2002 at 15:45 UTC) »

I'm still trying to get the AVR Mega163's onboard ADC to sample data from the onboard gyros but have no luck.

The source code worked on the At Mega103 STK200 development board, but the interrupts never get triggered on the Mega163 on our custom board. I've confirmed that there is voltage at AVcc and the input voltages are there.

On a related question, if I want to use the internal 2.56V voltage reference what is the correct wiring for the "bypass capacitor on Aref"? I can't find anything in the data sheet that specifies the capacitor size or wiring.

My post to the mailing list summed up the status with these points:

The good news:

  • We have the UART and RS-232 problem fixed, although with an enormous mess of jumpers.

  • The accelerometer sampling is working great with the one ADXL202-EB that is installed. It is backwards from the design, but working.

  • The ISP (In system programmer) is functioning well.

  • The power and programming LEDs work.

The bad news:

  • One Mega163 is hosed. I tried configuring it to use the external crystal and is toasted. I haven't figured out how to fix it, nor have I been able to find a reference for setting the fuse bits.

  • We're using the internal 1.0 Mhz clock sped up to 2.0 Mhz now. It is very unstable with temperature and sometimes causes UART timing errors. As well as accelerometer sampling problems...

  • The ADC is not working. If I select the internal voltage reference the ADC never generates an interrupt. If I use Aref then I get interrupts and samples are made. When the spec sheet says "connect a bypass capacitor to Aref" to use the internal reference, what does that mean?

The code checked in to onboard/avr will built a program named sample that reads the one accelerometer and attempts to read all eight analog ports. It prints the ten data values and the current time to the serial port at 19.2 kbaud.

While discussing our IMU board with Bram Stolk on comp.robotics.misc, he pointed out that there are cheap Gyration GyroPoint desk mice available on eBay.

These each contain one Murata ENC05-EA and one Murata ENC05-EB ceramic solid state gyros. Rather than spending $59 per MG100 dual axis gyro, we can buy these for $6 per mouse.

I'll have to redesign the IMU board to deal with these, but that is part of the development process. Rev 1.1 will fix the MAX231 pinouts and maybe switch to these other gyro units.

3 older entries...

Share this page