utils.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 import math
4 import numpy as np
5 
6 from geometry_msgs.msg import Pose, Point
7 
8 def project_position(start, end, current, mindist, maxdist, line_divergence, side_offset):
9 
10  def unit_vector(vector):
11  return vector / np.linalg.norm(vector + 1e-10) # A small constant to prevent division by zero
12 
13  def pose_to_np(p):
14  return np.array([p.position.x, p.position.y])
15 
16  def np_to_point(np_array):
17  return Point(np_array[0], np_array[1], 0)
18 
19  start_pos = pose_to_np(start)
20  end_pos = pose_to_np(end)
21  current_pos = pose_to_np(current)
22 
23  # Calculate the vector representing the line segment
24  line = end_pos - start_pos
25  unit_line = unit_vector(line)
26 
27  # Calculate the projection of the current point onto the line
28  current_to_start = current_pos - start_pos
29  projection_length = np.dot(current_to_start, unit_line)
30  projection = start_pos + unit_line * projection_length
31 
32  # Clamp the projection to the start point if necessary
33  if np.dot(projection - start_pos, start_pos - end_pos) > 0:
34  projection = start_pos
35 
36  # Calculate the distance and new position based on input parameters
37  deltadist = current_pos - projection
38  value = 0 if line_divergence == 0 else (line_divergence - np.sqrt(deltadist.dot(deltadist))) / line_divergence
39  distance = mindist + (maxdist - mindist) * clamp(value, 0.0, 1.0)
40  new_pos = projection + unit_vector(end_pos - start_pos) * distance
41 
42  # Clamp the new position to the end point if necessary
43  if np.dot(new_pos - end_pos, end_pos - start_pos) > 0:
44  new_pos = end_pos
45 
46  # Add the side vector for more aggressive tracking
47  additional_vector = -side_offset * (current_pos - projection)
48 
49  return np_to_point(new_pos+ additional_vector)
50 
51 def clamp(num, min, max):
52  return min if num < min else max if num > max else num
53 
55  pose = Pose()
56  pose.position.x = t.transform.translation.x
57  pose.position.y = t.transform.translation.y
58  pose.position.z = t.transform.translation.z
59  pose.orientation.x = t.transform.rotation.x
60  pose.orientation.y = t.transform.rotation.y
61  pose.orientation.z = t.transform.rotation.z
62  pose.orientation.w = t.transform.rotation.w
63 
64  return pose
65 
66 def get_dir(from_vec, to_vec):
67  target_direction = [
68  to_vec.x - from_vec.x,
69  to_vec.y - from_vec.y,
70  ]
71  target_distance = math.sqrt(target_direction[0] ** 2 + target_direction[1] ** 2)
72 
73  return [target_direction[0] / target_distance, target_direction[1] / target_distance]
74 
75 class PID:
76  def __init__(self, kp, ki, kd, target=0, windup_guard=20.0):
77  self.kp = kp
78  self.ki = ki
79  self.kd = kd
80  self.target = target
81 
82  self.windup_guard = windup_guard
83 
84  self.prev_error = 0.0
85  self.integral = 0.0
86  self.derivative = 0.0
87 
88  def reset(self):
89  self.prev_error = 0.0
90  self.integral = 0.0
91  self.derivative = 0.0
92 
93  def compute(self, current_value):
94  error = self.target - current_value
95 
96  self.integral += error
97  self.integral = max(min(self.integral, self.windup_guard), -self.windup_guard)
98 
99  self.derivative = error - self.prev_error
100 
101  output = self.kp * error + self.ki * self.integral + self.kd * self.derivative
102 
103  self.prev_error = error
104 
105  return output
utils.PID.windup_guard
windup_guard
Definition: utils.py:82
utils.PID.reset
def reset(self)
Definition: utils.py:88
utils.PID.target
target
Definition: utils.py:80
utils.PID.compute
def compute(self, current_value)
Definition: utils.py:93
utils.clamp
def clamp(num, min, max)
Definition: utils.py:51
utils.PID.derivative
derivative
Definition: utils.py:86
utils.PID
Definition: utils.py:75
utils.PID.kp
kp
Definition: utils.py:77
utils.PID.prev_error
prev_error
Definition: utils.py:84
utils.get_dir
def get_dir(from_vec, to_vec)
Definition: utils.py:66
utils.PID.__init__
def __init__(self, kp, ki, kd, target=0, windup_guard=20.0)
Definition: utils.py:76
utils.transform_to_pose
def transform_to_pose(t)
Definition: utils.py:54
utils.PID.ki
ki
Definition: utils.py:78
utils.PID.integral
integral
Definition: utils.py:85
utils.project_position
def project_position(start, end, current, mindist, maxdist, line_divergence, side_offset)
Definition: utils.py:8
utils.PID.kd
kd
Definition: utils.py:79


line_planner
Author(s):
autogenerated on Sat Jun 10 2023 02:19:03