| @@ -30,8 +30,6 @@ standing_pose_ = HexapodPose( | |||
| ), | |||
| legs = [ | |||
| HexapodLeg(label="e1", position=Point(x = leg_offsets['e1'].x + -100.0, y = leg_offsets['e1'].y + 0.0, z =leg_offsets['e1'].z + -130.0)), | |||
| ] | |||
| ) | |||
| @@ -100,7 +98,6 @@ def interpolate_pose(start, end, steps): | |||
| poses = [] | |||
| for i in range(0, steps): | |||
| print(i) | |||
| pose = { | |||
| 'body': Pose( | |||
| position = Point( | |||
| @@ -0,0 +1,61 @@ | |||
| from geometry_msgs.msg import Point, Pose | |||
| from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint | |||
| from builtin_interfaces.msg import Duration | |||
| import rclpy | |||
| from rclpy.node import Node | |||
| from hexapod_python.ik import ik, interpolate_pose, calibration_pose, shutdown_pose | |||
| import time | |||
| class IKPublisherNode(Node): | |||
| def __init__(self, node_name = "ik_publisher"): | |||
| super().__init__(node_name) | |||
| self.leg_groups_ = [ "e1", "e2", "e3", "e4", "e5", "e6"] | |||
| self.create_leg_publishers() | |||
| ik_values = [ ik(calibration_pose)] | |||
| def create_leg_publishers(self): | |||
| self.publisher_ = {} | |||
| for leg in self.leg_groups_: | |||
| controller_topic = f"/{leg}_group_controller/joint_trajectory" | |||
| self.publisher_[leg] = self.create_publisher(JointTrajectory, controller_topic , 10) | |||
| # wait for the controller to subscribe | |||
| print("Waiting for subscribers") | |||
| for leg in self.leg_groups_: | |||
| while self.count_subscribers(f"/{leg}_group_controller/joint_trajectory") == 0: | |||
| time.sleep(0.1) | |||
| def publish_ik_values(self, ik_values): | |||
| for leg in self.leg_groups_: | |||
| t = 0 | |||
| joint_trajectory_points = [] | |||
| for i in ik_values: | |||
| joint_trajectory_points.append( | |||
| JointTrajectoryPoint( | |||
| positions = i[leg], | |||
| time_from_start = Duration(nanosec = t%50 * 20000000 , sec = int(t/50)) | |||
| ) | |||
| ) | |||
| t += 1 | |||
| group_num = leg[1:] | |||
| trajectory = JointTrajectory( | |||
| joint_names = [ f"c{group_num}_joint", f"f{group_num}_joint", f"t{group_num}_joint" ], | |||
| points = joint_trajectory_points | |||
| ) | |||
| self.publisher_[leg].publish(trajectory) | |||
| def main(args = None): | |||
| rclpy.init(args=args) | |||
| ik_publisher = IKPublisher() | |||
| rclpy.spin(ik_publisher) | |||
| ik_publisher.destroy_node() | |||
| rclpy.shutdown() | |||
| @@ -0,0 +1,49 @@ | |||
| from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint | |||
| from builtin_interfaces.msg import Duration | |||
| from rclpy.node import Node | |||
| from hexapod_python.ik import ik | |||
| import time | |||
| class IKPublisherNode(Node): | |||
| def __init__(self, node_name = "ik_publisher"): | |||
| super().__init__(node_name) | |||
| self.leg_groups_ = [ "e1", "e2", "e3", "e4", "e5", "e6"] | |||
| self.create_leg_publishers() | |||
| def create_leg_publishers(self): | |||
| self.publisher_ = {} | |||
| for leg in self.leg_groups_: | |||
| controller_topic = f"/{leg}_group_controller/joint_trajectory" | |||
| self.publisher_[leg] = self.create_publisher(JointTrajectory, controller_topic , 10) | |||
| # wait for the controller to subscribe | |||
| print("Waiting for subscribers") | |||
| for leg in self.leg_groups_: | |||
| while self.count_subscribers(f"/{leg}_group_controller/joint_trajectory") == 0: | |||
| time.sleep(0.1) | |||
| def publish_ik_values(self, ik_values): | |||
| for leg in self.leg_groups_: | |||
| t = 0 | |||
| joint_trajectory_points = [] | |||
| for i in ik_values: | |||
| joint_trajectory_points.append( | |||
| JointTrajectoryPoint( | |||
| positions = i[leg], | |||
| time_from_start = Duration(nanosec = t%50 * 20000000 , sec = int(t/50)) | |||
| ) | |||
| ) | |||
| t += 1 | |||
| group_num = leg[1:] | |||
| trajectory = JointTrajectory( | |||
| joint_names = [ f"c{group_num}_joint", f"f{group_num}_joint", f"t{group_num}_joint" ], | |||
| points = joint_trajectory_points | |||
| ) | |||
| self.publisher_[leg].publish(trajectory) | |||
| @@ -4,57 +4,24 @@ from builtin_interfaces.msg import Duration | |||
| import rclpy | |||
| from rclpy.node import Node | |||
| from hexapod_python.ik_publisher_node import IKPublisherNode | |||
| from hexapod_python.ik import ik, interpolate_pose, standing_pose, shutdown_pose | |||
| import time | |||
| class JTCPublisher(Node): | |||
| class IKTestNode(IKPublisherNode): | |||
| def __init__(self): | |||
| super().__init__('jtc_publisher') | |||
| self.leg_groups_ = [ "e1", "e2", "e3", "e4", "e5", "e6"] | |||
| self.publisher_ = {} | |||
| for leg in self.leg_groups_: | |||
| controller_topic = f"/{leg}_group_controller/joint_trajectory" | |||
| self.publisher_[leg] = self.create_publisher(JointTrajectory, controller_topic , 10) | |||
| # wait for the controller to subscribe | |||
| print("Waiting for subscribers") | |||
| for tag in self.leg_groups_: | |||
| while self.count_subscribers(f"/{leg}_group_controller/joint_trajectory") == 0: | |||
| time.sleep(0.1) | |||
| super().__init__('ik_test') | |||
| ik_values = [ ik(pose) for pose in interpolate_pose(shutdown_pose, standing_pose, 150) + interpolate_pose(standing_pose, shutdown_pose, 150)] | |||
| print(ik_values) | |||
| for leg in self.leg_groups_: | |||
| t = 0 | |||
| joint_trajectory_points = [] | |||
| for i in ik_values: | |||
| joint_trajectory_points.append( | |||
| JointTrajectoryPoint( | |||
| positions = i[leg], | |||
| time_from_start = Duration(nanosec = t%50 * 20000000 , sec = int(t/50)) | |||
| ) | |||
| ) | |||
| t += 1 | |||
| print(joint_trajectory_points) | |||
| group_num = leg[1:] | |||
| trajectory = JointTrajectory( | |||
| joint_names = [ f"c{group_num}_joint", f"f{group_num}_joint", f"t{group_num}_joint" ], | |||
| points = joint_trajectory_points | |||
| ) | |||
| self.publisher_[leg].publish(trajectory) | |||
| self.publish_ik_values(ik_values) | |||
| raise SystemExit | |||
| def main(args = None): | |||
| rclpy.init(args=args) | |||
| jtc_publisher = JTCPublisher() | |||
| rclpy.spin(jtc_publisher) | |||
| jtc_publisher.destroy_node() | |||
| ik_publisher = IKTestNode() | |||
| rclpy.spin_once(ik_publisher) | |||
| ik_publisher.destroy_node() | |||
| rclpy.shutdown() | |||
| @@ -21,7 +21,8 @@ setup( | |||
| entry_points={ | |||
| 'console_scripts': [ | |||
| 'jtc_test = hexapod_python.jtc_test:main', | |||
| 'ik_test = hexapod_python.ik_test:main' | |||
| 'ik_test = hexapod_python.ik_test:main', | |||
| 'ik_calibration = hexapod_python.ik_calibration:main' | |||
| ], | |||
| }, | |||
| ) | |||