controller.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 # controller node
4 #
5 # Input topics:
6 # odometry/filtered: Current state of the vehicle
7 # orientation: Puts the angular controller in position mode. Sets angular target to given orientation
8 # angular_velocity: Puts the angular controller in velocity mode. Sets angular target to given body-frame angular velocity
9 # disable_angular: Puts the angular controller in disabled mode.
10 # position: Puts the linear controller in position mode. Sets linear target to given world-frame position
11 # linear_velocity: Puts the linear controller in velocity mode. Sets linear target to given body-frame linear velocity
12 # disable_linear: Puts the linear controller in disabled mode.
13 # off: Turns off the controller. This will stop all output from the controller and thruster will stop
14 #
15 # Output topics:
16 # net_force: The force the robot should exert on the world to achieve the given target
17 # ~requested_accel: The acceleration requested from the controllers. Used for calibration
18 #
19 # This node contains 4 parts. The linear controller, the angular controller, the acceleration calculator, and the trajectory reader.
20 # The linear and angular controllers return an acceleration the robot should eperience to achieve that controller's target.
21 # The acceleration calculator takes that acceleration and computes how much force the robot needs to exert to achieve that acceleration.
22 # The trajectory reader will feed current states to the controllers to follow a trajectory.
23 
24 
25 import rospy
26 from nav_msgs.msg import Odometry
27 from geometry_msgs.msg import Quaternion, Vector3, Twist
28 from std_msgs.msg import Empty, Bool
29 from tf.transformations import quaternion_multiply, quaternion_inverse, quaternion_slerp
30 import numpy as np
31 from abc import ABC, abstractmethod
32 import yaml
33 from dynamic_reconfigure.server import Server
34 from riptide_controllers.cfg import NewControllerConfig
35 import actionlib
36 import riptide_controllers.msg
37 
38 def msgToNumpy(msg):
39  if hasattr(msg, "w"):
40  return np.array([msg.x, msg.y, msg.z, msg.w])
41  return np.array([msg.x, msg.y, msg.z])
42 
43 def worldToBody(orientation, vector):
44  """
45  Rotates world-frame vector to body-frame
46 
47  Rotates vector to body frame
48 
49  Parameters:
50  orientation (np.array): The current orientation of the robot as a quaternion
51  vector (np.array): The 3D vector to rotate
52 
53  Returns:
54  np.array: 3 dimensional rotated vector
55 
56  """
57 
58  vector = np.append(vector, 0)
59  orientationInv = quaternion_inverse(orientation)
60  newVector = quaternion_multiply(orientationInv, quaternion_multiply(vector, orientation))
61  return newVector[:3]
62 
63 def applyMax(vector, max_vector):
64  """
65  Scales a vector to obey maximums
66 
67  Parameters:
68  vector (np.array): The unscaled vector
69  max_vector (np.array): The maximum values for each element
70 
71  Returns:
72  np.array: Vector that obeys the maximums
73 
74  """
75 
76  scale = 1
77  for i in range(len(vector)):
78  if abs(vector[i]) > max_vector[i]:
79  element_scale = max_vector[i] / abs(vector[i])
80  if element_scale < scale:
81  scale = element_scale
82 
83  return vector * scale
84 
85 
87 
88  def __init__(self):
89  self.targetPosition = None
90  self.targetVelocity = None
91  self.targetAcceleration = None
92  self.positionP = np.zeros(3)
93  self.velocityP = np.zeros(3)
94  self.maxVelocity = np.zeros(3)
95  self.maxAccel = np.zeros(3)
96  self.steadyVelThresh = 0.00001
97  self.steadyAccelThresh = 0.00001
98  self.steady = True
99 
100  @abstractmethod
101  def computeCorrectiveVelocity(self, odom):
102  """
103  Computes a corrective velocity.
104 
105  If self.targetPosition is not None, will return a corrective body-frame velocity that moves the robot in the direction of self.targetPosiiton. Otherwise returns 0 vector.
106 
107  Parameters:
108  odom (Odometry): The latest odometry message
109 
110  Returns:
111  np.array: 3 dimensional vector representing corrective body-frame velocity.
112 
113  """
114  pass
115 
116  @abstractmethod
117  def computeCorrectiveAcceleration(self, odom, correctiveVelocity):
118  """
119  Computes a corrective acceleration.
120 
121  If self.targetVelocity is not None, will return a corrective body-frame acceleration that transitions the robot twoards the desired self.targetVelocity. Otherwise returns 0 vector.
122 
123  Parameters:
124  correctiveVelocity (np.array): Body-frame velocity vector that adds on to the self.targetVelocity. Is used in position correction.
125  odom (Odometry): The latest odometry message
126 
127  Returns:
128  np.array: 3 dimensional vector representing corrective body-frame acceleration.
129 
130  """
131  pass
132 
133  def setTargetPosition(self, targetPosition):
134  """
135  Sets target position
136 
137  Puts the controller in the Position state and sets self.targetPosition to targetPosition
138 
139  Parameters:
140  targetPosition (np.array or Vector3): World-frame vector or quaternion to be achieved by the controller
141 
142  """
143 
144  self.targetPosition = msgToNumpy(targetPosition)
145  # Zeros here because we want velocity correction to
146  # still happen but don't want it to hold a velocity
147  self.targetVelocity = np.zeros(3)
148  self.targetAcceleration = None
149 
150  def setTargetVelocity(self, targetVelocity):
151  """
152  Sets target velocity
153 
154  Puts the controller in the Velocity state and sets self.targetVelocity to targetVelocity
155 
156  Parameters:
157  targetVelocity (np.array): Body-frame vector to be achieved by the controller
158 
159  """
160 
161  self.targetPosition = None
162  self.targetVelocity = msgToNumpy(targetVelocity)
163  self.targetAcceleration = None
164 
165  def disable(self, msg=None):
166  """
167  Disables the controller
168 
169  Puts the controller in the Disabled state
170 
171  """
172 
173  self.targetPosition = None
174  self.targetVelocity = None
175  self.targetAcceleration = None
176 
177  def update(self, odom):
178  """
179  Updates the controller
180 
181  Will compute an output acceleration to achieve the desired state
182 
183  Parameters:
184  odom (Odometry): The latest odometry message
185 
186  Returns:
187  np.array: 3 dimensional vector representing net body-frame acceleration.
188 
189  """
190 
191  netAccel = np.zeros(3)
192 
193  if self.targetPosition is not None or self.targetVelocity is not None:
194  correctiveVelocity = self.computeCorrectiveVelocity(odom)
195  netAccel += self.computeCorrectiveAcceleration(odom, correctiveVelocity)
196 
197  if self.targetAcceleration is not None:
198  netAccel += self.targetAcceleration
199 
200  netAccel = applyMax(netAccel, self.maxAccel)
201 
202  if self.targetAcceleration is not None: # Trajectory mode
203  self.steady = False
204  elif self.targetPosition is not None: # Position mode
205  self.steady = np.allclose(correctiveVelocity, np.zeros(3), atol=self.steadyVelThresh)
206  elif self.targetVelocity is not None: # Velocity mode
207  self.steady = np.allclose(netAccel, np.zeros(3), atol=self.steadyAccelThresh)
208  else:
209  self.steady = True
210 
211  return netAccel
212 
214 
215  def __init__(self):
216  super(LinearCascadedPController, self).__init__()
217  self.steadyVelThresh = 0.02
218  self.steadyAccelThresh = 0.02
219 
220  def computeCorrectiveVelocity(self, odom):
221 
222  if self.targetPosition is not None:
223  currentPosition = msgToNumpy(odom.pose.pose.position) # [1 0 0]
224  outputVel = (self.targetPosition - currentPosition) * self.positionP # [-1 0 1]
225  orientation = msgToNumpy(odom.pose.pose.orientation)
226  return worldToBody(orientation, outputVel)
227  else:
228  return np.zeros(3)
229 
230  def computeCorrectiveAcceleration(self, odom, correctiveVelocity):
231 
232  if self.targetVelocity is not None:
233  targetVelocity = self.targetVelocity + correctiveVelocity
234  targetVelocity = applyMax(targetVelocity, self.maxVelocity)
235  currentVelocity = msgToNumpy(odom.twist.twist.linear)
236  outputAccel = (targetVelocity - currentVelocity) * self.velocityP
237  return outputAccel
238  else:
239  return np.zeros(3)
240 
242 
243  def __init__(self):
244  super(AngularCascadedPController, self).__init__()
245  self.steadyVelThresh = 0.1
246  self.steadyAccelThresh = 0.1
247 
248  def computeCorrectiveVelocity(self, odom):
249 
250  if self.targetPosition is not None:
251  currentOrientation = msgToNumpy(odom.pose.pose.orientation)
252 
253  # Below code only works for small angles so lets find an orientation in the right direction but with a small angle
254  intermediateOrientation = quaternion_slerp(currentOrientation, self.targetPosition, 0.01)
255  dq = (intermediateOrientation - currentOrientation)
256  outputVel = quaternion_multiply(quaternion_inverse(currentOrientation), dq)[:3] * self.positionP
257  return outputVel
258  else:
259  return np.zeros(3)
260 
261  def computeCorrectiveAcceleration(self, odom, correctiveVelocity):
262 
263  if self.targetVelocity is not None:
264  targetVelocity = self.targetVelocity + correctiveVelocity
265  for i in range(3):
266  if abs(targetVelocity[i]) > self.maxVelocity[i]:
267  targetVelocity[i] = self.maxVelocity[i] * targetVelocity[i] / abs(targetVelocity[i])
268  currentVelocity = msgToNumpy(odom.twist.twist.angular)
269  outputAccel = (targetVelocity - currentVelocity) * self.velocityP
270  return outputAccel
271  else:
272  return np.zeros(3)
273 
275  def __init__(self, config):
276  self.mass = np.array(config["mass"])
277  self.com = np.array(config["com"])
278  self.inertia = np.array(config["inertia"])
279  self.linearDrag = np.zeros(6)
280  self.quadraticDrag = np.zeros(6)
281  self.volume = np.array(config["volume"])
282  self.cob = np.zeros(3)
283  self.gravity = 9.8 # (m/sec^2)
284  self.density = 1000 # density of water (kg/m^3)
285  self.buoyancy = np.zeros(3)
286 
287  def accelToNetForce(self, odom, linearAccel, angularAccel):
288  """
289  Converts vehicle acceleration into required net force.
290 
291  Will take the required acceleration and consider mass, buoyancy, drag, and precession to compute the required net force.
292 
293  Parameters:
294  odom (Odometry): The latest odometry message.
295  linearAccel (np.array): The linear body-frame acceleration.
296  angularAccel (np.array): The angular body-frame acceleration.
297 
298  Returns:
299  np.array: 3 dimensional vector representing net body-frame force.
300  np.array: 3 dimensional vector representing net body-frame torque.
301 
302  """
303 
304  linearVelo = msgToNumpy(odom.twist.twist.linear)
305  angularVelo = msgToNumpy(odom.twist.twist.angular)
306  orientation = msgToNumpy(odom.pose.pose.orientation)
307 
308  # Force & Torque Initialization
309  netForce = linearAccel * self.mass
310  netTorque = angularAccel * self.inertia
311 
312  # Forces and Torques Calculation
313  bodyFrameBuoyancy = worldToBody(orientation, self.buoyancy)
314  buoyancyTorque = np.cross((self.cob-self.com), bodyFrameBuoyancy)
315  precessionTorque = -np.cross(angularVelo, (self.inertia * angularVelo))
316  dragForce = self.linearDrag[:3] * linearVelo + self.quadraticDrag[:3] * abs(linearVelo) * linearVelo
317  dragTorque = self.linearDrag[3:] * angularVelo + self.quadraticDrag[3:] * abs(angularVelo) * angularVelo
318  gravityForce = worldToBody(orientation, np.array([0, 0, - self.gravity * self.mass]))
319 
320  # Net Calculation
321  netForce = netForce - bodyFrameBuoyancy - dragForce - gravityForce
322  netTorque = netTorque - buoyancyTorque - precessionTorque - dragTorque
323 
324  return netForce, netTorque
325 
327 
328  def __init__(self, linear_controller, angular_controller):
329  self.linear_controller = linear_controller
330  self.angular_controller = angular_controller
331  self._as = actionlib.SimpleActionServer("follow_trajectory", riptide_controllers.msg.FollowTrajectoryAction, execute_cb=self.execute_cb, auto_start=False)
332  self._as.start()
333 
334  def execute_cb(self, goal):
335  start = rospy.get_rostime()
336 
337  for point in goal.trajectory.points:
338  # Wait for next point
339  while (rospy.get_rostime() - start) < point.time_from_start:
340  if self._as.is_preempt_requested():
341  self.linear_controller.targetVelocity = np.zeros(3)
342  self.linear_controller.targetAcceleration = np.zeros(3)
343  self.angular_controller.targetVelocity = np.zeros(3)
344  self.angular_controller.targetAcceleration = np.zeros(3)
345  self._as.set_preempted()
346  return
347 
348  rospy.sleep(0.01)
349 
350  self.linear_controller.targetPosition = msgToNumpy(point.transforms[0].translation)
351  self.linear_controller.targetVelocity = msgToNumpy(point.velocities[0].linear)
352  self.linear_controller.targetAcceleration = msgToNumpy(point.accelerations[0].linear)
353  self.angular_controller.targetPosition = msgToNumpy(point.transforms[0].rotation)
354  self.angular_controller.targetVelocity = msgToNumpy(point.velocities[0].angular)
355  self.angular_controller.targetAcceleration = msgToNumpy(point.accelerations[0].angular)
356 
357  last_point = goal.trajectory.points[-1]
358  self.linear_controller.setTargetPosition(last_point.transforms[0].translation)
359  self.angular_controller.setTargetPosition(last_point.transforms[0].rotation)
360 
361  self._as.set_succeeded()
362 
364 
365  def __init__(self):
366  config_path = rospy.get_param("~vehicle_config")
367  with open(config_path, 'r') as stream:
368  config = yaml.safe_load(stream)
369 
374 
375  self.maxLinearVelocity = config["maximum_linear_velocity"]
376  self.maxLinearAcceleration = config["maximum_linear_acceleration"]
377  self.maxAngularVelocity = config["maximum_angular_velocity"]
378  self.maxAngularAcceleration = config["maximum_angular_acceleration"]
379 
380  self.lastTorque = None
381  self.lastForce = None
382  self.off = True
383 
384  self.forcePub = rospy.Publisher("net_force", Twist, queue_size=1)
385  self.steadyPub = rospy.Publisher("steady", Bool, queue_size=1)
386  self.accelPub = rospy.Publisher("~requested_accel", Twist, queue_size=1)
387  rospy.Subscriber("odometry/filtered", Odometry, self.updateState)
388  rospy.Subscriber("orientation", Quaternion, self.angularController.setTargetPosition)
389  rospy.Subscriber("angular_velocity", Vector3, self.angularController.setTargetVelocity)
390  rospy.Subscriber("disable_angular", Empty, self.angularController.disable)
391  rospy.Subscriber("position", Vector3, self.linearController.setTargetPosition)
392  rospy.Subscriber("linear_velocity", Vector3, self.linearController.setTargetVelocity)
393  rospy.Subscriber("disable_linear", Empty, self.linearController.disable)
394  rospy.Subscriber("off", Empty, self.turnOff)
395  rospy.Subscriber("state/kill_switch", Bool, self.switch_cb)
396 
397 
398 
399 
400  self.reconfigure_server = Server(NewControllerConfig, self.dynamicReconfigureCb)
401  # set default values in dynamic reconfig
402  self.reconfigure_server.update_configuration({
403  "linear_position_p_x": config["linear_position_p"][0],
404  "linear_position_p_y": config["linear_position_p"][1],
405  "linear_position_p_z": config["linear_position_p"][2],
406  "linear_velocity_p_x": config["linear_velocity_p"][0],
407  "linear_velocity_p_y": config["linear_velocity_p"][1],
408  "linear_velocity_p_z": config["linear_velocity_p"][2],
409  "angular_position_p_x": config["angular_position_p"][0],
410  "angular_position_p_y": config["angular_position_p"][1],
411  "angular_position_p_z": config["angular_position_p"][2],
412  "angular_velocity_p_x": config["angular_velocity_p"][0],
413  "angular_velocity_p_y": config["angular_velocity_p"][1],
414  "angular_velocity_p_z": config["angular_velocity_p"][2],
415  "linear_x": config["linear_damping"][0],
416  "linear_y": config["linear_damping"][1],
417  "linear_z": config["linear_damping"][2],
418  "linear_rot_x": config["linear_damping"][3],
419  "linear_rot_y": config["linear_damping"][4],
420  "linear_rot_z": config["linear_damping"][5],
421  "quadratic_x": config["quadratic_damping"][0],
422  "quadratic_y": config["quadratic_damping"][1],
423  "quadratic_z": config["quadratic_damping"][2],
424  "quadratic_rot_x": config["quadratic_damping"][3],
425  "quadratic_rot_y": config["quadratic_damping"][4],
426  "quadratic_rot_z": config["quadratic_damping"][5],
427  "volume": config["volume"],
428  "center_x": config['cob'][0],
429  "center_y": config['cob'][1],
430  "center_z": config['cob'][2],
431  "max_linear_velocity_x": config["maximum_linear_velocity"][0],
432  "max_linear_velocity_y": config["maximum_linear_velocity"][1],
433  "max_linear_velocity_z": config["maximum_linear_velocity"][2],
434  "max_linear_accel_x": config["maximum_linear_acceleration"][0],
435  "max_linear_accel_y": config["maximum_linear_acceleration"][1],
436  "max_linear_accel_z": config["maximum_linear_acceleration"][2],
437  "max_angular_velocity_x": config["maximum_angular_velocity"][0],
438  "max_angular_velocity_y": config["maximum_angular_velocity"][1],
439  "max_angular_velocity_z": config["maximum_angular_velocity"][2],
440  "max_angular_accel_x": config["maximum_angular_acceleration"][0],
441  "max_angular_accel_y": config["maximum_angular_acceleration"][1],
442  "max_angular_accel_z": config["maximum_angular_acceleration"][2]
443  })
444 
445  def updateState(self, odomMsg):
446  linearAccel = self.linearController.update(odomMsg)
447  angularAccel = self.angularController.update(odomMsg)
448 
449  self.accelPub.publish(Twist(Vector3(*linearAccel), Vector3(*angularAccel)))
450 
451  if np.linalg.norm(linearAccel) > 0 or np.linalg.norm(angularAccel) > 0:
452  self.off = False
453 
454  if not self.off:
455  netForce, netTorque = self.accelerationCalculator.accelToNetForce(odomMsg, linearAccel, angularAccel)
456  else:
457  netForce, netTorque = np.zeros(3), np.zeros(3)
458 
459  self.steadyPub.publish(self.linearController.steady and self.angularController.steady)
460 
461  if not np.array_equal(self.lastTorque, netTorque) or \
462  not np.array_equal(self.lastForce, netForce):
463 
464  self.forcePub.publish(Twist(Vector3(*netForce), Vector3(*netTorque)))
465  self.lastForce = netForce
466  self.lastTorque = netTorque
467 
468  def dynamicReconfigureCb(self, config, level):
469  self.linearController.positionP[0] = config["linear_position_p_x"]
470  self.linearController.positionP[1] = config["linear_position_p_y"]
471  self.linearController.positionP[2] = config["linear_position_p_z"]
472  self.linearController.velocityP[0] = config["linear_velocity_p_x"]
473  self.linearController.velocityP[1] = config["linear_velocity_p_y"]
474  self.linearController.velocityP[2] = config["linear_velocity_p_z"]
475 
476  self.angularController.positionP[0] = config["angular_position_p_x"]
477  self.angularController.positionP[1] = config["angular_position_p_y"]
478  self.angularController.positionP[2] = config["angular_position_p_z"]
479  self.angularController.velocityP[0] = config["angular_velocity_p_x"]
480  self.angularController.velocityP[1] = config["angular_velocity_p_y"]
481  self.angularController.velocityP[2] = config["angular_velocity_p_z"]
482 
483  self.accelerationCalculator.linearDrag[0] = config["linear_x"]
484  self.accelerationCalculator.linearDrag[1] = config["linear_y"]
485  self.accelerationCalculator.linearDrag[2] = config["linear_z"]
486  self.accelerationCalculator.linearDrag[3] = config["linear_rot_x"]
487  self.accelerationCalculator.linearDrag[4] = config["linear_rot_y"]
488  self.accelerationCalculator.linearDrag[5] = config["linear_rot_z"]
489 
490  self.accelerationCalculator.quadraticDrag[0] = config["quadratic_x"]
491  self.accelerationCalculator.quadraticDrag[1] = config["quadratic_y"]
492  self.accelerationCalculator.quadraticDrag[2] = config["quadratic_z"]
493  self.accelerationCalculator.quadraticDrag[3] = config["quadratic_rot_x"]
494  self.accelerationCalculator.quadraticDrag[4] = config["quadratic_rot_y"]
495  self.accelerationCalculator.quadraticDrag[5] = config["quadratic_rot_z"]
496 
497  self.linearController.maxVelocity[0] = config["max_linear_velocity_x"]
498  self.linearController.maxVelocity[1] = config["max_linear_velocity_y"]
499  self.linearController.maxVelocity[2] = config["max_linear_velocity_z"]
500  self.linearController.maxAccel[0] = config["max_linear_accel_x"]
501  self.linearController.maxAccel[1] = config["max_linear_accel_y"]
502  self.linearController.maxAccel[2] = config["max_linear_accel_z"]
503 
504  self.angularController.maxVelocity[0] = config["max_angular_velocity_x"]
505  self.angularController.maxVelocity[1] = config["max_angular_velocity_y"]
506  self.angularController.maxVelocity[2] = config["max_angular_velocity_z"]
507  self.angularController.maxAccel[0] = config["max_angular_accel_x"]
508  self.angularController.maxAccel[1] = config["max_angular_accel_y"]
509  self.angularController.maxAccel[2] = config["max_angular_accel_z"]
510 
511  self.accelerationCalculator.buoyancy = np.array([0, 0, config["volume"] * self.accelerationCalculator.density * self.accelerationCalculator.gravity ])
512  self.accelerationCalculator.cob[0] = config["center_x"]
513  self.accelerationCalculator.cob[1] = config["center_y"]
514  self.accelerationCalculator.cob[2] = config["center_z"]
515 
516  return config
517 
518  def turnOff(self, msg=None):
519  self.angularController.disable()
520  self.linearController.disable()
521  self.off = True
522 
523  def switch_cb(self, msg):
524  if not msg.data:
525  self.turnOff()
526  pass
527 
528 
529 if __name__ == '__main__':
530  rospy.init_node("controller")
531  controller = ControllerNode()
532  rospy.spin()
controller.TrajectoryReader
Definition: controller.py:326
controller.AccelerationCalculator.gravity
gravity
Definition: controller.py:283
controller.CascadedPController.targetPosition
targetPosition
Definition: controller.py:89
controller.CascadedPController.positionP
positionP
Definition: controller.py:92
controller.AccelerationCalculator
Definition: controller.py:274
controller.LinearCascadedPController.computeCorrectiveAcceleration
def computeCorrectiveAcceleration(self, odom, correctiveVelocity)
Definition: controller.py:230
controller.ControllerNode.lastTorque
lastTorque
Definition: controller.py:380
controller.CascadedPController.steady
steady
Definition: controller.py:98
controller.ControllerNode.switch_cb
def switch_cb(self, msg)
Definition: controller.py:523
controller.CascadedPController.maxVelocity
maxVelocity
Definition: controller.py:94
controller.CascadedPController.__init__
def __init__(self)
Definition: controller.py:88
controller.LinearCascadedPController.__init__
def __init__(self)
Definition: controller.py:215
controller.TrajectoryReader.execute_cb
def execute_cb(self, goal)
Definition: controller.py:334
controller.CascadedPController.steadyVelThresh
steadyVelThresh
Definition: controller.py:96
controller.ControllerNode.accelerationCalculator
accelerationCalculator
Definition: controller.py:372
controller.ControllerNode.updateState
def updateState(self, odomMsg)
Definition: controller.py:445
controller.AccelerationCalculator.cob
cob
Definition: controller.py:282
controller.worldToBody
def worldToBody(orientation, vector)
Definition: controller.py:43
controller.ControllerNode.angularController
angularController
Definition: controller.py:371
controller.ControllerNode.steadyPub
steadyPub
Definition: controller.py:385
controller.TrajectoryReader._as
_as
Definition: controller.py:331
controller.LinearCascadedPController
Definition: controller.py:213
controller.ControllerNode.off
off
Definition: controller.py:382
controller.ControllerNode.trajectory_reader
trajectory_reader
Definition: controller.py:373
controller.AccelerationCalculator.volume
volume
Definition: controller.py:281
controller.AngularCascadedPController.__init__
def __init__(self)
Definition: controller.py:243
controller.CascadedPController.velocityP
velocityP
Definition: controller.py:93
controller.AccelerationCalculator.__init__
def __init__(self, config)
Definition: controller.py:275
controller.CascadedPController.update
def update(self, odom)
Definition: controller.py:177
controller.AngularCascadedPController.computeCorrectiveAcceleration
def computeCorrectiveAcceleration(self, odom, correctiveVelocity)
Definition: controller.py:261
controller.AccelerationCalculator.com
com
Definition: controller.py:277
controller.CascadedPController.computeCorrectiveAcceleration
def computeCorrectiveAcceleration(self, odom, correctiveVelocity)
Definition: controller.py:117
controller.msgToNumpy
def msgToNumpy(msg)
Definition: controller.py:38
controller.ControllerNode.maxLinearVelocity
maxLinearVelocity
Definition: controller.py:375
controller.ControllerNode.dynamicReconfigureCb
def dynamicReconfigureCb(self, config, level)
Definition: controller.py:468
controller.CascadedPController
Definition: controller.py:86
controller.CascadedPController.disable
def disable(self, msg=None)
Definition: controller.py:165
controller.AccelerationCalculator.mass
mass
Definition: controller.py:276
controller.ControllerNode.reconfigure_server
reconfigure_server
Definition: controller.py:400
controller.AccelerationCalculator.accelToNetForce
def accelToNetForce(self, odom, linearAccel, angularAccel)
Definition: controller.py:287
controller.LinearCascadedPController.computeCorrectiveVelocity
def computeCorrectiveVelocity(self, odom)
Definition: controller.py:220
controller.AngularCascadedPController
Definition: controller.py:241
controller.ControllerNode.linearController
linearController
Definition: controller.py:370
controller.ControllerNode.maxAngularVelocity
maxAngularVelocity
Definition: controller.py:377
controller.ControllerNode.forcePub
forcePub
Definition: controller.py:384
controller.AccelerationCalculator.buoyancy
buoyancy
Definition: controller.py:285
controller.ControllerNode
Definition: controller.py:363
controller.CascadedPController.setTargetVelocity
def setTargetVelocity(self, targetVelocity)
Definition: controller.py:150
controller.TrajectoryReader.__init__
def __init__(self, linear_controller, angular_controller)
Definition: controller.py:328
controller.ControllerNode.accelPub
accelPub
Definition: controller.py:386
controller.AccelerationCalculator.quadraticDrag
quadraticDrag
Definition: controller.py:280
controller.ControllerNode.turnOff
def turnOff(self, msg=None)
Definition: controller.py:518
actionlib::SimpleActionServer
controller.AccelerationCalculator.density
density
Definition: controller.py:284
controller.CascadedPController.targetVelocity
targetVelocity
Definition: controller.py:90
controller.AngularCascadedPController.computeCorrectiveVelocity
def computeCorrectiveVelocity(self, odom)
Definition: controller.py:248
controller.AccelerationCalculator.inertia
inertia
Definition: controller.py:278
controller.TrajectoryReader.linear_controller
linear_controller
Definition: controller.py:329
controller.AccelerationCalculator.linearDrag
linearDrag
Definition: controller.py:279
controller.CascadedPController.maxAccel
maxAccel
Definition: controller.py:95
controller.ControllerNode.maxLinearAcceleration
maxLinearAcceleration
Definition: controller.py:376
controller.ControllerNode.maxAngularAcceleration
maxAngularAcceleration
Definition: controller.py:378
controller.CascadedPController.setTargetPosition
def setTargetPosition(self, targetPosition)
Definition: controller.py:133
controller.CascadedPController.computeCorrectiveVelocity
def computeCorrectiveVelocity(self, odom)
Definition: controller.py:101
controller.CascadedPController.steadyAccelThresh
steadyAccelThresh
Definition: controller.py:97
controller.ControllerNode.lastForce
lastForce
Definition: controller.py:381
controller.ControllerNode.__init__
def __init__(self)
Definition: controller.py:365
controller.applyMax
def applyMax(vector, max_vector)
Definition: controller.py:63
controller.TrajectoryReader.angular_controller
angular_controller
Definition: controller.py:330
controller.CascadedPController.targetAcceleration
targetAcceleration
Definition: controller.py:91


riptide_controllers
Author(s): Blaine Miller, Mitchell Sayre
autogenerated on Wed Mar 2 2022 00:50:23