@@ -75,24 +75,31 @@ def __init__(self):
7575
7676 # Define default values for our ROS parameters below #
7777 self .declare_parameter ("digger_lift_manual_power_down" , 0.12 )
78+ self .declare_parameter ("auto_dig_final_lift_speed" , 0.08 )
7879 self .declare_parameter ("digger_lift_manual_power_up" , 0.5 )
7980 self .declare_parameter ("DIGGER_MOTOR" , 3 )
8081 self .declare_parameter ("DIGGER_ACTUATORS_OFFSET" , 12 )
8182 self .declare_parameter ("DIGGER_SAFETY_ZONE" , 120 ) # Measured in potentiometer units (0 to 1023)
83+ self .declare_parameter ("lift_digging_end_position" , 900 ) # Measured in potentiometer units (0 to 1023)
8284 # Assign the ROS Parameters to member variables below #
8385 self .digger_lift_manual_power_down = self .get_parameter ("digger_lift_manual_power_down" ).value
86+ self .auto_dig_final_lift_speed = self .get_parameter ("auto_dig_final_lift_speed" ).value
8487 self .digger_lift_manual_power_up = self .get_parameter ("digger_lift_manual_power_up" ).value
8588 self .DIGGER_MOTOR = self .get_parameter ("DIGGER_MOTOR" ).value
8689 self .DIGGER_ACTUATORS_OFFSET = self .get_parameter ("DIGGER_ACTUATORS_OFFSET" ).value
8790 self .DIGGER_SAFETY_ZONE = self .get_parameter ("DIGGER_SAFETY_ZONE" ).value
91+ self .lift_digging_end_position = self .get_parameter ("lift_digging_end_position" ).value
8892 # Print the ROS Parameters to the terminal below #
8993 self .get_logger ().info (
9094 "digger_lift_manual_power_down has been set to: " + str (self .digger_lift_manual_power_down )
9195 )
96+ self .get_logger ().info ("auto_dig_final_lift_speed has been set to: " + str (self .auto_dig_final_lift_speed ))
9297 self .get_logger ().info ("digger_lift_manual_power_up has been set to: " + str (self .digger_lift_manual_power_up ))
9398 self .get_logger ().info ("DIGGER_MOTOR has been set to: " + str (self .DIGGER_MOTOR ))
9499 self .get_logger ().info ("DIGGER_ACTUATORS_OFFSET has been set to: " + str (self .DIGGER_ACTUATORS_OFFSET ))
95100 self .get_logger ().info ("DIGGER_SAFETY_ZONE has been set to: " + str (self .DIGGER_SAFETY_ZONE ))
101+ self .get_logger ().info ("lift_digging_end_position has been set to: " + str (self .lift_digging_end_position ))
102+
96103 # Current state of the digger chain
97104 self .running = False
98105 # Current position of the lift motor in potentiometer units (0 to 1023)
@@ -209,10 +216,26 @@ def bottom_lift(self) -> None:
209216 """This method bottoms out the lift system by slowly lowering it until the duty cycle is 0."""
210217 self .get_logger ().info ("Bottoming out the lift system" )
211218 self .long_service_running = True
212- self .lift_set_power (- self .digger_lift_manual_power_down )
219+ current_power = self .digger_lift_manual_power_down
220+ self .lift_set_power (- current_power )
221+ # Store the initial position for Linear Interpolation
222+ initial_position = self .current_lift_position
213223 lastPowerTime = time .time ()
214224 # Wait 0.5 seconds after the current goes below the threshold before stopping the motor
215225 while time .time () - lastPowerTime < 0.5 :
226+ # Calculate interpolated power (only if positions are different to avoid division by zero)
227+ if initial_position != self .lift_digging_end_position and self .current_lift_position != initial_position :
228+ progress = (self .current_lift_position - initial_position ) / (
229+ self .lift_digging_end_position - initial_position
230+ )
231+ # Constrain progress between 0 and 1
232+ progress = max (0 , min (1 , progress ))
233+ self .get_logger ().info ("Progress is currently: " + str (progress ))
234+ current_power = self .digger_lift_manual_power_down - progress * (
235+ self .digger_lift_manual_power_down - self .auto_dig_final_lift_speed
236+ )
237+ self .get_logger ().info ("Power is currently: " + str (current_power ))
238+ self .lift_set_power (- current_power )
216239 if self .cancel_current_srv :
217240 self .cancel_current_srv = False
218241 break
0 commit comments