Difference between revisions of "Radar"

From Robowiki
Jump to navigation Jump to search
(cleaning up some)
Line 3: Line 3:
 
Many [[:Category:Bot Authors|bot authors]] place their radar adjustment code at the end of the <code>onScannedRobot()</code> method; this by itself is not a mistake and generally has little effect. However in robots that do a lot of processing, it is best to place it at the beginning of the <code>onScannedRobot()</code> method or in the main loop (if there is one), as to allow the radar to reset if the robot skips its turn in a later method.
 
Many [[:Category:Bot Authors|bot authors]] place their radar adjustment code at the end of the <code>onScannedRobot()</code> method; this by itself is not a mistake and generally has little effect. However in robots that do a lot of processing, it is best to place it at the beginning of the <code>onScannedRobot()</code> method or in the main loop (if there is one), as to allow the radar to reset if the robot skips its turn in a later method.
  
== 1-vs-1 Radars ==
 
'''NOTE:''' for most of these radar locks, you will need to add one of the following to your <code>run()</code> method:
 
  
<pre>
+
== Technical Information ==
setAdjustRadarForRobotTurn(true);
+
Working on this
</pre>
 
  
<pre>
+
== 1-vs-1 Radars ==
setAdjustGunForRobotTurn(true);
+
1-vs-1 radars are the smallest of the bunch and many can get scan in every turn, producing what is known as a Perfect Lock.
setAdjustRadarForGunTurn(true);
 
</pre>
 
  
 
=== Spinning radar ===
 
=== Spinning radar ===
Line 116: Line 111:
  
 
== Melee Radars ==
 
== Melee Radars ==
Melee radars are more complex and take up considerable more room inside a robot.
+
Melee radars are more complex and take up considerable more room inside a robot. There are few known ways to get a Perfect Lock in a melee radar.
  
 
=== Spinning radar ===
 
=== Spinning radar ===
Line 132: Line 127:
  
 
==== Corner Arc ====
 
==== Corner Arc ====
A variation on the spinning radar, if the robot is in a corner it scans back and forth across the 90 degree arc away from the corner, as not to waste time scanning where there cannot be any robots.
+
A variation on the spinning radar, if the robot is in a corner it scans back and forth across the 90 degree arc away from the corner, as not to waste time scanning where there cannot be any robots. This is the closest to being a Perfect Melee Lock.
  
 
=== Oldest Scanned ===
 
=== Oldest Scanned ===
 
This type of melee radar spins towards the robot it hasn't seen in the longest amount of time.
 
This type of melee radar spins towards the robot it hasn't seen in the longest amount of time.
 +
 +
 +
== Notes ==
 +
For most of these radar locks, you will need to add one of the following to your <code>run()</code> method:
 +
 +
<pre>
 +
setAdjustRadarForRobotTurn(true);
 +
</pre>
 +
 +
<pre>
 +
setAdjustGunForRobotTurn(true);
 +
setAdjustRadarForGunTurn(true);
 +
</pre>

Revision as of 11:18, 12 November 2007

The radar is one of the most vital components of your robot. Without it targeting is effectively impossible, and movement is purely random. Just as with movement and targeting, there are many simple and complex algorithms for radar control. In most robots the radar takes up the smallest portion of code.

Many bot authors place their radar adjustment code at the end of the onScannedRobot() method; this by itself is not a mistake and generally has little effect. However in robots that do a lot of processing, it is best to place it at the beginning of the onScannedRobot() method or in the main loop (if there is one), as to allow the radar to reset if the robot skips its turn in a later method.


Technical Information

Working on this

1-vs-1 Radars

1-vs-1 radars are the smallest of the bunch and many can get scan in every turn, producing what is known as a Perfect Lock.

Spinning radar

A simple spin of the radar, this is very ineffective in one on one, but still used in NanoBots.

Here is an example of this type of radar:

public void run() {
    // ...

    do {
        setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
    } while (true);
}

The infinity lock

The infinity lock is the simplest radar lock, and is used frequently in NanoBots. It has the disadvantage of "slipping" and losing its lock frequently.

Here is an example of this type of radar:

public void run() {
    // ...
    setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
}

public void onScannedRobot(ScannedRobotEvent e) {
    // ...
    setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
}

Perfect radar locks

There are several "perfect" radar locks that will not slip once they have a lock.

Narrow lock

This type of lock is thin and follows the robot around the battlefield.

Here is an example of this kind of radar:

import robocode.util.Utils;

public void run() {
    // ...

    turnRadarRight(Double.POSITIVE_INFINITY);
    do {
        scan();
    } while (true);
}

public void onScannedRobot(ScannedRobotEvent e) {
    double absoluteBearing = getHeadingRadians() + e.getBearingRadians();

    double radarTurn = absoluteBearing - getRadarHeadingRadians();
    setTurnRadarRightRadians(Utils.normalRelativeAngle(radarTurn));

    // ...
}

Wide lock

The wide-type radar locks are used to avoid the rare slipping of the thin lock. They scan a wider portion of the battlefield but still will not slip. This type of lock is generally the largest of the 1-vs-1 radars.

Here is an example of this type of radar:

import robocode.util.Utils;

private int ticksSinceLastScan = 0;

public void run() {
    // ...

    do {
        if (ticksSinceLastScan++ > 2) {
            setTurnRadarRight(Double.POSITIVE_INFINITY);
        }

        execute();
    } while (true);
}

public void onScannedRobot(ScannedRobotEvent e) {
    double absoluteBearing = getHeadingRadians() + e.getBearingRadians();
    double radarTurn = Utils.normalRelativeAngle(absoluteBearing - getRadarHeadingRadians());

    // Width of the bot, plus twice the arc it can move in a tick
    double arcToScan = atan(36.0 / e.getDistance());

    // Limit this so that we don't overshoot
    if (arcToScan > PI / 4.0) arcToScan = PI / 4.0;

    // We want to sent the radar even further in the direction it's moving
    radarTurn += (radarTurn < 0) ? -arcToScan : arcToScan;
    setTurnRadarRightRadians(radar);

    ticksSinceLastScan = 0;

    // ...
}

Melee Radars

Melee radars are more complex and take up considerable more room inside a robot. There are few known ways to get a Perfect Lock in a melee radar.

Spinning radar

Just as with one on one, there is the generic spinning radar. This is the most used melee radar as it is by far the easiest to implement.

public void run() {
    // ...

    do {
        setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
    } while (true);
}

Corner Arc

A variation on the spinning radar, if the robot is in a corner it scans back and forth across the 90 degree arc away from the corner, as not to waste time scanning where there cannot be any robots. This is the closest to being a Perfect Melee Lock.

Oldest Scanned

This type of melee radar spins towards the robot it hasn't seen in the longest amount of time.


Notes

For most of these radar locks, you will need to add one of the following to your run() method:

setAdjustRadarForRobotTurn(true);
setAdjustGunForRobotTurn(true);
setAdjustRadarForGunTurn(true);