Difference between revisions of "Oscillator Movement"

From Robowiki
Jump to navigation Jump to search
(Added See Also)
m (→‎See Also: - added description to link, {{Movement_Navbox}})
Line 33: Line 33:
  
 
== See Also ==
 
== See Also ==
* [[Oscillator Movement/Period]]
+
* [[Oscillator Movement/Period]]: Observations about the period of oscillation and [[PatternMatching]]
  
 
[[Category:Movement|Oscillator Movement]]
 
[[Category:Movement|Oscillator Movement]]
 +
{{Movement_Navbox}}

Revision as of 05:46, 21 September 2008

Oscillators usually play perpendicular to enemy bot, and avoid being hit by changing direction frequently. Oscillating movement is very easy to implement, needs only a few lines of code, and can be combined with avoiding and other tricks.

Some disadvantages of oscillating movement are that you can get easily hit by an advanced targeting system, and that you have little control on your absolute position in the battlefield (you define the position relative to the enemy).

Direct

Here it goes some code similar to the one MicroAspid 1.2 was using (feel free to use it on your bots).

//** it is from onScannedRobot
if (getDistanceRemaining() == 0) { FORWARD = -FORWARD; setAhead(185 * FORWARD); }
setTurnRightRadians(e.getBearingRadians() + Math.PI/2 - 0.5236 * FORWARD * (e.getDistance() > 200 ? 1 : -1));

As you see, you need only two lines to control your bot!!! Some improvements you can do here are to replace the static 185 distance by a random distance, and to ajdust the turn angles and preferred distance. Note that the bot tries to close to the enemy when distance is greater than 200, and tries to go away when it is closer than 200, by changing the angle a little bit.

Trigonometric

Another way to create an oscillator is to use sin/cos functions (I think it was NanoDuelist the first to use it). NanoLauLectrik also uses it.

setAhead(100 * Math.sin(getTime() / a))

The parameter a will define the frecuency of the oscillation.

You can also create more complex oscillations combining additional sin() and cos() functions. For example, you could experiment with something like this:

setAhead(100 * (Math.sin(getTime() / a) + Math.cos(getTime() / b)));

An alternative approach is the one used by NanoLauLectrik 1.0 (with similar results):

setAhead(200 * Math.sin(getTime() / a) * Math.cos(getTime() / b));

The parameters a and b will define two different frequencies that will combine to create a more complex oscillating movement. There are some interesting issues related to choosing a and b that are explained at Oscillator Movement/Period.

See Also