Netduino home hardware projects downloads community

Jump to content


The Netduino forums have been replaced by new forums at community.wildernesslabs.co. This site has been preserved for archival purposes only and the ability to make new accounts or posts has been turned off.

Brandon G's Content

There have been 92 items by Brandon G (Search limited from 29-March 23)


By content type

See this member's


Sort by                Order  

#16328 Quad.Net Quadrocopter for .NETMF

Posted by Brandon G on 04 August 2011 - 03:52 PM in Project Showcase

Hi guys, Long time, I have fallen into an abyss of work and have not been able to track back at all here. Last bit of progress was a generic plug and play driver system that is 90% finished. Luke and I touched base the other day and as my work schedule slows we will be back to contributing. Will post back here as soon as I can Brandon



#10645 Quadcopter Early Flight

Posted by Brandon G on 07 March 2011 - 06:53 PM in Project Showcase

great job JBW, PM me when you get a chance



#9590 Automated Build and Deploy

Posted by Brandon G on 15 February 2011 - 06:45 PM in General Discussion

Hey guys, sorry if this has been posted before but I have yet to find it in my searches. I have a windows form app that is used to generate a configuiration file, I would then like to embed the config file as a resource in a netmf project and then do a build and deploy. I have seen similar things before when people try to use VB.NET instead of C# on microframework so i know its possible just wondering if anyone has already done this and wants to share the project. Think it would be a handy little library for everybody, also gets around the weak references issue with config files



#9547 Runtime Native Code Interop

Posted by Brandon G on 14 February 2011 - 09:04 PM in General Discussion

Chris,
Thank you for this. I think this will help a great deal in the cases where near realtime is necessary. I know this requires alot of work to integrate and glad your team are doing it. I would really hope that the NETMF team will take you and GHI's lead as far as providing interops and push it into NETMF. I love managed code and will always write in it when i can, even when knowing i am sacrificing speed for elegance, but given my recent project DotCopter.NET there is no way it can all be done in managed. So in an appeal to the NETMF team, to avoid further fragmentation, they need to pull this into the framework for the cases where its a last resort.

Again, thank you for your efforts Chris.
Brandon



#9468 Microsoft.SPOT.Reflection.Serialize() / Deserialize() throws System.NotImplem...

Posted by Brandon G on 14 February 2011 - 12:07 AM in General Discussion

not a problem Fabien, same goes here. I am really not happy with what i've posted so far and starting to think aboutserialization in terms of config and xml and using weak references space lately



#9146 NetDuino Quadrocopter

Posted by Brandon G on 08 February 2011 - 05:35 AM in Netduino 2 (and Netduino 1)

kind of a strange idea to combine hydrogen and a quad, whats the lift lb/vol? wonder if you could add hydrogen to the structure without compromising aerodynamics and not blowing up (i would suggest inert). We've taken a pretty good look at all the open source offerings, they are all good but all quite specialized and dont read well. long term goal is to run all on the same mcu but as the hardware and framework stand now, impractical. We are running gyro and motors on netduino, radio on another mcu. The razor is great but defeats the purpose of what we're trying to do, we want to make the predictions and math and understand it, not have it written for us. On the other thread we have another interested user that has written a netmf handler for razor. From here on out i would suggest you write to other thread



#9129 Interesting news Pyxis

Posted by Brandon G on 07 February 2011 - 07:32 PM in General Discussion

http://www.engadget....-embedded-chip/



#9121 NetDuino Quadrocopter

Posted by Brandon G on 07 February 2011 - 04:34 PM in Netduino 2 (and Netduino 1)

Hi dan, we've made some great progress in the last week. Our gc is running once every 10 seconds and is a very fast sweep, thats with telemetry logging via my custom serialization class. We will be moving source to eith GITHub or codeplex in the next few days. I have no personal experience with the shield given that we are starting simple only using 3 degrees to get off the ground, we want to be stable with only a gyro, then we can get fancy later. our main thread can be found here http://forums.netdui...pter-for-netmf/ we are also going to start posting on rcgroups once we finally get some hardware in and show our first stable flight via video



#9009 Quad.Net Quadrocopter for .NETMF

Posted by Brandon G on 04 February 2011 - 08:52 PM in Project Showcase

Thanks Zerov, do you want commit authority on the source? I've looke at your stuff as well, i think there's alot we can do to help one another, like your circular byte collection code.



