Subject:
|
Re: Trigonometry and NQC
|
Newsgroups:
|
lugnet.robotics.rcx.nqc
|
Date:
|
Thu, 13 Dec 2001 00:51:55 GMT
|
Viewed:
|
3131 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 (...) (23 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 (...) (23 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
|
|
|
|