All Posts (14056)

Sort by

THIS WEEK IN AEROSPACE

THE DISH FARM

The main flying event of the year was the dish farm flight. The dish farm is being torn down in 2011 & replaced by flea startups.Don't think it emits radio waves anymore & VicaCopter is invisible when she's stationary. Nevertheless, got serious radio dropouts after a certain amount of time. Seems the XBee wire antennas are extremely directional, end-on antenna pointing even at 300ft kills the signal & the only way to consistently get over 100ft is diversity.MOTION TRACKING: AS IMPORTANT AS THE AIRCRAFT ITSELFAfter using Cinelerra's 10 year old motion tracking algorithm satisfactorily for 10 years, it was time for an upgrade better suited to the low framerate, wildly rolling aerial photos we now encounter most of the time & the need to penetrate haze. Introducing the Marcy algorithm. There is no Marcy algorithm in the literature. We made it up.The old motion tracker swept a macroblock around to test all possible translations & took the 1 with the highest match. Then it rotated the macroblock in the translated position to find the rotation with the highest match. It was a recursive problem, requiring accurate translation to detect accurate rotation & accurate rotation to detect accurate translation. Too much rolling & the translation accuracy deteriorated. You could improve the accuracy with multiple passes to a limit.Also, we had the translation of multiple macroblocks giving rotation & scaling. That suffered the same problems.The Marcy algorithm sweeps around a macroblock containing all the possible rotations, testing all possible rotations for each possible translation before giving the translation result. It's actually a 3D macroblock with the 3rd dimension being all the possible rotations, a "Marcy macroblock" you might say.In exchange for a huge increase in computation, the payoff is a huge increase in accuracy for image stacking in 1 pass & deeper haze penetration than before. When is China going to get those octocores out?

This is our first use of the Marcy algorithm on haze. Stacked 170 images fully autonomous where previous algorithms needed tons of hand matching, usually missed, & weren't nearly as accurate.

This is San Francisco from the day job in extreme haze. 75 aerial photos stacked.This mission, expertly flown by the Air Force's 50th wing (GPS), was the Marcy algorithm in previous frame/incremental block mode where the macroblock follows a point.This was the complete flight in previous frame/same block mode where the macroblock stays in the same position.This doesn't show anything useful but looks neat.The Marcy algorithm is really just another step towards the ultimate goal of using databases of known polygons rotated in every possible 3D orientation. These future Marcy algorithms on steroids will give 3D volumes from single photos but require a hardware implementation. The photosynth program sort of does this by exhaustively drawing single vectors & comparing them with photos.
Read more…
Developer

ArduIMU code tests/improvements II

