3
3
# the WPILib BSD license file in the root directory of this project.
4
4
from __future__ import annotations
5
5
6
- from typing import Callable , Union
6
+ from typing import Callable , Union , Optional
7
7
from wpimath .controller import (
8
8
PIDController ,
9
9
RamseteController ,
@@ -48,10 +48,10 @@ def __init__(
48
48
kinematics : DifferentialDriveKinematics ,
49
49
outputVolts : Callable [[float , float ], None ],
50
50
* requirements : Subsystem ,
51
- feedforward : SimpleMotorFeedforwardMeters | None = None ,
52
- leftController : PIDController | None = None ,
53
- rightController : PIDController | None = None ,
54
- wheelSpeeds : Callable [[], DifferentialDriveWheelSpeeds ] | None = None ,
51
+ feedforward : Optional [ SimpleMotorFeedforwardMeters ] ,
52
+ leftController : Optional [ PIDController ] ,
53
+ rightController : Optional [ PIDController ] ,
54
+ wheelSpeeds : Optional [ Callable [[], DifferentialDriveWheelSpeeds ]] ,
55
55
):
56
56
"""Constructs a new RamseteCommand that, when executed, will follow the provided trajectory. PID
57
57
control and feedforward are handled internally, and outputs are scaled -12 to 12 representing
@@ -82,20 +82,16 @@ def __init__(
82
82
"""
83
83
super ().__init__ ()
84
84
85
- self .timer = Timer ()
85
+ self ._timer = Timer ()
86
86
87
87
# Store all the requirements that are required
88
- self .trajectory : Trajectory = trajectory
88
+ self .trajectory = trajectory
89
89
self .pose = pose
90
- self .follower : RamseteController = controller
90
+ self .follower = controller
91
91
self .kinematics = kinematics
92
- self .output : Callable [[float , float ], None ] = outputVolts
93
- self .leftController = None
94
- self .rightController = None
95
- self .feedforward = None
96
- self .wheelspeeds = None
92
+ self .output = outputVolts
97
93
self .usePID = False
98
- # Optional requirements checks. If any one of the optionl parameters are not None, then all the optional
94
+ # Optional requirements checks. If any one of the optional parameters are not None, then all the optional
99
95
# requirements become required.
100
96
if feedforward or leftController or rightController or wheelSpeeds is not None :
101
97
if feedforward or leftController or rightController or wheelSpeeds is None :
@@ -109,78 +105,77 @@ def __init__(
109
105
self .wheelspeeds : Callable [[], DifferentialDriveWheelSpeeds ] = wheelSpeeds
110
106
self .feedforward : SimpleMotorFeedforwardMeters = feedforward
111
107
self .usePID = True
112
- self .prevSpeeds = DifferentialDriveWheelSpeeds ()
113
- self .prevTime = - 1.0
108
+ self ._prevSpeeds = DifferentialDriveWheelSpeeds ()
109
+ self ._prevTime = - 1.0
114
110
115
111
self .addRequirements (* requirements )
116
112
117
113
def initialize (self ):
118
- self .prevTime = - 1
114
+ self ._prevTime = - 1
119
115
initial_state = self .trajectory .sample (0 )
120
- initial_speeds = self .kinematics .toWheelSpeeds (
116
+ self . _prevSpeeds = self .kinematics .toWheelSpeeds (
121
117
ChassisSpeeds (
122
118
initial_state .velocity ,
123
119
0 ,
124
120
initial_state .curvature * initial_state .velocity ,
125
121
)
126
122
)
127
- self .prevSpeeds = initial_speeds
128
- self .timer .restart ()
123
+ self ._timer .restart ()
129
124
if self .usePID :
130
125
self .leftController .reset ()
131
126
self .rightController .reset ()
132
127
133
128
def execute (self ):
134
- cur_time = self .timer .get ()
135
- dt = cur_time - self .prevTime
129
+ curTime = self ._timer .get ()
130
+ dt = curTime - self ._prevTime
136
131
137
- if self .prevTime < 0 :
132
+ if self ._prevTime < 0 :
138
133
self .output (0.0 , 0.0 )
139
- self .prevTime = cur_time
134
+ self ._prevTime = curTime
140
135
return
141
136
142
- target_wheel_speeds = self .kinematics .toWheelSpeeds (
143
- self .follower .calculate (self .pose (), self .trajectory .sample (cur_time ))
137
+ targetWheelSpeeds = self .kinematics .toWheelSpeeds (
138
+ self .follower .calculate (self .pose (), self .trajectory .sample (curTime ))
144
139
)
145
140
146
- left_speed_setpoint = target_wheel_speeds .left
147
- right_speed_setpoint = target_wheel_speeds .right
141
+ leftSpeedSetpoint = targetWheelSpeeds .left
142
+ rightSpeedSetpoint = targetWheelSpeeds .right
148
143
149
144
if self .usePID :
150
- left_feedforward = self .feedforward .calculate (
151
- left_speed_setpoint , (left_speed_setpoint - self .prevSpeeds .left ) / dt
145
+ leftFeedforward = self .feedforward .calculate (
146
+ leftSpeedSetpoint , (leftSpeedSetpoint - self ._prevSpeeds .left ) / dt
152
147
)
153
148
154
- right_feedforward = self .feedforward .calculate (
155
- right_speed_setpoint ,
156
- (right_speed_setpoint - self .prevSpeeds .right ) / dt ,
149
+ rightFeedforward = self .feedforward .calculate (
150
+ rightSpeedSetpoint ,
151
+ (rightSpeedSetpoint - self ._prevSpeeds .right ) / dt ,
157
152
)
158
153
159
- left_output = left_feedforward + self .leftController .calculate (
160
- self .wheelspeeds ().left , left_speed_setpoint
154
+ leftOutput = leftFeedforward + self .leftController .calculate (
155
+ self .wheelspeeds ().left , leftSpeedSetpoint
161
156
)
162
157
163
- right_output = right_feedforward + self .rightController .calculate (
164
- self .wheelspeeds ().right , right_speed_setpoint
158
+ rightOutput = rightFeedforward + self .rightController .calculate (
159
+ self .wheelspeeds ().right , rightSpeedSetpoint
165
160
)
166
161
else :
167
- left_output = left_speed_setpoint
168
- right_output = right_speed_setpoint
162
+ leftOutput = leftSpeedSetpoint
163
+ rightOutput = rightSpeedSetpoint
169
164
170
- self .output (left_output , right_output )
171
- self .prevSpeeds = target_wheel_speeds
172
- self .prevTime = cur_time
165
+ self .output (leftOutput , rightOutput )
166
+ self ._prevSpeeds = targetWheelSpeeds
167
+ self ._prevTime = curTime
173
168
174
- def end (self , interrupted ):
175
- self .timer .stop ()
169
+ def end (self , interrupted : bool ):
170
+ self ._timer .stop ()
176
171
177
172
if interrupted :
178
173
self .output (0.0 , 0.0 )
179
174
180
175
def isFinished (self ):
181
- return self .timer .hasElapsed (self .trajectory .totalTime ())
176
+ return self ._timer .hasElapsed (self .trajectory .totalTime ())
182
177
183
178
def initSendable (self , builder : SendableBuilder ):
184
179
super ().initSendable (builder )
185
- builder .addDoubleProperty ("leftVelocity" , lambda : self .prevSpeeds .left , None )
186
- builder .addDoubleProperty ("rightVelocity" , lambda : self .prevSpeeds .right , None )
180
+ builder .addDoubleProperty ("leftVelocity" , lambda : self ._prevSpeeds .left , lambda * float : None )
181
+ builder .addDoubleProperty ("rightVelocity" , lambda : self ._prevSpeeds .right , lambda * float : None )
0 commit comments