Difference between revisions of "Oscillator Movement"

From Robowiki
Jump to navigation Jump to search
(Adding Oscillator movement)
(No difference)

Revision as of 20:28, 24 November 2007

This article is a stub. You can help RoboWiki by expanding it.

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).

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.


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(Math.sin(100*getTime()/a))

The parameter a will define the frecuency of the oscillation.

You can also create more complex oscillations combining some sin/cos functions. For example, you could experiment with someting 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/b (just make sure they are different for some large factor) will define two different frequencies that will combine to create a more complex oscillatory movement.

There ase some interesting issues related to choosing A and B that I'w explain in Oscillators/Period