To LUGNET HomepageTo LUGNET News HomepageTo LUGNET Guide Homepage
 Help on Searching
 
Post new message to lugnet.robotics.rcx.nqcOpen lugnet.robotics.rcx.nqc in your NNTP NewsreaderTo LUGNET News Traffic PageSign In (Members)
 Robotics / RCX / NQC / 1490
1489  |  1491
Subject: 
Problems with NQC and math operations
Newsgroups: 
lugnet.robotics.rcx.nqc
Date: 
Sun, 2 Feb 2003 06:17:49 GMT
Viewed: 
5204 times
  
Hi-

I'm currently working on a project to get a dead-reckoning navigation system
to work with NQC and the RCX.  Right now I have a compass sensor and a
rotation sensor hooked up and the idea is that with an angle and a distance,
I can get an x and y position.  Of course, this involves sines and cosines
which NQC is incapable of doing.  So to solve this problem I used Taylor
series polynomials to approximate sine and cosine...this seems to work fine,
and I get values that are pretty close to what the actual values should be.
I later ran into another problem which was that the robot was giving me
incorrect x and y positions because in the middle of the operation, it would
divide by a large number and then end up truncating the result to zero.
This
problem was solved by multiplying by 10000 before the operation and then
dividing by 10000 at the end.  This is the point at which I ran into a
really strange problem.  I would test to see if the robot was doing the
operations correctly by simply replacing the places where I used variables
with numbers where I knew what the correct result would be.  When I was
convinced that it was doing the operations correctly, I just replaced the
numbers I had used to test, with the variables again.  Logically, everything
should work the same...but it didn't...it returned 0 every time...for some
reason using variables in my expression doesn't work.  Here's a little bit
of the code...
Rotation is the rotation sensor value, Direction is the compass sensor value
and current x and current y were both initialized as 0 (the robot assumes it
starts at (0,0).

        D = abs(Rotation);
         theta = Direction * 18/5;  //since the compass sensor uses 0-100 I
have to convert to the standard 0-360
         oldx = currentx;
         oldy = currenty;
         if (theta >= 0 && theta <= 90) //this is only the portion of the
code if the robot is moving in the direction of the first quadrant
         {
              theta = 90 - theta;
              currentx = (10000 * 3 * theta / 180 * D) / 10000;
              currenty = (10000 * D - theta * theta * 125 * D/ 81)/10000;
//(1 - (10 * (theta * theta))/64800) * D;
          }

So if I simply replace theta with 51 and D with 15 the robot returns the
correct value of
12 for current x and 8 for current y.

But when I use the variables...either point the robot in the right direction
and right number of rotations, or even initialize them at 51 and 15...the
robot returns 0 for currentx and currenty...

This really has me puzzled as I can't see any logical explanation for it...I
hope I'm overlooking something simple...

Anybody have any idea what's going on here?
Thanks for your help!

Jeff



Message has 2 Replies:
  Re: Problems with NQC and math operations
 
Jeff, Your problem is with the 16 bit integer size that NQC uses. All integers are in the range -32768 to 32767. Using 10000 to simulate fixed point math operations is killing you. Everything works when you replace theta and D with constants because (...) (21 years ago, 2-Feb-03, to lugnet.robotics.rcx.nqc)
  Re: Problems with NQC and math operations
 
(...) Did you considered that the RCX has only integer variables. So, the allowed operation range is -32768 32767. If at any stage of your operation you exceed these limits, the result will be corrupted. For the use of sine and cosine with integer (...) (21 years ago, 3-Feb-03, to lugnet.robotics.rcx.nqc)

6 Messages in This Thread:


Entire Thread on One Page:
Nested:  All | Brief | Compact | Dots
Linear:  All | Brief | Compact
    

Custom Search

©2005 LUGNET. All rights reserved. - hosted by steinbruch.info GbR