Go Down

### Topic: Calculating heading distance, and direction (Read 4774 times)previous topic - next topic

#### TarlSS

##### Feb 28, 2012, 03:10 am
Hi,

I'm having an extremely difficult time getting heading calculations correctly.

For example:
I have a rover with a current heading of 270 degrees
I want it to face 100 degrees.
How do I calculate
-What is the shortest distance, in degrees, to get to 100?
-Which direction should the rover turn to get to 100?

I know it should be very simple, but for some reason the math is really throwing me off.

#### RuggedCircuits

#1
##### Feb 28, 2012, 03:36 am
First compute the difference of the two numbers (270-100 --> 170 degrees). Now subtract 360 from the largest number and do it again ((270-360)-100 --> -190 degrees). The smaller number in magnitude tells you how far apart they are in angle: 170 degrees.

To figure out the direction, figure out whether you need to add or subtract 170 degrees to get from your current angle to target angle: the answer tells you which way you have to turn. If you subtract you're going counter-clockwise, else clockwise.

--
The MegaRAM shield: add 128 kilobytes of external RAM to your Arduino Mega/Mega2560

#### cyberteque

#2
##### Feb 28, 2012, 05:22 am
OK!

It had me stumped for a bit as well!

Mainly headings around due north, 0/360 degrees.

#### TarlSS

#3
##### Feb 28, 2012, 06:51 am
Thanks for the help!

But it doesn't quite work.

Check out this example
Init Heading: 5
Target Heading: 355

num1=355-5=350
num2=5-360=-355-355=-710

350 is selected as our distance

350+5= 355, so we go clockwise.

When infact, to get to 355 from 5, we should be going counterclockwise 10 degrees.

Any ideas?

#### BenF

#4
##### Feb 28, 2012, 07:16 am

I'm having an extremely difficult time getting heading calculations correctly.

This is quite simple once you realize that headings first need to be normalized to +/- 180 degrees (as opposed to 0-360). Shortest turn is then the normalized difference between the new and current heading. Direction to turn is left for a negative difference and right otherwise.

Example:
Current heading: 270   (normalized to -90)
New heading: 100   (normalized to 100)

Turn = 100 - (-90) = 190 (normalized to -170)

Shortest turn to reach 100 from 270 is then to turn 170 degrees left.

To convert from 0-360 to +/-180 can be done as follows:

Code: [Select]
`While (heading > 180) heading -= 360While (heading < - 180) heading += 360`

#### cyberteque

#5
##### Feb 28, 2012, 07:41 am
Quote
This is quite simple once you realize that headings first need to be normalized to +/- 180 degrees (as opposed to 0-360). Shortest turn is then the normalized difference between the new and current heading. Direction to turn is left for a negative difference and right otherwise.

Example:
Current heading: 270   (normalized to -90)
New heading: 100   (normalized to 100)

Turn = 100 - (-90) = 190 (normalized to -170)

Shortest turn to reach 100 from 270 is then to turn 170 degrees left.

To convert from 0-360 to +/-180 can be done as follows:

groan...
OK, just stopped banging my head on the bench!

Thank you!

I am so glad for his forum!

I'll try that after my walk.

#### robtillaart

#6
##### Feb 28, 2012, 09:01 pm

Note a turn left and a turn right together allways sum up to 360 degrees ( in flatland

That insight makes the code simple.

Code: [Select]
`// assume new and heading are both 0..359 normalized (e.g. compass readings)if (heading < new) heading += 360;  // denormalize ...int left = heading - new;   // calculate left turn, will allways be 0..359  // take the smallest turnif (left < 180) {  // Turn left : left degrees}else{  // Turn right : 360-left degrees}`
some samples

270 & 100
left = 270 - 100 = 170 => smaller than 180 so turn left 170

5 & 355
5< 355 => 5 -> 365
left = 365 - 355 = 10 => smaller than 180 so turn left 10

5 & 10
5 < 10 => 365
left = 365 - 10 = 355 => larger than 180 so turn right (360-355)

270 & 10
left = 270 - 10 = 260 => larger than 180 so turn right (360-100)
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

#### cyberteque

#7
##### Feb 28, 2012, 11:44 pm
Quote
Note a turn left and a turn right together allways sum up to 360 degrees ( in flatland smiley-wink

NO wonder I had problem, I live up here in dem hills!

It works now! I got heading hold of a sort!

Doing the rest of the chassis build now, finally got my second Pololu Motor controller!

#### robtillaart

#8
##### Feb 29, 2012, 09:52 pm

Quote
Insert Quote
Quote
Note a turn left and a turn right together allways sum up to 360 degrees ( in flatland smiley-wink

NO wonder I had problem, I live up here in dem hills!

In fact on the top of a hill the sum is less than 360 and down in a valley the sum is more than 360. It resembles the curved space equations of Einstein.

A thought experiment can make this clear:

Imagine you are on the top of a sphere (North pole) and you go 100 miles south* (call this place A). Turn 90 degrees and walk 2* PI * 100 miles East. You make a circle following a latitude line. In a flat land you would be on exact the same place A again. But because you are on a sphere this circle is a fraction shorter than its diameter (100 miles)  suggests, so after 200 PI miles you will have passed place A. How many miles is left as an exercise

* if you are on the north pole the only possible heading is south
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

#### cyberteque

#9
##### Feb 29, 2012, 11:57 pm
yes!

and in the northern hemisphere going south is going up!

we're not "down under", we are on top!

Go Up

Please enter a valid email to subscribe

### Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy