shroudTest.py
Go to the documentation of this file.
1 #! /usr/bin/env python3
2 import rospy
3 import actionlib
4 
5 from geometry_msgs.msg import Vector3, Quaternion, Twist
6 from std_msgs.msg import Float32, Empty
7 from nav_msgs.msg import Odometry
8 import riptide_controllers.msg
9 
10 import time
11 import math
12 import yaml
13 import numpy as np
14 
15 from tf.transformations import quaternion_from_euler, euler_from_quaternion
16 
17 def msg_to_numpy(msg):
18  if hasattr(msg, "w"):
19  return np.array([msg.x, msg.y, msg.z, msg.w])
20  return np.array([msg.x, msg.y, msg.z])
21 
22 class ShroudTestAction(object):
23 
24  _result = riptide_controllers.msg.ShroudTestResult()
25 
26  def __init__(self):
27  self.position_pub = rospy.Publisher("position", Vector3, queue_size=1)
28  self.orientation_pub = rospy.Publisher("orientation", Quaternion, queue_size=1)
29  self.velocity_pub = rospy.Publisher("linear_velocity", Vector3, queue_size=1)
30  self.off_pub = rospy.Publisher("off", Empty, queue_size=1)
31 
32  # Get the mass and COM
33  with open(rospy.get_param('~vehicle_config'), 'r') as stream:
34  vehicle = yaml.safe_load(stream)
35  self.mass = vehicle['mass']
36  self.linear_drag = vehicle['linear_damping'][0]
37  self.quadratic_drag = vehicle['quadratic_damping'][0]
38 
39 
40  self._as = actionlib.SimpleActionServer("shroud_test", riptide_controllers.msg.ShroudTestAction, execute_cb=self.execute_cb, auto_start=False)
41  self._as.start()
42 
43 
44  def execute_cb(self, goal):
45  rospy.loginfo("Starting shroud test")
46 
47 
48  # Submerge
49  odom_msg = rospy.wait_for_message("odometry/filtered", Odometry)
50  current_position = msg_to_numpy(odom_msg.pose.pose.position)
51  current_orientation = msg_to_numpy(odom_msg.pose.pose.orientation)
52  self.position_pub.publish(Vector3(current_position[0], current_position[1], -1.5))
53  _, _, y = euler_from_quaternion(current_orientation)
54  self.orientation_pub.publish(Quaternion(*quaternion_from_euler(0, 0, y)))
55 
56  # Wait for equilibrium
57  rospy.sleep(15)
58 
59  self.velocity_pub.publish(Vector3(0.5, 0, 0))
60 
61  rospy.sleep(5)
62 
63  accel = rospy.wait_for_message("controller/requested_accel", Twist).linear.x
64  vel = rospy.wait_for_message("odometry/filtered", Odometry).twist.twist.linear.x
65 
66  # Real forld force on the robot: drag_force
67  # Force exerted by robot: (1-p) * (drag_force + correction_force)
68  # Solve for p when drag_force = (1-p) * (drag_force + correction_force)
69 
70  drag_force = abs(self.linear_drag * vel + self.quadratic_drag * vel ** 2)
71  correction_force = self.mass * accel
72  p = correction_force / (drag_force + correction_force)
73 
74  rospy.loginfo("Drag: %f" % drag_force)
75  rospy.loginfo("Correction: %f" % correction_force)
76  rospy.loginfo("Percent reduction in force: %0.2f%%" % (p * 100))
77 
78  self.off_pub.publish()
79 
80  self._as.set_succeeded(self._result)
81 
82 
83 
84 
85 if __name__ == '__main__':
86  rospy.init_node('shroud_test')
87  server = ShroudTestAction()
88  rospy.spin()
shroudTest.ShroudTestAction.mass
mass
Definition: shroudTest.py:35
shroudTest.ShroudTestAction._as
_as
Definition: shroudTest.py:40
shroudTest.ShroudTestAction._result
_result
Definition: shroudTest.py:24
shroudTest.ShroudTestAction.off_pub
off_pub
Definition: shroudTest.py:30
shroudTest.ShroudTestAction.position_pub
position_pub
Definition: shroudTest.py:27
shroudTest.ShroudTestAction.execute_cb
def execute_cb(self, goal)
Definition: shroudTest.py:44
shroudTest.msg_to_numpy
def msg_to_numpy(msg)
Definition: shroudTest.py:17
shroudTest.ShroudTestAction
Definition: shroudTest.py:22
shroudTest.ShroudTestAction.velocity_pub
velocity_pub
Definition: shroudTest.py:29
shroudTest.ShroudTestAction.orientation_pub
orientation_pub
Definition: shroudTest.py:28
shroudTest.ShroudTestAction.__init__
def __init__(self)
Definition: shroudTest.py:26
actionlib::SimpleActionServer
shroudTest.ShroudTestAction.linear_drag
linear_drag
Definition: shroudTest.py:36
shroudTest.ShroudTestAction.quadratic_drag
quadratic_drag
Definition: shroudTest.py:37


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