/* * 作成日: 2010/02/25 */ package jp.ac.fit.asura.nao.vision.perception; import static jp.ac.fit.asura.nao.vision.GCD.cRED; import static jp.ac.fit.asura.nao.vision.GCD.cBLUE; import static jp.ac.fit.asura.nao.vision.VisualObjects.RedNao; import static jp.ac.fit.asura.nao.vision.VisualObjects.BlueNao; import java.awt.Rectangle; import java.util.List; import jp.ac.fit.asura.nao.physical.Field; import jp.ac.fit.asura.nao.vision.VisualParam.Int; import jp.ac.fit.asura.nao.vision.perception.BlobVision.Blob; import org.apache.log4j.Logger; /** * @author kilo * */ public class RobotVision extends AbstractVision { private Logger log = Logger.getLogger(RobotVision.class); public void findRedNao() { VisualObject robot = getContext().get(RedNao); findRobot((RobotVisualObject) robot, cRED); } public void findBlueNao() { VisualObject robot = getContext().get(BlueNao); findRobot((RobotVisualObject) robot, cBLUE); } private void findRobot(RobotVisualObject vo, byte color) { int threshold = 50; List<Blob> blobs = getContext().blobVision.findBlobs(color, 10, threshold); List<Blob> set = vo.getBlobs(); for (Blob blob : blobs) { set.add(blob); } if (!blobs.isEmpty()) { getContext().generalVision.processObject(vo); getContext().generalVision.calcBoundary(vo, color); ditectRobot(vo); calculateDistance(vo); checkRobotAngle(vo); } } private void ditectRobot(RobotVisualObject vo) { if (vo.getBlobs().size() < 2) { vo.confidence = 0; } return; } private void calculateDistance(RobotVisualObject vo) { if (vo.confidence == 0) { return; } int dist = -1; Rectangle area = vo.area; dist = (int) (53890 / (area.height + 3.01436f) - 96.5422f); if (dist * dist > Field.MaxY * Field.MaxX * 4) { log.debug(vo.getType() + " dist too far. dist:" + dist); vo.confidence = 0; return; } if (dist <= 0) { log.debug(vo.getType() + " invalid distance dist:" + dist); vo.confidence = 0; return; } vo.distance = dist; vo.distanceUsable = true; return; } private void checkRobotAngle(RobotVisualObject robot) { if (robot.robotAngle.y > 0.15f) { log.debug(robot.getType() + " sanity too high angle."); robot.confidence = 0; } else if (robot.robotAngle.y < -0.5f) { log.debug(robot.getType() + " sanity too low angle."); robot.confidence = 0; } } }