I have implemented the dynamic weighting of accelerometer info and works very well...I have made some flight test and the IMU can register some difficult maneuvers like rolls and loopings...Well, rolls are not difficult for an IMU (there are no centrifugal forces involved) but loopings are quite difficult.I´d also start to make some test of the robustness of the IMU/stabilization in difficult flight conditions. I flight in manual mode, do some "strange" maneuvre and then let the stabilization to restore a "normal" flight condition.... First tests were satisfactory but I need more tests...Yesterday I made some videos showing the problem of vibrations/aliasing of the actual ArduIMU code:and another video with the solution implemented (I explain this on the first point of the previous post):Ah, this is the code of the dynamic weighting of accelerometer info:// Calculate the magnitude of the accelerometer vectorAccel_magnitude = sqrt(Accel_Vector[0]*Accel_Vector[0] + Accel_Vector[1]*Accel_Vector[1] + Accel_Vector[2]*Accel_Vector[2]);Accel_magnitude = Accel_magnitude / GRAVITY; // Scale to gravity.// Weight for accelerometer info (<0.5G = 0.0, 1G = 1.0 , >1.5G = 0.0)Accel_weight = constrain(1 - 2*abs(1 - Accel_magnitude),0,1);And on the drift correction we apply this factor:...*Kp_ROLLPITCH*Accel_weight;...*Ki_ROLLPITCH*Accel_weight;...JJ.
Read more…
I've read several times that to get your EM-406 out of binary mode you need to remove power and wait three days or a week, Bah! Send it the (binary mode) command to go back to NMEA! The only catch is, you do have to know what speed it is listening/talking in binary. If you don't know that, you can try all the bit rates. If that doesn't work, then I guess that you will need to unplug for a week. :(The following sketch will set your 406 to NMEA mode, and set which messages to send, at what rate (sorry, no faster than 1x per second), and what bit rate to communicate at. As written it will set you to 9600 baud, sending GGA and GLL messages once per second and GVS message once every 5 seconds.Not a thing of beauty, but it does have a few comments so that 6 months from now I could sort what the heck I did last month. :) It may also serve as a starting point on how to send other binary commands to the 406.Note: I copied it out of other (functioning) code I wrote so it should work. I have not tested this as a sketch of its own but it is quite self contained and I don't believe there are any uninitialized variables or setup required. Let me know how it works for all y'all.Cheers!Ken-------------------------------------------------------------------------------------------------------------------void GPS_Switch_Mode_To_NMEA( void ){int checkSum;const byte magicHead[] ={0xA0, 0xA2, // start sequence0x00, 0x18 // payload length 0x18 = 24};const byte magicPayload[] ={0x81, // Message ID for "switch to NMEA"0x02, // means "do not change NMEA debug message mode"// the next bunch of fields work in pairs, first the time between messages, "period", then whether or// not to send checksum on that message//// "period" is the number of seconds between times that the GPS repeats the message// zero period is "do not send message// then 0x00 for checksum off or 0x01 for checksum on//0x01, // GGA period0x01, // checksum = on0x01, // GLL period0x01, // checksum = on0x00, // GSA period0x01, // checksum = on0x05, // GSV period0x01, // checksum = on0x00, // RMC period0x01, // checksum = on0x00, // VTG period0x01, // checksum = on0x00, // MSS period0x01, // checksum = on0x00, // unused (future message)0x01, // unused (checksum = on)0x00, // ZDA period0x01, // checksum = on0x00, // unused (future message)0x01, // unused (checksum = on)// baud rate in 2 bytes (9600 = 0x2580; 19200 = 0x4B00; etc. )0x25, // baud rate high byte0x80 // baud rate low byte};const byte magicTail[] ={0xB0, 0xB3 // end sequence};// send 4 byte headerfor( int index = 0; index < 4; index++ ){Serial.print( byte(magicHead[index] ) );}// send message body, calculating checksum as we gocheckSum = 0;for( int index = 0; index < 24; index++ ){checkSum = checkSum + magicPayload[index];Serial.print( byte( magicPayload[index] ) );}checkSum = checkSum & ( 0x7FFF );// send the 2 byte checksumSerial.print( byte(checkSum >> 8) );Serial.print( byte(checkSum & 0xff) );// send the 2 byte tailfor( int index = 0; index < 2; index++ ){Serial.print( byte( magicTail[index] ) );}}void setup(){Serial.begin( 57600 ); // set this to the baud rate that (you hope) your "stuck in binary" GPS is set for// if your GPS is really wonked, you may need to repeat this trying different baud ratesGPS_Switch_Mode_To_NMEA();}void loop(){}
Read more…
Developer

The handheld groundstation for the ArduPilot

Hello ArduPilots,You will find somme photos of my hand held groundstation design based on the Ardustation at :http://diydrones.com/photo/albums/the-ardustation-in-actionThe groundstation uses a Xbee radiomodem for the telemetry downlink.More informations and details are published at: http://diydrones.com/profile/JeanLouisNaudinFull Ardupilot source code currently under test at : http://code.google.com/p/ardupilotdev/Best Regards,Jean-Louis Naudin
Read more…
3D Robotics

Drones vs Pirates

From BotJunkie: "The US military is now using MQ-9 Reaper drones to track suspected pirate ships in the Indian ocean. That’s track, not attack, but the MQ-9 is specifically designed to carry weaponry, so it’s the logical next step. Throw some ninjas and zombies in there somehow, and we’ve got the greatest movie ever made." [via AUVSI] [Photoshop goof pic from BotJunkie]
Read more…
Developer

Visualizing PID loops

This post is an attempt to add a visual explanation of PID loops. I had read Michael King's excellent post , but I wasn't sure how to design loops to do specific things.To me PID loops seemed a bit of a black box, so I decided to graph them out in order to better understand the inputs and output of the equations. They are actually quite simple, but I've never seen a good visual explanation. I may have some details wrong, so if you have additions, please let me know and I will update the graphs.For this example I will show how the steering works on my plane using the rudder. The goal is to connect the bearingError (the difference between the plane bearing and the target bearing) to the rudder. The trick is that you can't just create a direct relationship, or your plane will death spiral. You need to connect the bearingError --> IR sensor --> rudder. That way the plane is always stabilized while it's turning.Here is a diagram of the bearing error. I'm limiting the error to ±30° because I want to limit how fast my plan can turn. More on that later.

IR sensors:The diagram below explains the input you can expect from the sensors. On a hot day you could expect the full range of 0-1023 from them. The value 511 means that the opposing cameras can see exactly the same temperature. This usually means they are looking at the horizon and hopefully you've placed them onto your plane in a perfectly flat orientation. On average days we need to scale the output to the full range, then we offset it by 511 so that we get a positive and negative value for pitch and roll.This graph shows the relationship of the IR sensors output to the rudder. You can see the trough created by the sensor values. The plane can actually bounce around in this trough causing the drunk driver effect.

