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
15 from tf.transformations
import quaternion_from_euler, euler_from_quaternion
19 return np.array([msg.x, msg.y, msg.z, msg.w])
20 return np.array([msg.x, msg.y, msg.z])
24 _result = riptide_controllers.msg.ShroudTestResult()
27 self.
position_pub = rospy.Publisher(
"position", Vector3, 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)
33 with open(rospy.get_param(
'~vehicle_config'),
'r')
as stream:
34 vehicle = yaml.safe_load(stream)
35 self.
mass = vehicle[
'mass']
45 rospy.loginfo(
"Starting shroud test")
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)))
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
71 correction_force = self.
mass * accel
72 p = correction_force / (drag_force + correction_force)
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))
85 if __name__ ==
'__main__':
86 rospy.init_node(
'shroud_test')