#8966 Anybody interested in a cheap IMU?

Posted by Brandon G on 04 February 2011 - 01:51 AM in General Discussion

I think it really depends on the applications requirements. In my case I am controlling a loop and want to read every 200ms which I think can be acomplished and the overhead is ok. I am no expert though I'm learning as I go. What are you using the imu for?



#8955 Anybody interested in a cheap IMU?

Posted by Brandon G on 03 February 2011 - 10:48 PM in General Discussion

Chris will be able to answer better, but yes from what i understand there would be no compensation and no mcu. from the razor one here's an implementation by zerov https://code.google..../QuadroLib/Ahrs which might give you an idea of the data coming down



#8951 Anybody interested in a cheap IMU?

Posted by Brandon G on 03 February 2011 - 09:18 PM in General Discussion

I'd take one as well, that was the board i was going to buy but didnt want the old magnetometer, polling via i2c works for my application



#8924 Microsoft.SPOT.Reflection.Serialize() / Deserialize() throws System.NotImplem...

Posted by Brandon G on 03 February 2011 - 04:10 AM in General Discussion

like i said, aint great but one thing i have noticed about netmf is a major need for optimization and special cases, elegance is sacrificed for speed



#8911 Quad.Net Quadrocopter for .NETMF

Posted by Brandon G on 02 February 2011 - 09:39 PM in Project Showcase

yea we wanted to start simple, but 9dof is next step, euler is something we ae implementing at that point, i have a stub for euler and tait and would love if you could expand that.



#8909 Quad.Net Quadrocopter for .NETMF

Posted by Brandon G on 02 February 2011 - 09:21 PM in Project Showcase

updated source to clarify usage, escs are taken out



#8904 Quad.Net Quadrocopter for .NETMF

Posted by Brandon G on 02 February 2011 - 08:51 PM in Project Showcase

the esc code is depricated, we dont use it, the starting point is from the fez panda implementation right now. If logging is taken out ie(send in a null logger, or take out the write from the control loop) we have no GC hit at all given everything is declared up front, the telemetry data is for debugging. just because its abstract doesnt mean its heavy, it means its flexible. we have maxed out at 500hz, the config allows you to set the hz for each update whenever you want within the loop, you can set your imu, your radio and pid hz, we are still finding out what is the optimal times to run each



#8901 Quad.Net Quadrocopter for .NETMF

Posted by Brandon G on 02 February 2011 - 07:58 PM in Project Showcase

https://code.google.com/p/quadnet/



#8900 Quad.Net Quadrocopter for .NETMF

Posted by Brandon G on 02 February 2011 - 07:58 PM in Project Showcase

Hi Chris, Take a checkout of ours and tell me if you want to merge a bit where you think necessary, it looks like we're a bit further and if you have any experience writing control loops or quad code, the more help the better



#8886 Microsoft.SPOT.Reflection.Serialize() / Deserialize() throws System.NotImplem...

Posted by Brandon G on 02 February 2011 - 04:15 PM in General Discussion

updated above, as i said this a very very specific and optimistic serialization system for my exact purposes, but the idea is sound and could be used in other places, u merely have to implement ISerializable on your class and insert a type into the serialize message in order to dynamically invoke the constructor, i know i am in this instance only serializing one type with this formatter so i have put that statically in, you could easily put in a header to accomplish this such as stx....type...data...etx once you know your type merely parse and dynamically invoke and assume T : new()



#8867 Quad.Net Quadrocopter for .NETMF

Posted by Brandon G on 02 February 2011 - 05:55 AM in Project Showcase

all of them have great reviews, i may be following your lead here. frame wise i am still uncertain i might be going full on here and get one of these guys http://www.maximus-r...fr/maxicopters/



#8862 Reference NETMF libraries in .NET

Posted by Brandon G on 02 February 2011 - 05:34 AM in General Discussion

I think i ran into a brick wall here, which .NET 4.0 project in the sdk loads up assemblies based in NETMF 4.0? Here's the error i get, i dont necessarily want to emulate hardware i merely want to use some of its assemblies I will always get the error ECall methods must be packaged into a system module I have successfully run test before that called simple classes but the call i am making from a form app to netmf dll is using Spot.Hardware which I cant see how to load that in



#8861 Microsoft.SPOT.Reflection.Serialize() / Deserialize() throws System.NotImplem...

Posted by Brandon G on 02 February 2011 - 05:20 AM in General Discussion

