【发布时间】:2015-12-10 04:50:32
【问题描述】:
我是学校 5108 队 High School FIRST Robotics 团队的一员。我一直在研究一个自主程序,该程序可以适应大多数机器人并且非常易于更改。基本上,用户只需输入机器人的起点,基于覆盖在比赛场地上的坐标平面。
但是,当我尝试运行它时,我仍然遇到此错误。我已经多次查看代码并且没有错误或警告,我还使用了 android studio 提供的代码检查并更改了它推荐的所有内容,但没有运气。如果对程序有任何问题,请直接问,我是新手,所以有些可能不如它应该的那么好。
package com.qualcomm.ftcrobotcontroller.opmodes;
import com.qualcomm.robotcore.eventloop.opmode.OpMode;
import com.qualcomm.hardware.HiTechnicNxtCompassSensor;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.DcMotorController;
import java.util.ArrayList;
/**
* Created by Tyler Eads on 12/7/15.
*/
@SuppressWarnings("deprecation")
public class SmartAutonomous extends OpMode {
private double distance;
private double angle;
private double currentx;
private double currenty;
private double targetx;
private double targety;
private HiTechnicNxtCompassSensor compassSensor;
private final double compassvalue = compassSensor.getDirection();
private final int countsperrotation = 1440;
// INSERT ROBOT INFORMATION HERE...
private final double wheeldiameter = 3.0; //Insert Wheel Diameter Here
private final double circumference = wheeldiameter * Math.PI;
private final double gearratio = 1; //write as fraction
//END ROBOT INFORMATION
private void distance(double currentx, double currenty, double targetx, double targety) {
distance = Math.sqrt(((currentx - targetx) * (currentx - targetx)) + ((currenty - targety) * (currenty - targety)));
}
private void angle(double currentx, double currenty, double targetx, double targety) {
angle = Math.toDegrees(Math.atan((targety-currenty)/(targetx-currentx)));
}
private final double wheelrotations = distance / circumference;
private final double motorrotations = wheelrotations * gearratio;
private final double encodercounts = motorrotations * countsperrotation;
public enum Facing {North, NorthEast, East, SouthEast, South, SouthWest, West, NorthWest}
private Facing facing;
public enum RelativePosition {North, NorthEast, East, SouthEast, South, SouthWest, West, NorthWest}
private RelativePosition relativeposition;
private void facing() {
if (260 <= compassvalue && compassvalue <= 264) {
facing = Facing.North;
} else if (264 < compassvalue && compassvalue < 348) {
facing = Facing.NorthEast;
} else if (348 <= compassvalue && compassvalue <= 352) {
facing = Facing.East;
} else if (352 < compassvalue && compassvalue < 88) {
facing = Facing.SouthEast;
} else if (88 <= compassvalue && compassvalue <= 92) {
facing = Facing.South;
} else if (92 < compassvalue && compassvalue < 178) {
facing = Facing.SouthWest;
} else if (178 <= compassvalue && compassvalue <= 182) {
facing = Facing.West;
} else if (182 < compassvalue && compassvalue < 260) {
facing = Facing.NorthWest;
}
}
private void pointrelative() {
switch (facing) {
case North:
if (currenty < targety && currentx == targetx) {
relativeposition = RelativePosition.North;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.NorthEast;
} else if (currenty == targety && currentx < targetx) {
relativeposition = RelativePosition.East;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.SouthEast;
} else if (currenty > targety && currentx == targetx) {
relativeposition = RelativePosition.South;
} else if (currenty > targety && currentx > targetx) {
relativeposition = RelativePosition.SouthWest;
} else if (currenty == targety && currentx > targetx) {
relativeposition = RelativePosition.West;
} else if (currenty < targety && currentx > targetx) {
relativeposition = RelativePosition.NorthWest;
}
break;
case NorthEast:
if (currenty < targety && currentx == targetx) {
relativeposition = RelativePosition.NorthWest;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.North;
} else if (currenty == targety && currentx < targetx) {
relativeposition = RelativePosition.NorthEast;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.East;
} else if (currenty > targety && currentx == targetx) {
relativeposition = RelativePosition.SouthEast;
} else if (currenty > targety && currentx > targetx) {
relativeposition = RelativePosition.South;
} else if (currenty == targety && currentx > targetx) {
relativeposition = RelativePosition.SouthWest;
} else if (currenty < targety && currentx > targetx) {
relativeposition = RelativePosition.West;
}
break;
case East:
if (currenty < targety && currentx == targetx) {
relativeposition = RelativePosition.West;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.NorthWest;
} else if (currenty == targety && currentx < targetx) {
relativeposition = RelativePosition.North;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.NorthEast;
} else if (currenty > targety && currentx == targetx) {
relativeposition = RelativePosition.East;
} else if (currenty > targety && currentx > targetx) {
relativeposition = RelativePosition.SouthEast;
} else if (currenty == targety && currentx > targetx) {
relativeposition = RelativePosition.South;
} else if (currenty < targety && currentx > targetx) {
relativeposition = RelativePosition.SouthWest;
}
break;
case SouthEast:
if (currenty < targety && currentx == targetx) {
relativeposition = RelativePosition.SouthWest;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.West;
} else if (currenty == targety && currentx < targetx) {
relativeposition = RelativePosition.NorthWest;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.North;
} else if (currenty > targety && currentx == targetx) {
relativeposition = RelativePosition.NorthEast;
} else if (currenty > targety && currentx > targetx) {
relativeposition = RelativePosition.East;
} else if (currenty == targety && currentx > targetx) {
relativeposition = RelativePosition.SouthEast;
} else if (currenty < targety && currentx > targetx) {
relativeposition = RelativePosition.South;
}
break;
case South:
if (currenty < targety && currentx == targetx) {
relativeposition = RelativePosition.South;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.SouthWest;
} else if (currenty == targety && currentx < targetx) {
relativeposition = RelativePosition.West;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.NorthWest;
} else if (currenty > targety && currentx == targetx) {
relativeposition = RelativePosition.North;
} else if (currenty > targety && currentx > targetx) {
relativeposition = RelativePosition.NorthEast;
} else if (currenty == targety && currentx > targetx) {
relativeposition = RelativePosition.East;
} else if (currenty < targety && currentx > targetx) {
relativeposition = RelativePosition.SouthEast;
}
break;
case SouthWest:
if (currenty < targety && currentx == targetx) {
relativeposition = RelativePosition.SouthEast;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.South;
} else if (currenty == targety && currentx < targetx) {
relativeposition = RelativePosition.SouthWest;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.West;
} else if (currenty > targety && currentx == targetx) {
relativeposition = RelativePosition.NorthWest;
} else if (currenty > targety && currentx > targetx) {
relativeposition = RelativePosition.North;
} else if (currenty == targety && currentx > targetx) {
relativeposition = RelativePosition.NorthEast;
} else if (currenty < targety && currentx > targetx) {
relativeposition = RelativePosition.East;
}
break;
case West:
if (currenty < targety && currentx == targetx) {
relativeposition = RelativePosition.East;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.SouthEast;
} else if (currenty == targety && currentx < targetx) {
relativeposition = RelativePosition.South;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.SouthWest;
} else if (currenty > targety && currentx == targetx) {
relativeposition = RelativePosition.West;
} else if (currenty > targety && currentx > targetx) {
relativeposition = RelativePosition.NorthWest;
} else if (currenty == targety && currentx > targetx) {
relativeposition = RelativePosition.North;
} else if (currenty < targety && currentx > targetx) {
relativeposition = RelativePosition.NorthEast
;
}
break;
case NorthWest:
if (currenty < targety && currentx == targetx) {
relativeposition = RelativePosition.NorthEast;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.East;
} else if (currenty == targety && currentx < targetx) {
relativeposition = RelativePosition.SouthEast;
} else if (currenty < targety && currentx < targetx) {
relativeposition = RelativePosition.South;
} else if (currenty > targety && currentx == targetx) {
relativeposition = RelativePosition.SouthWest;
} else if (currenty > targety && currentx > targetx) {
relativeposition = RelativePosition.West;
} else if (currenty == targety && currentx > targetx) {
relativeposition = RelativePosition.NorthWest;
} else if (currenty < targety && currentx > targetx) {
relativeposition = RelativePosition.North;
}
break;
}
}
private void action() {
DcMotor rightdrive = hardwareMap.dcMotor.get("right_drive");
DcMotor leftdrive = hardwareMap.dcMotor.get("left_drive");
rightdrive.setDirection(DcMotor.Direction.REVERSE);
leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS);
rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS);
compassSensor = (HiTechnicNxtCompassSensor) hardwareMap.compassSensor.get("compass");
double fullpower = 1.0;
switch(relativeposition) {
case North:
rightdrive.setTargetPosition((int) encodercounts);
leftdrive.setTargetPosition((int) encodercounts);
rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
rightdrive.setPower(fullpower);
leftdrive.setPower(fullpower);
break;
case NorthEast:
if (compassvalue > compassvalue - (90-angle)) {
rightdrive.setPower(-fullpower);
leftdrive.setPower(fullpower);
}
else {
rightdrive.setTargetPosition((int) encodercounts);
leftdrive.setTargetPosition((int) encodercounts);
rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
rightdrive.setPower(fullpower);
leftdrive.setPower(fullpower);
}
break;
case East:
if (compassvalue > compassvalue - 90) {
rightdrive.setPower(-fullpower);
leftdrive.setPower(fullpower);
}
else {
rightdrive.setTargetPosition((int) encodercounts);
leftdrive.setTargetPosition((int) encodercounts);
rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
rightdrive.setPower(fullpower);
leftdrive.setPower(fullpower);
}
break;
case SouthEast:
if (compassvalue > compassvalue - (90+angle)) {
rightdrive.setPower(-fullpower);
leftdrive.setPower(fullpower);
}
else {
rightdrive.setTargetPosition((int) encodercounts);
leftdrive.setTargetPosition((int) encodercounts);
rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
rightdrive.setPower(fullpower);
leftdrive.setPower(fullpower);
}
break;
case South:
if (compassvalue > compassvalue - 180) {
rightdrive.setPower(-fullpower);
leftdrive.setPower(fullpower);
}
else {
rightdrive.setTargetPosition((int) encodercounts);
leftdrive.setTargetPosition((int) encodercounts);
rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
rightdrive.setPower(fullpower);
leftdrive.setPower(fullpower);
}
break;
case SouthWest:
if (compassvalue < compassvalue + (90+angle) ) {
rightdrive.setPower(fullpower);
leftdrive.setPower(-fullpower);
}
else {
rightdrive.setTargetPosition((int) encodercounts);
leftdrive.setTargetPosition((int) encodercounts);
rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
rightdrive.setPower(fullpower);
leftdrive.setPower(fullpower);
}
break;
case West:
if (compassvalue < compassvalue + 90) {
rightdrive.setPower(fullpower);
leftdrive.setPower(-fullpower);
}
else {
rightdrive.setTargetPosition((int) encodercounts);
leftdrive.setTargetPosition((int) encodercounts);
rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
rightdrive.setPower(fullpower);
leftdrive.setPower(fullpower);
}
break;
case NorthWest:
if (compassvalue < compassvalue + (90-angle)) {
rightdrive.setPower(fullpower);
leftdrive.setPower(-fullpower);
}
else {
rightdrive.setTargetPosition((int) encodercounts);
leftdrive.setTargetPosition((int) encodercounts);
rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION);
rightdrive.setPower(fullpower);
leftdrive.setPower(fullpower);
}
break;
}
}
private void smartmove() {
distance(currentx, currenty, targetx, targety);
angle(currentx, currenty, targetx, targety);
facing();
pointrelative();
action();
currentx = targetx; //Sets target point to new current position
currenty = targety;
}
private final ArrayList<Integer> Step = new ArrayList<>();
@Override
public void init() {
}
@Override
public void loop() {
int size = Step.size();
for (int i=0; i<size; i++) {
int element = Step.get(i);
switch (element) {
case 1:
currentx = 134;
currenty = 60;
targetx = 108;
targety = 60;
smartmove();
break;
case 2:
targetx = 59.5;
targety = 107.5;
smartmove();
break;
}
}
}
}
【问题讨论】:
标签: java android android-studio nullpointerexception