From 05b4cb8abd629d753a8ff86fca4e3cfd5547be4b Mon Sep 17 00:00:00 2001 From: sberestov Date: Wed, 27 Nov 2024 23:26:22 +0300 Subject: [PATCH 1/2] Added a control file for waterstrider --- lesson_07/step_1.py | 100 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 lesson_07/step_1.py diff --git a/lesson_07/step_1.py b/lesson_07/step_1.py new file mode 100644 index 0000000..0aef551 --- /dev/null +++ b/lesson_07/step_1.py @@ -0,0 +1,100 @@ +import rclpy +from rclpy.node import Node + +from std_msgs.msg import Float64 +from geometry_msgs.msg import Twist +from geometry_msgs.msg import PoseStamped + +from tf_transformations import euler_from_quaternion + +import math + +def angle_diff(a1, a2):## + a = a1-a2 + return (a+math.pi)%(2*math.pi)-math.pi + +def get_yaw_from_quaternion(q): + return euler_from_quaternion([q.x, q.y, q.z, q.w])[2] + +def get_distance(delta_point): + return sum(map(lambda x: x**2, delta_point))**0.5 + +def get_course_to_point(delta_point): + ln = get_distance(delta_point) + if ln: + dxn = delta_point[0]/ln + dyn = delta_point[1]/ln + ang = math.acos(dxn) + if dyn < 0: + ang = 2*math.pi - ang + return ang + return 0 + +def get_dist_course(delta_point): + dist = get_distance(delta_point) + course = get_course_to_point(delta_point) + return dist, course + +def get_delta_point(from_point, to_point): + return [to_point[0] - from_point[0], to_point[1] - from_point[1]] + + +class RurMover(Node): + def __init__(self): + super().__init__('controller') + self.CONTROLER_PERIOD = 1/10 + self.DIST_THRESHOLD = 0.5 + + self.publisher_twist = self.create_publisher(Twist, '/waterstrider/twist_command', 10) + + zero_point = Float64() + zero_point.data = 0.0 + self.heading_pub = self.create_publisher(Float64, '/waterstrider/pid_heading/state', 10) + self.heading_setpoint = self.create_publisher(Float64, '/waterstrider/pid_heading/setpoint', 10) + self.heading_result = self.create_subscription(Float64, '/waterstrider/pid_heading/output', self.pid_heading_callback, 10) + self.heading_setpoint.publish(zero_point) + + self.create_subscription(PoseStamped, '/waterstrider/ground_truth_to_tf_waterstrider/pose', self.pose_callback, 10) + + self.heading = 0 + self.self_point = [0.0, 0.0] + self.goal_point = [0.0, 0.0] + + self.timer = self.create_timer(self.CONTROLER_PERIOD, self.update) + self.result = Twist() + + def update(self): + self.publisher_twist.publish(self.result) + + def pose_callback(self, msg): + desired_heading = Float64() + current_heading = Float64() + + delta_point = get_delta_point(self.self_point, self.goal_point) + desired_heading.data = get_dist_course(delta_point) + self.heading_setpoint.publish(desired_heading) + self.heading_pub.publish(current_heading) + + + def pid_distance_callback(self, msg): + self.result.linear.x = -1*msg.data + + def pid_heading_callback(self, msg): + self.result.angular.z = -1*msg.data + + def log_info(self, msg: str) -> None: + self.get_logger().info(msg) + + +def main(args=None): + rclpy.init(args=args) + + mover = RurMover() + + rclpy.spin(mover) + + mover.destroy_node() + rclpy.shutdown() + +if __name__ == '__main__': + main() \ No newline at end of file -- GitLab From 7ee416901f2c198c0d62b6fc4c1590b862b701c7 Mon Sep 17 00:00:00 2001 From: sberestov Date: Sun, 1 Dec 2024 16:06:22 +0300 Subject: [PATCH 2/2] Minor changes to the pid-node --- lesson_07/pid_node.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lesson_07/pid_node.py b/lesson_07/pid_node.py index 6c390a5..45c5936 100644 --- a/lesson_07/pid_node.py +++ b/lesson_07/pid_node.py @@ -4,7 +4,7 @@ import rclpy from rclpy.node import Node from std_msgs.msg import Float64 from rcl_interfaces.msg import SetParametersResult - +import math class PID(Node): config = {} @@ -53,7 +53,7 @@ class PID(Node): self.pub_result.publish(message) def angular_constraint(self, e): - return (e + 180.0) % (2 * 180.0) - 180.0 + return (e + math.pi) % (2 * math.pi) - math.pi def update(self, state): error = self.sp - state if not self.config['inverted'] else state - self.sp -- GitLab