oh and i havent written tests for it yet, once i have and made this a little more generic i will psot as a zip



#8860 Microsoft.SPOT.Reflection.Serialize() / Deserialize() throws System.NotImplem...

Posted by Brandon G on 02 February 2011 - 05:18 AM in General Discussion

Heres a very prelim write of this with some simple implementations as you can see i am putting the responsibility on the ISerializable object for now, not a full object graph, as i extend this i will update, right now its pretty ugly and specific


EDIT: didnt like what i posted earlier, here`s a revamp
using Quad.Net.Commons.Serialization;

namespace Quad.Net.Commons.Logging
{
    public interface ILogger
    {
        void Flush();
        void Write(ISerializable obj);
    }
}

using System.IO;
using Quad.Net.Commons.Serialization;

namespace Quad.Net.Commons.Logging
{
    public class PersistenceWriter : ILogger
    {
        private readonly IBinaryFormatter _formatter;
        private readonly string _fileName;
        private readonly FileStream _fileStream;

        public PersistenceWriter(string fileName, IBinaryFormatter formatter)
        {
            _formatter = formatter;
            _fileName = fileName;
            _fileStream = new FileStream(_fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, 512);
        }

        public void Flush()
        {
            _fileStream.Flush();
        }

        
        public void Write(ISerializable obj)
        {
            _formatter.Serialize(_fileStream, obj);

        }
    }
}


using System.IO;
using Quad.Net.Commons.Serialization;

namespace Quad.Net.Commons.Logging
{
    public class PersistanceReader
    {
        private readonly IBinaryFormatter _binaryFormatter;

        public PersistanceReader(IBinaryFormatter binaryFormatter)
        {
            _binaryFormatter = binaryFormatter;
            
        }
        public ISerializable[] GetMessages(string readPath)
        {
            FileStream readFile = new FileStream(readPath, FileMode.Open, FileAccess.Read);
            return _binaryFormatter.Deserialize(readFile);
        }
    }
}

using System;
using System.IO;

namespace Quad.Net.Commons.Serialization
{
    public interface IBinaryFormatter
    {
        void Serialize(Stream stream, Object graph);//not implemented
        ISerializable[] Deserialize(Stream stream);
        void Serialize(Stream stream, ISerializable graph);//optimistic
    }
}


namespace Quad.Net.Commons.Serialization
{
    public interface ISerializable //:  where T : new() in classic C# this is what i would do force a parameterless contructor, cant do thisin netmf
    {
        byte[] Serialize();
        object Deserialize(byte[] buffer);
    }
}

using System;
using System.Collections;
using System.IO;

namespace Quad.Net.Commons.Serialization
{
    public class TelemetryFormatter:IBinaryFormatter
    {
        public void Serialize(Stream stream, object graph)
        {
            throw new NotImplementedException();
        }

        public ISerializable[] Deserialize(Stream stream)
        {
            ISerializable[] items = new ISerializable[stream.Length/44];
            int counter = 0;
            while (stream.Position < stream.Length)
            {
                byte[] buffer = new byte[44];
                stream.Read(buffer, 0, 44);
                ISerializable item  = (ISerializable) typeof(TelemetryData).GetConstructor(new Type[0]).Invoke(new object[0]);
                item.Deserialize(buffer);
                items[counter] = item;
                counter++;
            }
            return items;
        }

        public void Serialize(Stream stream, ISerializable graph)
        {
            byte[] buffer = graph.Serialize();
            stream.Write(buffer, 0, buffer.Length);
        }
    }
}


using System;
using Microsoft.SPOT.Hardware;
using Quad.Net.Avionics;
using Quad.Net.Commons.Serialization;
using Quad.Net.Commons.Utilities;

namespace Quad.Net.FlightController
{
    public class TelemetryData : ISerializable
    {
        private readonly AircraftPrincipalAxes  _gyroAxes;
        private readonly AircraftPrincipalAxes _radioAxes;
        private readonly AircraftPrincipalAxes _pidAxes;
        private long _currentTime;
        private readonly byte[] _buffer;
        public TelemetryData()
        {
            _gyroAxes= new AircraftPrincipalAxes(0,0,0);
            _radioAxes = new AircraftPrincipalAxes(0, 0, 0);
            _pidAxes = new AircraftPrincipalAxes(0, 0, 0);
            _currentTime = DateTime.Now.Ticks;
            _buffer = new byte[44];
        }

        public void Update(AircraftPrincipalAxes gyroAxes, AircraftPrincipalAxes radioAxes, AircraftPrincipalAxes pidAxes, long currentTime)
        {
            _gyroAxes.Update(gyroAxes.Pitch,gyroAxes.Roll,gyroAxes.Yaw);
            _radioAxes.Update(radioAxes.Pitch, radioAxes.Roll, radioAxes.Yaw);
            _pidAxes.Update(pidAxes.Pitch, pidAxes.Roll, pidAxes.Yaw);
        }

        public byte[] Serialize()
        {
            Utility.InsertValueIntoArray(_buffer, 0, 4, (uint)(_currentTime >> 32));
            Utility.InsertValueIntoArray(_buffer, 4, 4, (uint)_currentTime);
            Utility.InsertValueIntoArray(_buffer, 8, 4, (uint)_gyroAxes.Pitch);
            Utility.InsertValueIntoArray(_buffer, 12, 4, (uint)_gyroAxes.Roll);
            Utility.InsertValueIntoArray(_buffer, 16, 4, (uint)_gyroAxes.Yaw);

            Utility.InsertValueIntoArray(_buffer, 20, 4, (uint)_radioAxes.Pitch);
            Utility.InsertValueIntoArray(_buffer, 24, 4, (uint)_radioAxes.Roll);
            Utility.InsertValueIntoArray(_buffer, 28, 4, (uint)_radioAxes.Yaw);

            Utility.InsertValueIntoArray(_buffer, 32, 4, (uint)_pidAxes.Pitch);
            Utility.InsertValueIntoArray(_buffer, 36, 4, (uint)_pidAxes.Roll);
            Utility.InsertValueIntoArray(_buffer, 40, 4, (uint)_pidAxes.Yaw);
            return _buffer;
        }

        public object Deserialize(byte[] buffer)
        {
            _currentTime = BitConverter.ToLong(buffer, 0);
            _gyroAxes.Update(
                Utility.ExtractValueFromArray(buffer, 8, 4),
                Utility.ExtractValueFromArray(buffer, 12, 4),
                Utility.ExtractValueFromArray(buffer, 16, 4)
                );
            _radioAxes.Update(
                Utility.ExtractValueFromArray(buffer, 20, 4),
                Utility.ExtractValueFromArray(buffer, 24, 4),
                Utility.ExtractValueFromArray(buffer, 28, 4)
                );
            _pidAxes.Update(
                Utility.ExtractValueFromArray(buffer, 32, 4),
                Utility.ExtractValueFromArray(buffer, 36, 4),
                Utility.ExtractValueFromArray(buffer, 40, 4)
                );
            return this;
        }

        public override string ToString()
        {
            //csv format
            return _currentTime + "," +
                   _gyroAxes.Pitch + "," +
                   _gyroAxes.Roll + "," +
                   _gyroAxes.Yaw + "," +
                   _radioAxes.Pitch + "," +
                   _radioAxes.Roll + "," +
                   _radioAxes.Yaw + "," +
                   _pidAxes.Pitch + "," +
                   _pidAxes.Roll + "," +
                   _pidAxes.Yaw + ",";
        }
    }
}




#8811 Microsoft.SPOT.Reflection.Serialize() / Deserialize() throws System.NotImplem...

Posted by Brandon G on 01 February 2011 - 04:34 PM in General Discussion

i ended up finding that shortly thereafter, thanks Corey. I've stubbed out the whole thing just going for some optimization now. My current application for it is the quadrocopter so has to be heavily optimized and optimistic, a more generic library can be made off it after, will post when done



#8783 Microsoft.SPOT.Reflection.Serialize() / Deserialize() throws System.NotImplem...

Posted by Brandon G on 01 February 2011 - 01:20 AM in General Discussion

So i started to get into it and I have come across some road blocks and cant seem to find a way around it. Reflection being limited i cant even call CreateInstance() or the other method i had up my sleeve FormatterServices.GetUninitializedObject() or Activator.CreateInstance, is there anyway to initialize an object from a string at all in netmf, otherwise i think we're shit out of luck short of some ugly case statements




home    hardware    projects    downloads    community    where to buy    contact Copyright © 2016 Wilderness Labs Inc.  |  Legal   |   CC BY-SA
This webpage is licensed under a Creative Commons Attribution-ShareAlike License.