Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Using one gyro sensor as two viritual gyros in code (http://www.chiefdelphi.com/forums/showthread.php?t=83846)

lollypop2020 03-03-2010 20:13

Using one gyro sensor as two viritual gyros in code
 
For our code, we need to have the equavalent of two gyros. One of them is used by the driver and by the aiming software and is reset quite frequently. The other one is for the robot's true heading (with error of course), and should not ever be reset. I tried opening two gyro references using the same AI channel, and using each reference respectively where it was needed but I got errors on the DS for trying to use an already allocated AI channel. Is there a way to get around this without keeping track of the angle of the gyro manually? I know I could probably write my own code to have two independant counters that could be used seperately, but I would rather not have to do that, however I will if it's the only option. Could I use a PWM splitter cable and plug one gyro into two AI ports? Or is there anything else I could do?

Bongle 03-03-2010 20:57

Re: Using one gyro sensor as two viritual gyros in code
 
You could make a class of your own that holds a pointer to your original gyro class. It could have a reset function that takes note of the current absolute heading, and a getangle function which returns your difference since the last time you reset.
Code:

class RelativeGyro
{
public:
  RelativeGyro(Gyro* pAbsoluteGyro) : m_pGyro(pAbsoluteGyro), m_dBaseAngle(0.0)
  {
  }

  void Reset()
  {
    m_dBaseAngle = m_pGyro->GetAngle();
  }
  double GetAngle()
  {
    return m_pGyro->GetAngle() - m_dBaseAngle;
  }
private:
  double m_dBaseAngle;
  Gyro* m_pGyro;
}

An advantage of this design is that you could actually create multiple RelativeGyro classes within your robot, if that is what you want. You could have one for shooting, one for target-finding, etc.

If you're not using C++, you'll have to adapt my idea to LabView or Java if you like it.

DavidGitz 04-03-2010 08:39

Re: Using one gyro sensor as two viritual gyros in code
 
That's a good idea about using a PWM Y Cable. That would be by far the easiest option I think.

Russ Beavis 04-03-2010 09:56

Re: Using one gyro sensor as two viritual gyros in code
 
There's no reason why your program can't store the data that you need in separate variables. Aren't there "user data" parameters that can be sent to the Driver Station in addition to the "direct" low-level analog and digital input readings? You should not need to resort to a hardware solution for what is essentially storing a single analog reading in 2 memory locations.

Russ

DavidGitz 04-03-2010 12:22

Re: Using one gyro sensor as two viritual gyros in code
 
Quote:

Originally Posted by Russ Beavis (Post 931330)
There's no reason why your program can't store the data that you need in separate variables. Aren't there "user data" parameters that can be sent to the Driver Station in addition to the "direct" low-level analog and digital input readings? You should not need to resort to a hardware solution for what is essentially storing a single analog reading in 2 memory locations.

Russ

I agree with this statement, generally. However, due to the time limitations through the FRC competition and (probably) lack of a testing environment right now, and not much time available at the regionals, and coupled with the errors they've already recieved, unless a very simple programming approach could be used (i.e. open up 2 references to the same device) I would go through the hardware branch. I'm sure the right way of doing this would be fairly easy, but with lack of a testing environment I would rather have *definitely* be right the first time than have to debug code. Like most things, it is a tradeoff. It wouldn't be the best solution, but might be the most reliable.

AmoryG 04-03-2010 15:36

Re: Using one gyro sensor as two viritual gyros in code
 
Quote:

Originally Posted by DavidGitz (Post 931380)
I agree with this statement, generally. However, due to the time limitations through the FRC competition and (probably) lack of a testing environment right now, and not much time available at the regionals, and coupled with the errors they've already recieved, unless a very simple programming approach could be used (i.e. open up 2 references to the same device) I would go through the hardware branch. I'm sure the right way of doing this would be fairly easy, but with lack of a testing environment I would rather have *definitely* be right the first time than have to debug code. Like most things, it is a tradeoff. It wouldn't be the best solution, but might be the most reliable.

Quote:

Originally Posted by Bongle (Post 931168)
You could make a class of your own that holds a pointer to your original gyro class. It could have a reset function that takes note of the current absolute heading, and a getangle function which returns your difference since the last time you reset.
Code:

class RelativeGyro
{
public:
  RelativeGyro(Gyro* pAbsoluteGyro) : m_pGyro(pAbsoluteGyro), m_dBaseAngle(0.0)
  {
  }

  void Reset()
  {
    m_dBaseAngle = m_pGyro->GetAngle();
  }
  double GetAngle()
  {
    return m_pGyro->GetAngle() - m_dBaseAngle;
  }
private:
  double m_dBaseAngle;
  Gyro* m_pGyro;
}

An advantage of this design is that you could actually create multiple RelativeGyro classes within your robot, if that is what you want. You could have one for shooting, one for target-finding, etc.

If you're not using C++, you'll have to adapt my idea to LabView or Java if you like it.

The above code really is as simple as it gets (that is, if you understand what the code does). If you were to use something like this, all you would need to do is create a RelativeGyro and feed its constructor a pointer or reference to a gyro object:

Gyro gyro(1);

RelativeGyro relativegyro(&gyro);

Then use Reset and GetAngle as you would with any gyro.

lollypop2020 05-03-2010 01:49

Re: Using one gyro sensor as two viritual gyros in code
 
Thanks for all the help! I think I'll probably go with the hardware approach and try to make a PWM splitter before our first match tomorrow. If it doesn't work for some reason, that code doesn't look too bad. I must agree with DavidGitz though, time for debugging is something we do not have, and at the moment, this just seems easier.

virtuald 05-03-2010 13:59

Re: Using one gyro sensor as two viritual gyros in code
 
Quote:

Originally Posted by lollypop2020 (Post 931641)
Thanks for all the help! I think I'll probably go with the hardware approach and try to make a PWM splitter before our first match tomorrow. If it doesn't work for some reason, that code doesn't look too bad. I must agree with DavidGitz though, time for debugging is something we do not have, and at the moment, this just seems easier.

I wouldn't recommend doing it the hardware way. One thing to keep in mind is that the gyro requires the use of an accumulator channel, so you have to use channels that support that (I think the first two channels support it, on the first analog module only). Additionally, you might get some odd effects by connecting two channels together that way. If they accumulate different values, then each of your gyros is going to be offset from the other, and that could cause issues as well.

The software is trivial, do it that way. The code by Bongle looks like it should work as is without any debugging.

EricVanWyk 05-03-2010 14:09

Re: Using one gyro sensor as two viritual gyros in code
 
Quote:

Originally Posted by virtuald (Post 931737)
...

I wish to join the dead horse beaters in this thread. The Y-cable is the cheap fix that will almost definitely bite you later. Spend the extra 10 minutes and do it right.

ideasrule 07-03-2010 22:29

Re: Using one gyro sensor as two viritual gyros in code
 
Quote:

Originally Posted by EricVanWyk (Post 931739)
I wish to join the dead horse beaters in this thread. The Y-cable is the cheap fix that will almost definitely bite you later. Spend the extra 10 minutes and do it right.

That horse never listened to me, so I'll join the club. This code is so simple that it shouldn't require any testing to get right. The people who made the gyro weren't expecting the analog module to draw twice as much current as necessary from the gyro, so if you use the Y-cable approach, you'd be going against what the engineers designed the gyro for. Not a good idea!


All times are GMT -5. The time now is 03:37.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi