/* FollowLineDemo.java (c) 2007 Nils Springob <nils@nicai-systems.de> */ import nanovm.ctbot.drivers.*; import nanovm.util.Formatter; import nanovm.lang.Math; class FollowLineDemo { static final float M_PER_TICK = 0.00274f; static final float M_WHEEL_DIST = 0.10000f; public static void main(String[] args) { Leds.set(Leds.WHITE); Display.clear(); Display.gotoXY(0, 0); Display.print("Follow Line"); int lastL=0; int lastR=0; int count=0; // initial position and orientation float head = 0.0f; float x = 0.0f; float y = 0.0f; float s = 0.0f; while(true) { // update position int dsl = WheelEncoder.getLeftInc(); int dsr = WheelEncoder.getRightInc(); float dh = (dsl-dsr)*(M_PER_TICK/M_WHEEL_DIST); head += dh; if (head>Math.PI) head-=2.0f*Math.PI; if (head<-Math.PI) head+=2.0f*Math.PI; float ds = (dsl+dsr) * (0.5f * M_PER_TICK); s += Math.abs(ds); x += ds * nanovm.lang.Math.cos(head); y += ds * Math.sin(head); LineDetector.setEnabled(true); Clock.delayMicroseconds(100); LineDetector.updateLeft(); LineDetector.updateRight(); int dl = LineDetector.getLeft(); int dr = LineDetector.getRight(); LineDetector.setEnabled(false); int delta = dl-dr; int sum = dl+dr; int min = (dl<dr)?dl:dr; if (sum>180) { min/=40; delta/=40; if (min<0) min=0; int l = (min - delta); int r = (min + delta); Motor.setLeftSpeed(l); Motor.setRightSpeed(r); lastL=l; lastR=r; count=0; Display.gotoXY(15, 0); Display.print(" "); Leds.set(Leds.GREEN | ((l<0)?Leds.BLUE_LEFT:0) | ((r<0)?Leds.BLUE_RIGHT:0)); } else { if (count++==0) { if (lastL>lastR) { Motor.setLeftSpeed(+10-4); Motor.setRightSpeed(-10-4); } else { Motor.setLeftSpeed(-10-4); Motor.setRightSpeed(+10-4); } Display.gotoXY(15, 0); Leds.set(Leds.YELLOW); Display.print("ESC "); } if (count>50) { Motor.setLeft(0); Motor.setRight(0); Display.gotoXY(15, 0); Leds.set(Leds.RED); Display.print("TRAP"); } } Display.gotoXY(0, 1); Display.print(Formatter.format(dl, "l:%4d,")); Display.print(Formatter.format(dr, "%4d ")); Display.gotoXY(0, 2); Display.print(Formatter.format(lastL, "s:%4d,")); Display.print(Formatter.format(lastR, "%4d ")); Display.gotoXY(0, 3); Display.print(Formatter.format(x, "pos=(%+6.3f,")); Display.print(Formatter.format(y, "%+6.3f) ")); Display.gotoXY(12, 2); Display.print(Formatter.format(Math.toDegrees(head), "o=%+4.0f ")); Display.gotoXY(12, 1); Display.print(Formatter.format(s, "d=%6.2f ")); Clock.delayMilliseconds(20); } } }