In this diagram, the sensor output is scaled to .65. This works for my plane, and keeps oscillations at a minimum.

Connecting the bearing error to the IR sensors.In order to stabilize while turning we need to connect the planes bearing to an IR value which we will use as an offset of the actual value. In a sense we are moving the trough to the left or right based on how much we need to turn. I guessed my plane can only safely turn at an angle defined by the IR sensors as ±180. I also guessed I could ignore bearing errors larger than ±30° as my plane can only turn so fast. If you graph the values you'll see 30° bearing = 180IR and -30 = 180IR.

Notice that the proportional term is a lever with a direct output. There is no delay. If you want to have the response be delayed, use the Integrator. To calculate the value for the integrator, take the proportional value and divide it by the number of seconds you want the change to take. For example, if I want change to take 5 seconds, the I term is -6/5 or -1.2If you want some rapid response, and some delayed response, pick a ratio for each, do the math separately and then sum the answer. For example:Output 60IR for proportional and 120IR for the integral. This will cause the rudder to react to 1/3 of the input right away and 2/3 will be applied smoothly over a 5 second period.

A throttle may want all the input as an integral since the smooth transition can keep your plane from torqing sideways.When you take the IR offset value generated by the above equation and apply it to the stabilization you'll see the equilibrium piont has shifted to the right.

The plane will fight to hold that angle by moving the rudder back and forth. If the plane is holding the turn, note that rudder is straight.I know this is pretty basic stuff, but I could not wrap my head around it until I made these graphs.Jason
Read more…
Developer

AP with Ground Station and 2-way comm

I wanted to post the code and exe of the Flash file for the Ground Station and my AP. If you want to try it, you need to do a few things first.(If you try this, remove your throttle or disconnect your ESC from your motor!)1 - Load the DefaultsWriter.pde onto the Ardupilot HW to get some decent values into the EEprom2 - Load the Waypoint Writer onto the Ardupilot HW to put some waypoints into the EEprom3 - Load the JSXPilot_Navigate.pde onto the Ardupilot HW4 - Download Serproxy and configure it as indicated in the cfg file5 - Run the Flash app as an EXE or with a local Flash player or -maybe- it will work in a browser6 - Press the space bar to connect the GS to Serproxy7 - tilt the plane to adjust the IR sensors and the plane is set to fly at 30MPH - it's in debug mode8 - If you want to play further, look in the test.pde and see test versions of 3 important functions. Elsewhere in the code these functions have been relabeled with a "_off" also turn off debug mode in the defines.hThis is a lot, but I'm used to it. Also, this is information for people making there own AP or just curious. It's not supported. It only works with my radio. It's barely tested. The code is very well commented. If you can get it to work for you, you win a gold star.Download it hereYou can see the video here of it in action. GroundStation.mov
Read more…
Developer

ArduIMU+ V2 (Flat) now available for preorder..

The new and flat version is now available for pre-order for just $129, the estimated shipping date should be Tuesday and you can get it here. I also have big discounts for dealers and high quantity orders.

Why "+" in the name? Because it's an Inertial Measure Unit (sensors and hardware filter circuitry) plus an Arduino-compatible processor that can run our Attitude Heading Reference System (AHRS) code, based on Bill Premerlani's DCM algorithm. This hardware consists of a 3 axis accelerometer and three gyro sensors, dual power regulator (3.3v and 5v), GPS port, an Atmega328@16mhz and a lot of status LED's. It's the cheapest IMU-AHRS on the market!Note: this IMU is not designed to work with ArduPilot as is, and is not a replacement for ArduPilot's thermopile sensors. We may in the future release versions that do work with ArduPilot, but this version is designed as a stand-alone IMU/AHRS, for use with your own projects.Includes the pin headers and all the sensors needed, some assembly is required.Features:-Flat Desing.-Low cost.-3 Axis Accelerometer.-3 Axis Gyroscope-Arduino Compatible.-Source Code included and Open Source!-Power LED (Green).-Status LEDs (Red, Blue, Yellow).-1 SPI port.-1 I2C port (possible expansion shield with magnetometers).-Two PWM outputs (for servos).-GPS port (uBlox ready!).-Protection diode.-Serial port output with servo standard connector for easy interface with any device (Ground, 5V, TX-OUT).-Latest Firmware-Board-Schematics-XY gyro LPR530AL-Z gyro LY530ALH-XYZ 3g Accel. ADXL335
Read more…

I Can See My House From Up Here!

I Can See My House From Up Here! The Northrop Grumman RQ-4 Global Hawk unmanned aerial vehicle (UAV) is quite an impressive piece of hardware. It can stay in the air for more than a day, has a range of 3,400 miles, and at very high altitude (its record is 19,928 meters (65,380.6 ft)). Usually it's the military that would have control over these UAVs, but two Global Hawks have been turned over to NASA for environmental research flights .

Read more…