Quad.Net Quadrocopter for .NETMF
#101
Posted 26 February 2011 - 12:40 AM
Here's the new flight video:
http://www.youtube.com/watch?v=8Dy-4ppzCIM
This is a drastic improvement over the last iteration, and it still involves no native code!
Check out the full post here.
#102
Posted 26 February 2011 - 01:31 AM
#103
Posted 26 February 2011 - 03:00 AM
how often does GC kick in?
about every 5 - 7 seconds
#104
Posted 26 February 2011 - 04:53 AM
#105
Posted 26 February 2011 - 05:44 PM
#106
Posted 05 March 2011 - 11:08 PM
Hello Brandon
I am interrested by your project, i would like to read your code but i can't access google site and tortoise say "Forbidden
Your client does not have permission to get URL /p/quadnet/ from this server."
it's my fault (bad client or bad actions) or it's because you should give me a read acces before ?
Thanks a lot
#107
Posted 07 March 2011 - 05:15 PM
Hello Brandon
I am interrested by your project, i would like to read your code but i can't access google site and tortoise say "Forbidden
Your client does not have permission to get URL /p/quadnet/ from this server."
it's my fault (bad client or bad actions) or it's because you should give me a read acces before ?
Thanks a lot
Gilles,
Currently the project is not posted but we will be going live soon, the new project site is available at http://dotcopter.net/
#108
Posted 31 March 2011 - 05:20 PM
Where is the code ? How do we get access to it ? I like the plug and play framework philosophy and want to build a netduino quadcopter with kalman filters for stability ... I want to contribute too but you guys are way ahead of me ... I just started !
So how can I get the code ?
#109
Posted 02 August 2011 - 12:16 AM
#110
Posted 03 August 2011 - 02:07 PM
Total BOCS Traveled Distance: 9708 miles | States Visited: 5
Track the Box
#111
Posted 03 August 2011 - 03:44 PM
You've been busy!code would be great. I've got my quadrocopter physically built and am onto the software part of it. Would love to see a full .net implementation.
#112
Posted 03 August 2011 - 06:48 PM
code would be great. I've got my quadrocopter physically built and am onto the software part of it. Would love to see a full .net implementation.
Are you using a Motion Plus for the gyroscope? I have developed the code for the Classic Controller and for the Nunchuck but I'm having problems communicating with the Motion Plus. I wanted to have a NETMF-based quadcopter similar to the MultiWii solution.
My code is available at https://bitbucket.org/aalmada/hydramf/
aalmada
#113
Posted 03 August 2011 - 10:20 PM
You've been busy!
Have had it built for a few weeks, although the tinkering is never done
Total BOCS Traveled Distance: 9708 miles | States Visited: 5
Track the Box
#114
Posted 04 August 2011 - 03:52 PM
#115
Posted 05 December 2011 - 11:39 PM
#116
Posted 15 June 2012 - 01:15 AM
Hover Test 1
public void DoStability() { do { TimeSpan elapsedSpan = new TimeSpan((DateTime.Now.Ticks - LastTicks)); LastTicks = DateTime.Now.Ticks; Analog.SyncScanInputs(); int[] ServerValue = Telemetery.ServerValues; //Datums TricopterSettings.LeftPivotDatum = ServerValue[1]; TricopterSettings.RightPivotDatum = ServerValue[2]; //Some debug stuff PitchPID.Pgain = ServerValue[4]; RollPID.Pgain = ServerValue[5]; YawPID.Pgain = ServerValue[6]; X_PID.Pgain = ServerValue[9]; Y_PID.Pgain = ServerValue[10]; Z_PID.Pgain = ServerValue[11]; int StationHold = ServerValue[12]; //Set demands Throttle.ThrottleDemand = ((double)ServerValue[3] / 10.0); Throttle.PitchRate_degSec = 0;// (double)Telemetery.ServerValue(0); Throttle.RollRate_degSec = 0; Throttle.YawRate_degSec = 0; //X Y Z Rotate in yaw command rates int X_Transalate = 0; int Y_Transalate = 0; int Z_Transalate = 0; //Get the throttle demand in % and pitch,roll,yaw rates in deg/Sec int throttle = (int)(Throttle.ThrottleDemand * ((double)TricopterSettings.ThrottleScaler / 1000.0)); //Get pich,roll,yaw rates requested int pitchrate = (int)(Throttle.PitchRate_degSec * ((double)TricopterSettings.PitchRateScaler / 1000.0)); int rollrate = (int)(Throttle.RollRate_degSec * ((double)TricopterSettings.RollRateScaler / 1000.0)); int yawrate = (int)(Throttle.YawRate_degSec * ((double)TricopterSettings.YawRateScaler / 1000.0)); //Control PID enables if (Throttle.ThrottleDemand < (double)TricopterSettings.ThrottleMin) { WOZ(); Pitch_PID.Enable = false; Roll_PID.Enable = false; Yaw_PID.Enable = false; X_PID.Enable = false; Y_PID.Enable = false; Z_PID.Enable = false; } else { Pitch_PID.Enable = true; Roll_PID.Enable = true; Yaw_PID.Enable = true; X_PID.Enable = true; Y_PID.Enable = true; Z_PID.Enable = true; } //X Y Z Accel sensors int X_Input = (Analog.AnIn(Analog.AN_IN.Accel_X) - m_X_AccelWOZ); int Y_Input = (Analog.AnIn(Analog.AN_IN.Accel_Y) - m_Y_AccelWOZ); int Z_Input = (Analog.AnIn(Analog.AN_IN.Accel_Z) - m_Z_AccelWOZ); //Do rolling average X_AccelAccumulator[c] = (Int16)X_Input; Y_AccelAccumulator[c] = (Int16)Y_Input; Z_AccelAccumulator[c] = (Int16)Z_Input; X_AccelMean = 0; Y_AccelMean = 0; Z_AccelMean = 0; /* const int NumPoints = 10; for (int i = 0; i < NumPoints; i++) { X_AccelMean += (int)X_AccelAccumulator[i]; Y_AccelMean += (int)Y_AccelAccumulator[i]; Z_AccelMean += (int)Z_AccelAccumulator[i]; } X_AccelMean /= NumPoints; Y_AccelMean /= NumPoints; Z_AccelMean /= NumPoints; */ if ((++c) > 50) c = 0; //Get the Gyro inputs int Pitch_Input = (Analog.AnIn(Analog.AN_IN.Gyro_X) - m_PitchGyroWOZ); int Roll_Input = (Analog.AnIn(Analog.AN_IN.Gyro_Y) - m_RollGyroWOZ); int Yaw_Input = (Analog.AnIn(Analog.AN_IN.Gyro_Z) - m_YawGyroWOZ); //Calculate X Y Z rate PID inputs X_PID.Input = (X_Input - X_Transalate);// + X_AccelMean; Y_PID.Input = (Y_Input + Y_Transalate);// + Y_AccelMean; Z_PID.Input = (Z_Input + Z_Transalate);// + Z_AccelMean; //Debug.Print("inputs X:" + X_Input.ToString() + " Y:" + Y_Input.ToString() + " Z:" + Z_Input.ToString()); //Sync update the Accel PID's X_PID.SyncUpdate(); Y_PID.SyncUpdate(); Z_PID.SyncUpdate(); int x_AccelTrim = X_PID.Output; int y_AccelTrim = Y_PID.Output; int z_AccelTrim = Z_PID.Output;//Note Z not used currently //Debug.Print("Trims X:" + x_trim.ToString() + " Y:" + y_trim.ToString() + " Z:" + z_trim.ToString()); //Calculate inputs for Rotation PID's Pitch_PID.Input = (Pitch_Input - pitchrate); Roll_PID.Input = (Roll_Input - rollrate); Yaw_PID.Input = (Yaw_Input - yawrate); //Sync update the Gyro PID's Pitch_PID.SyncUpdate(); Roll_PID.SyncUpdate(); Yaw_PID.SyncUpdate(); //Get the PID Outputs int pitch_trim = Pitch_PID.Output; int roll_trim = Roll_PID.Output; int yaw_trim = Yaw_PID.Output; //Debug.Print("P:" + pitch_trim.ToString() + " R:" + roll_trim.ToString() + " Y:" + yaw_trim.ToString()); //Debug.Print("Trims X:" + x_trim.ToString() + " Y:" + y_trim.ToString() + " Z:" + z_trim.ToString()); #if DEBUG if ((c % 50) == 0) { Debug.Print("Tick " + elapsedSpan.Milliseconds.ToString()); Debug.Print("StationHold " + StationHold.ToString()); //Debug.Print("woz\t" + m_X_AccelWOZ.ToString() + "\t" + m_Y_AccelWOZ.ToString() + "\t" + m_Z_AccelWOZ.ToString()); Debug.Print("Gyro\t" + pitch_trim.ToString() + "\t" + roll_trim.ToString() + "\t" + yaw_trim.ToString()); Debug.Print("Accel\t" + x_AccelTrim.ToString() + "\t" + y_AccelTrim.ToString() + "\t" + z_AccelTrim.ToString()); //Debug.Print("Mean\t" + X_AccelMean.ToString() + "\t" + Y_AccelMean.ToString() + "\t" + Z_AccelMean.ToString()); } #endif int RollBias = ServerValue[7];//Left Right Bias int PitchBias = ServerValue[0];//Pitch Bias int YawBias = ServerValue[8];//Yaw Bias //Calculate the target speeds for the rotorsx_trim //Goes - then + int LeftRPM = throttle - roll_trim - RollBias + y_AccelTrim; int RightRPM = throttle + roll_trim + RollBias - y_AccelTrim; //Pitch acts on the tail rotor only int TailRPM = throttle + pitch_trim + PitchBias - x_AccelTrim; //Calculate pivot positions for yaw //remember the servos face away from each other hense - on left and right int LeftPivot = TricopterSettings.LeftPivotDatum + yaw_trim + YawBias;// -x_AccelTrim; int RightPivot = TricopterSettings.RightPivotDatum + yaw_trim + YawBias;// +x_AccelTrim; if (LeftPivot < 650) LeftPivot = 650; else if (LeftPivot > 980) LeftPivot = 980; if (RightPivot < 650) RightPivot = 650; else if (RightPivot > 980) RightPivot = 980; //Set the pivot targets Servos.SetServo(Servos.eServo.LeftPivot, LeftPivot); Servos.SetServo(Servos.eServo.RightPivot, RightPivot); //Set the ESC targets Servos.SetServo(Servos.eServo.LeftRPM, LeftRPM); Servos.SetServo(Servos.eServo.RightRPM, RightRPM); Servos.SetServo(Servos.eServo.TailRPM, TailRPM); } while (m_Threaded); }
#117
Posted 25 December 2012 - 06:17 AM
#118
Posted 23 January 2013 - 01:31 PM
I cannot help but wonder whether required thrust can be expressed as a function of inputs using an FPGA. Possibly one per motor. I would expect inputs to include
- required vector
- accelerometers
- gyros
- velocity
- current vector
- last-interation thrust values for all engines
and of course it would be necessary to clip the magnitude of the requested vector to what is actually possible with available thrust.
Using an FPGA would make it possible to make very frequent microadjustments; the Netduino would fulfil a role more like an autopilot. Such an arrangement would be excellent for building a drone.
#119
Posted 11 March 2014 - 05:09 AM
Brandon/Luke, do you guys have any updates for the community on this really cool project?
Have you guys used with the Netduino 2 or Netduino Plus 2 for this project?
Thanks
- Tobias Vandenbempt likes this
#120
Posted 18 April 2014 - 09:20 AM
Yes! Please! Get the guys on this forum playing with Quad.net, especially if you guys have dropped this altogether.
1 user(s) are reading this topic
0 members, 1 guests, 0 anonymous users