Skip to content

Commit c734a10

Browse files
committed
Velocity estimator fixes. Goal offset changes.
1 parent a201648 commit c734a10

File tree

9 files changed

+395
-16
lines changed

9 files changed

+395
-16
lines changed

TeamCode/src/main/kotlin/pioneer/Constants.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,11 @@ object Constants {
190190

191191
object Turret {
192192
const val TICKS_PER_REV = 384.5 * 3
193-
const val HEIGHT = 30.0
193+
const val HEIGHT = 30.48
194194
const val THETA = 0.93
195195
const val ANGLE_TOLERANCE_RADIANS = 0.075
196196
const val LAUNCH_TIME = 0.125
197+
const val OFFSET = -10.0
197198
}
198199

199200
object ServoPositions {

TeamCode/src/main/kotlin/pioneer/decode/GoalTag.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ enum class GoalTag(
4545
val height: Double
4646
get() = position[2].toDouble()
4747

48-
val shootingHeight = height + 20.0
48+
val shootingHeight = height + 50.0
4949

5050
// Tag pose plus half the goal depth (46.45 cm)
5151
val shootingPose: Pose
5252
get() =
5353
when (this) {
54-
BLUE -> this.pose + Pose(x = -(46.45 / 2) / sqrt(2.0), y = (46.45 / 2) / sqrt(2.0)) // -X +Y
55-
RED -> this.pose + Pose(x = (46.45 / 2) / sqrt(2.0), y = (46.45 / 2) / sqrt(2.0)) // +X +Y
54+
BLUE -> this.pose + Pose(x = -32.0, y = 30.0) // -X +Y
55+
RED -> this.pose + Pose(x = (46.45 / 2) / sqrt(2.0), y = (46.45 / 2) / sqrt(2.0)) // +X +Y //TODO: Update when back at HS
5656
}
5757
}
5858

TeamCode/src/main/kotlin/pioneer/hardware/Flywheel.kt

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,25 +55,40 @@ class Flywheel(
5555
}
5656

5757
// https://www.desmos.com/calculator/uofqeqqyn1
58+
//12/22: https://www.desmos.com/calculator/1kj8xzklqp
5859
fun estimateVelocity(
5960
target: Pose,
6061
pose: Pose,
62+
targetHeight: Double
6163
): Double {
62-
val shootPose = pose + Pose(pose.vx * Constants.Turret.LAUNCH_TIME, pose.vy * Constants.Turret.LAUNCH_TIME)
63-
val heightDiff = GoalTag.BLUE.shootingHeight - Constants.Turret.HEIGHT
64+
65+
val shootPose = pose +
66+
Pose(x = Constants.Turret.OFFSET * sin(-pose.theta), y = Constants.Turret.OFFSET * cos(-pose.theta)) +
67+
Pose(pose.vx * Constants.Turret.LAUNCH_TIME, pose.vy * Constants.Turret.LAUNCH_TIME)
68+
69+
// val heightDiff = GoalTag.BLUE.shootingHeight - Constants.Turret.HEIGHT
70+
val heightDiff = targetHeight - Constants.Turret.HEIGHT
71+
//TODO Double check AprilTag height
6472
val groundDistance = shootPose distanceTo target
73+
//Real world v0 of the ball
6574
val v0 =
6675
(groundDistance) / (
6776
cos(
6877
Constants.Turret.THETA,
6978
) * sqrt((2.0 * (heightDiff - tan(Constants.Turret.THETA) * (groundDistance))) / (-980))
7079
)
80+
//Regression to convert real world velocity to flywheel speed
81+
// val flywheelVelocity = 1.58901 * v0 + 17.2812 //From fall break testing
82+
val flywheelVelocity = 1.583 * v0 - 9.86811 //From 12/22 testing
83+
// val flywheelVelocity = 1.583 * v0 //Adjusting based on 12/22 testing
84+
85+
//Adjust for velocity of the bot when moving
86+
// val thetaToTarget = -(shootPose angleTo target)
87+
// val newTargetVelocityX = sin(thetaToTarget) * flywheelVelocity - pose.vx
88+
// val newTargetVelocityY = cos(thetaToTarget) * flywheelVelocity - pose.vy
89+
// val newTargetVelocity = sqrt(newTargetVelocityX.pow(2) + newTargetVelocityY.pow(2))
7190

72-
val flywheelVelocity = 1.58901 * v0 + 17.2812
73-
val thetaToTarget = -(shootPose angleTo target)
74-
val newTargetVelocityX = sin(thetaToTarget) * flywheelVelocity - pose.vx
75-
val newTargetVelocityY = cos(thetaToTarget) * flywheelVelocity - pose.vy
76-
val newTargetVelocity = sqrt(newTargetVelocityX.pow(2) + newTargetVelocityY.pow(2))
91+
val newTargetVelocity = flywheelVelocity
7792
return newTargetVelocity
7893
}
7994
}

TeamCode/src/main/kotlin/pioneer/hardware/Turret.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import pioneer.helpers.MathUtils
1010
import pioneer.helpers.Pose
1111
import kotlin.math.PI
1212
import kotlin.math.abs
13+
import kotlin.math.cos
14+
import kotlin.math.sin
1315

1416
class Turret(
1517
private val hardwareMap: HardwareMap,
@@ -93,7 +95,8 @@ class Turret(
9395
pose: Pose,
9496
target: Pose,
9597
) {
96-
val shootPose = pose + Pose(pose.vx * Constants.Turret.LAUNCH_TIME, pose.vy * Constants.Turret.LAUNCH_TIME)
98+
val shootPose = pose + Pose(x = Constants.Turret.OFFSET * sin(-pose.theta), y = Constants.Turret.OFFSET * cos(-pose.theta)) +
99+
Pose(pose.vx * Constants.Turret.LAUNCH_TIME, pose.vy * Constants.Turret.LAUNCH_TIME)
97100
// General Angle(From robot 0 to target):
98101
val targetTheta = (shootPose angleTo target)
99102
val turretTheta = (PI / 2 + targetTheta) - shootPose.theta
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package pioneer.opmodes.auto
2+
3+
import com.qualcomm.robotcore.eventloop.opmode.Autonomous
4+
import com.qualcomm.robotcore.eventloop.opmode.TeleOp
5+
import pioneer.Bot
6+
import pioneer.hardware.Flywheel
7+
import pioneer.hardware.Launcher
8+
import pioneer.hardware.MecanumBase
9+
import pioneer.helpers.Pose
10+
import pioneer.helpers.Toggle
11+
import pioneer.localization.localizers.Pinpoint
12+
import pioneer.opmodes.BaseOpMode
13+
import pioneer.pathing.paths.LinearPath
14+
15+
@TeleOp(name = "Flywheel Testing", group = "Testing")
16+
class FlywheelTesting : BaseOpMode() {
17+
18+
var incFlywheelSpeed = Toggle(false)
19+
var decFlywheelSpeed = Toggle(false)
20+
var flywheelSpeed = 0.0
21+
22+
var flywheelToggle = Toggle(false)
23+
24+
override fun onInit() {
25+
bot =
26+
Bot
27+
.Builder()
28+
.add(Flywheel(hardwareMap))
29+
.add(Launcher(hardwareMap))
30+
.build()
31+
}
32+
33+
override fun onLoop() {
34+
35+
incFlywheelSpeed.toggle(gamepad1.right_bumper)
36+
decFlywheelSpeed.toggle(gamepad1.left_bumper)
37+
flywheelToggle.toggle(gamepad1.dpad_left)
38+
39+
if (incFlywheelSpeed.justChanged){
40+
flywheelSpeed += 50.0
41+
}
42+
if (decFlywheelSpeed.justChanged){
43+
flywheelSpeed -= 50.0
44+
}
45+
46+
if (flywheelToggle.state){
47+
bot.flywheel?.velocity = flywheelSpeed
48+
} else {
49+
bot.flywheel?.velocity = 0.0
50+
}
51+
52+
if (gamepad1.square){
53+
bot.launcher?.triggerLaunch()
54+
}
55+
56+
telemetry.addData("Actual Flywheel Velocity", bot.flywheel?.velocity)
57+
telemetry.addData("Target Velocity", flywheelSpeed)
58+
}
59+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package pioneer.opmodes.other
2+
3+
import com.qualcomm.robotcore.eventloop.opmode.TeleOp
4+
import org.firstinspires.ftc.robotcore.external.navigation.CurrentUnit
5+
import pioneer.Bot
6+
import pioneer.BotType
7+
import pioneer.Constants
8+
import pioneer.hardware.Flywheel
9+
import pioneer.hardware.Launcher
10+
import pioneer.helpers.Toggle
11+
import pioneer.helpers.next
12+
import pioneer.opmodes.BaseOpMode
13+
import pioneer.opmodes.teleop.drivers.TeleopDriver1
14+
import pioneer.opmodes.teleop.drivers.TeleopDriver2
15+
import pioneer.opmodes.teleop.drivers.TeleopDriver2Testing
16+
17+
@TeleOp(name = "Shooter Testing", group = "Testing")
18+
class ShootingTesting : BaseOpMode() {
19+
private lateinit var driver1: TeleopDriver1
20+
private lateinit var driver2: TeleopDriver2Testing
21+
private val allianceToggle = Toggle(false)
22+
private var changedAllianceColor = false
23+
24+
override fun onInit() {
25+
bot = Bot.fromType(BotType.COMP_BOT, hardwareMap)
26+
27+
driver1 = TeleopDriver1(gamepad1, bot)
28+
driver2 = TeleopDriver2Testing(gamepad2, bot)
29+
}
30+
31+
override fun init_loop() {
32+
allianceToggle.toggle(gamepad1.touchpad)
33+
if (allianceToggle.justChanged) {
34+
changedAllianceColor = true
35+
bot.allianceColor = bot.allianceColor.next()
36+
}
37+
telemetry.addData("Alliance Color", bot.allianceColor)
38+
telemetry.update()
39+
}
40+
41+
override fun start() {
42+
if (!changedAllianceColor) bot.allianceColor = Constants.TransferData.allianceColor
43+
// bot.spindexer?.resetMotorPosition(Constants.TransferData.spindexerPositionTicks)
44+
// bot.turret?.resetMotorPosition(Constants.TransferData.turretPositionTicks)
45+
}
46+
47+
override fun onLoop() {
48+
// Update gamepad inputs
49+
driver1.update()
50+
driver2.update()
51+
52+
// Add telemetry data
53+
addTelemetryData()
54+
}
55+
56+
private fun addTelemetryData() {
57+
// telemetry.addData("Transfer Data", Constants.TransferData.turretPositionTicks)
58+
// telemetry.addData("Turret Offset Ticks", bot.turret?.offsetTicks)
59+
// telemetry.addData("Turret Angle", bot.turret?.currentAngle)
60+
telemetry.addData("Artifacts", bot.spindexer?.artifacts.contentDeepToString())
61+
telemetry.addData("Pose", bot.pinpoint!!.pose)
62+
telemetry.addData("Turret Mode", bot.turret?.mode)
63+
telemetry.addData("Shoot State", driver2.shootState)
64+
telemetry.addData("Estimating Flywheel Speed", driver2.isEstimateSpeed.state)
65+
telemetry.addData("Flywheel Target Speed", driver2.flywheelSpeed)
66+
telemetry.addData("Flywheel Speed", driver2.flywheelVelocityEnum)
67+
telemetry.addData("Flywheel TPS", bot.flywheel?.velocity)
68+
telemetry.addData("Turret Angle", driver2.turretAngle)
69+
telemetry.addData("Drive Power", driver1.drivePower)
70+
telemetry.addData("Field Centric", driver1.fieldCentric)
71+
telemetry.addData("Velocity", "vx: %.2f, vy: %.2f".format(bot.pinpoint?.pose?.vx, bot.pinpoint?.pose?.vy))
72+
telemetry.addData("Voltage", bot.batteryMonitor?.voltage)
73+
telemetry.addData("Flywheel Motor Current", bot.flywheel?.motor?.getCurrent(CurrentUnit.MILLIAMPS))
74+
telemetryPacket.addLine("Flywheel TPS" + (bot.flywheel?.velocity ?: 0.0))
75+
}
76+
77+
}

TeamCode/src/main/kotlin/pioneer/opmodes/teleop/Teleop.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ class Teleop : BaseOpMode() {
5959
telemetry.addData("Target Goal", driver2.targetGoal)
6060
telemetry.addData("Turret Mode", bot.turret?.mode)
6161
telemetry.addData("Shoot State", driver2.shootState)
62-
telemetry.addData("Estimating Flywheel Speed", driver2.isEstimateSpeed)
62+
telemetry.addData("Estimating Flywheel Speed", driver2.isEstimateSpeed.state)
63+
telemetry.addData("Flywheel Target Speed", driver2.flywheelSpeed)
6364
telemetry.addData("Flywheel Speed", driver2.flywheelVelocityEnum)
6465
telemetry.addData("Flywheel TPS", bot.flywheel?.velocity)
6566
telemetry.addData("Turret Angle", driver2.turretAngle)

TeamCode/src/main/kotlin/pioneer/opmodes/teleop/drivers/TeleopDriver2.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package pioneer.opmodes.teleop.drivers
22

33
import com.qualcomm.robotcore.hardware.Gamepad
4+
import org.firstinspires.ftc.robotcore.external.Const
45
import pioneer.Bot
6+
import pioneer.Constants
57
import pioneer.decode.Artifact
68
import pioneer.decode.GoalTag
79
import pioneer.decode.Points
@@ -13,7 +15,9 @@ import pioneer.helpers.Toggle
1315
import pioneer.helpers.next
1416
import kotlin.math.PI
1517
import kotlin.math.abs
18+
import kotlin.math.cos
1619
import kotlin.math.pow
20+
import kotlin.math.sin
1721

1822
class TeleopDriver2(
1923
private val gamepad: Gamepad,
@@ -72,7 +76,7 @@ class TeleopDriver2(
7276
// flywheelSpeed = flywheelSpeed.coerceIn(0.0, 1.0)
7377

7478
if (isEstimateSpeed.state) {
75-
flywheelSpeed = bot.flywheel!!.estimateVelocity(targetGoal.shootingPose, bot.pinpoint?.pose ?: Pose())
79+
flywheelSpeed = bot.flywheel!!.estimateVelocity(targetGoal.shootingPose, bot.pinpoint?.pose ?: Pose(), targetGoal.shootingHeight)
7680
} else {
7781
flywheelSpeed = flywheelVelocityEnum.velocity
7882
}
@@ -201,9 +205,12 @@ class TeleopDriver2(
201205

202206
private fun updateIndicatorLED() {
203207
bot.flywheel?.velocity?.let {
204-
if (it > flywheelVelocityEnum.velocity) {
208+
if (it >= flywheelSpeed-10 && it <=flywheelSpeed+20) {
205209
gamepad.setLedColor(0.0, 1.0, 0.0, -1)
206-
} else {
210+
} else if (it <flywheelSpeed-10){
211+
gamepad.setLedColor(255.0,165.0,0.0, -1)
212+
}
213+
else {
207214
gamepad.setLedColor(1.0, 0.0, 0.0, -1)
208215
}
209216
}

0 commit comments

Comments
 (0)