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 / 1272
1271  |  1273
Subject: 
Re: Trigonometry and NQC
Newsgroups: 
lugnet.robotics.rcx.nqc
Date: 
Thu, 13 Dec 2001 00:51:55 GMT
Viewed: 
6076 times
  
In lugnet.robotics.rcx.nqc, Richard Jenkins writes:
> Hi!
> 
> I'm working on a project where a robot needs to travel a right triangle with
> unkown side lengths.  Basically, the robot starts at a point in a room,
> travels perpendicularly toward a wall, turns 90 degrees left when it hits,
> and when it gets to the corner needs to return to the starting point in the
> room (somewhere).  No marks or other guides are provided to help the robot
> find the starting point, but it can obviously measure the distance (or the
> time) of the two perpendicular legs.  I could complete the course making a
> square instead of a triangle, but that's not very elegant.
> 
> I prefer NQC as my Mindstorms programming tool, but it isn't apparent to me
> that it supports trig functions.
> 
> Can anyone offer any suggestions?
> 
> Thanks,
> 
> Rich

Hi Rich,

there are no trig functions, because there's no float.
I had the same problem and was able to approximate these values.

I created two tables with the necessary values.
The first table includes the values of the tangens of a angle. This values
are times 100, because there's no float available.
What you need in fact is the arcustangens. But it's not avbailable. So i
check the values i want to calculate the arcustanges for with my table and
can see the resulting angle +/- 5 degree. (It's not easy to explain in
english, i'm from germany)

So, if the result of the following equation
degree_to_goal = (abs(delta_y)*100)/abs(delta_x);
is 74 (0.74*100) , then the resulting angle is between 35° and 40°

The second table is a table of squares. It's the same priciple as before.
You need a square-root for Pythagoras. But there is no square-root in NQC.
So look in the table to get an approximation of the square-root.

Pay attention, that the values for sqr(x-direction) + sqr(y-direction) do
not exceed 32.767 (because all values in NQC are signed integer (-32768 ->
32767) and you will get wrong results)

It works well. Try it and let me know what you think.

Rainer

**************************************************************************

#define degree5       9  // -> tan(5°)  =  0.0875 // *100 because no float
#define degree10     18  // -> tan(10°) =  0.1763 // *100 because no float
#define degree15     27  // -> tan(15°) =  0.2679 // *100 because no float
#define degree20     36  // -> tan(20°) =  0.364  // *100 because no float
#define degree25     47  // -> tan(25°) =  0.4663 // *100 because no float
#define degree30     58  // -> tan(30°) =  0.5774 // *100 because no float
#define degree35     70  // -> tan(35°) =  0.7002 // *100 because no float
#define degree40     84  // -> tan(40°) =  0.8391 // *100 because no float
#define degree45    100  // -> tan(45°) =  1      // *100 because no float
#define degree50    119  // -> tan(50°) =  1.1918 // *100 because no float
#define degree55    143  // -> tan(55°) =  1.4281 // *100 because no float
#define degree60    173  // -> tan(60°) =  1.7321 // *100 because no float
#define degree65    214  // -> tan(65°) =  2.1445 // *100 because no float
#define degree70    275  // -> tan(70°) =  2.7475 // *100 because no float
#define degree75    373  // -> tan(75°) =  3.7321 // *100 because no float
#define degree80    567  // -> tan(80°) =  5.6713 // *100 because no float
#define degree85   1143  // -> tan(85°) = 11.4301 // *100 because no float

#define Square10      100      // square-root 100   = 10
#define Square20      400      // square-root 400   = 20
#define Square30      900      // square-root 900   = 30
#define Square40     1600      // square-root 1600  = 40
#define Square50     2500      // square-root 2500  = 50
#define Square60     3600      // square-root 3600  = 60
#define Square70     4900      // square-root 4900  = 70
#define Square80     6400      // square-root 6400  = 80
#define Square90     8100      // square-root 8100  = 90
#define Square100   10000      // square-root 10000 = 100
#define Square110   12100      // square-root 12100 = 110
#define Square120   14400      // square-root 14400 = 120
#define Square130   16900      // square-root 16900 = 130
#define Square140   19600      // square-root 19600 = 140
#define Square150   22500      // square-root 22500 = 150
#define Square160   25600      // square-root 25600 = 160
#define Square170   28900      // square-root 28900 = 170
#define Square180   32400      // square-root 32400 = 180


// Approximate angle to destination !

degree_to_goal = (abs(delta_y)*100)/abs(delta_x); // times 100,
                                                  //because no float
if (degree_to_goal < degree5){
  degree_to_goal = 5;
}
else if (degree_to_goal < degree10){
  degree_to_goal = 10;
}else if (degree_to_goal < degree15){
  degree_to_goal = 15;
}else if (degree_to_goal < degree20){
  degree_to_goal = 20;
}else if (degree_to_goal < degree25){
  degree_to_goal = 25;
}else if (degree_to_goal < degree30){
  degree_to_goal = 30;
}else if (degree_to_goal < degree35){
  degree_to_goal = 35;
}else if (degree_to_goal < degree40){
  degree_to_goal = 40;
}else if (degree_to_goal < degree45){
  degree_to_goal = 45;
}else if (degree_to_goal < degree50){
  degree_to_goal = 50;
}else if (degree_to_goal < degree55){
  degree_to_goal = 55;
}else if (degree_to_goal < degree60){
  degree_to_goal = 60;
}else if (degree_to_goal < degree65){
  degree_to_goal = 65;
}else if (degree_to_goal < degree70){
  degree_to_goal = 70;
}else if (degree_to_goal < degree75){
  degree_to_goal = 75;
}else if (degree_to_goal < degree80){
  degree_to_goal = 80;
}else if (degree_to_goal < degree85){
  degree_to_goal = 85;
}else{
  degree_to_goal = 90;
}

// Approximate distance to destination !

distance = (delta_x*delta_x)+(delta_y*delta_y); // nearly Pythagoras,
                                                // except of the square-root
if (distance >= Square180){
  distance = 180;
} else if (distance >= Square170){
  distance = 170;
} else if (distance >= Square160){
  distance = 160;
} else if (distance >= Square150){
  distance = 150;
} else if (distance >= Square140){
  distance = 140;
} else if (distance >= Square130){
  distance = 130;
} else if (distance >= Square120){
  distance = 120;
} else if (distance >= Square110){
  distance = 110;
} else if (distance >= Square100){
  distance = 100;
} else if (distance >= Square90){
  distance = 90;
} else if (distance >= Square80){
  distance = 80;
} else if (distance >= Square70){
  distance = 70;
} else if (distance >= Square60){
  distance = 60;
} else if (distance >= Square50){
  distance = 50;
} else if (distance >= Square40){
  distance = 40;
} else if (distance >= Square30){
  distance = 30;
} else if (distance >= Square20){
  distance = 20;
} else if (distance >= Square10){
  distance = 10;
} else {
  distance = 0;
}
*******************************************************************



Message has 1 Reply:
  Re: Trigonometry and NQC
 
Thank you for these posts! This idea of creating a table of arctangents is just what I need. I'll let everyone know how it works after I redesign the racer. (The prototype, designed for speed, experienced a significant mechanical shock when it (...) (25 years ago, 14-Dec-01, to lugnet.robotics.rcx.nqc)

Message is in Reply To:
  Trigonometry and NQC
 
Hi! I'm working on a project where a robot needs to travel a right triangle with unkown side lengths. Basically, the robot starts at a point in a room, travels perpendicularly toward a wall, turns 90 degrees left when it hits, and when it gets to (...) (25 years ago, 12-Dec-01, to lugnet.robotics.rcx.nqc)

5 Messages in This Thread:



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

This Message and its Replies on One Page:
Nested:  All | Brief | Compact | Dots
Linear:  All | Brief | Compact
    

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