diff --git a/ros2_ws/src/simple_robot_2dof/launch/kuka_rviz_simulation_2dof_sequential_launch.py b/ros2_ws/src/simple_robot_2dof/launch/kuka_rviz_simulation_2dof_sequential_launch.py index 6a39c00706e54352e13cdc5ee51c7fe648630183..1327740c587bc816102b8910745845663155e28a 100644 --- a/ros2_ws/src/simple_robot_2dof/launch/kuka_rviz_simulation_2dof_sequential_launch.py +++ b/ros2_ws/src/simple_robot_2dof/launch/kuka_rviz_simulation_2dof_sequential_launch.py @@ -1,8 +1,9 @@ import os from launch import LaunchDescription from launch_ros.actions import Node -from launch.actions import ExecuteProcess +from launch.actions import ExecuteProcess, DeclareLaunchArgument from ament_index_python.packages import get_package_share_directory +from launch.substitutions import LaunchConfiguration def generate_launch_description(): @@ -14,7 +15,35 @@ def generate_launch_description(): 'forward_kinematics_simulations.rviz' ) + velocity1_launch_arg = DeclareLaunchArgument('velocity1', default_value = '0.01') # constant: 0.015 acceleration: 0.005 + velocity1 = LaunchConfiguration('velocity1') + + velocity2_launch_arg = DeclareLaunchArgument('velocity2', default_value = '0.03') + velocity2 = LaunchConfiguration('velocity2') + + velocity3_launch_arg = DeclareLaunchArgument('velocity3', default_value = '0.005') + velocity3 = LaunchConfiguration('velocity3') + + slope_launch_arg = DeclareLaunchArgument('slope', default_value = '0.25') # [0 ; 0.5] + slope = LaunchConfiguration('slope') + + velocity_constant_launch_arg = DeclareLaunchArgument('velocity_constant', default_value = '0.015') + velocity_constant = LaunchConfiguration('velocity_constant') + + sequential_launch_arg = DeclareLaunchArgument('sequential', default_value = 'True') # do not change + sequential = LaunchConfiguration('sequential') + + constant_speed_launch_arg = DeclareLaunchArgument('constant_speed', default_value = 'True') + constant_speed = LaunchConfiguration('constant_speed') + return LaunchDescription([ + velocity1_launch_arg, + velocity2_launch_arg, + slope_launch_arg, + velocity3_launch_arg, + velocity_constant_launch_arg, + constant_speed_launch_arg, + sequential_launch_arg, Node( package = package_name, executable = 'forward_kinematics_node_2dof_2', @@ -27,7 +56,15 @@ def generate_launch_description(): executable = 'reference_node_2dof', name = 'reference_node', output = 'screen', - parameters = [] + parameters = [ + {'velocity1': velocity1}, + {'velocity2': velocity2}, + {'velocity3': velocity3}, + {'velocity_constant': velocity_constant}, + {'slope': slope}, + {'sequential': sequential}, + {'constant_speed': constant_speed} + ] ), Node( package='rviz2', diff --git a/ros2_ws/src/simple_robot_2dof/launch/kuka_rviz_simulation_2dof_simultaneous_launch.py b/ros2_ws/src/simple_robot_2dof/launch/kuka_rviz_simulation_2dof_simultaneous_launch.py index 39badf8aadaf6cc489c28d3c3f0db7a0bf96764e..5112ac734ff7d59bb3bdc8241bdf882a2d677275 100644 --- a/ros2_ws/src/simple_robot_2dof/launch/kuka_rviz_simulation_2dof_simultaneous_launch.py +++ b/ros2_ws/src/simple_robot_2dof/launch/kuka_rviz_simulation_2dof_simultaneous_launch.py @@ -1,8 +1,9 @@ import os from launch import LaunchDescription from launch_ros.actions import Node -from launch.actions import ExecuteProcess +from launch.actions import ExecuteProcess, DeclareLaunchArgument from ament_index_python.packages import get_package_share_directory +from launch.substitutions import LaunchConfiguration def generate_launch_description(): @@ -14,7 +15,35 @@ def generate_launch_description(): 'forward_kinematics_simulations.rviz' ) + velocity1_launch_arg = DeclareLaunchArgument('velocity1', default_value = '0.01') # constant: 0.015 acceleration: 0.005 + velocity1 = LaunchConfiguration('velocity1') + + velocity2_launch_arg = DeclareLaunchArgument('velocity2', default_value = '0.03') + velocity2 = LaunchConfiguration('velocity2') + + velocity3_launch_arg = DeclareLaunchArgument('velocity3', default_value = '0.005') + velocity3 = LaunchConfiguration('velocity3') + + slope_launch_arg = DeclareLaunchArgument('slope', default_value = '0.25') # [0 ; 0.5] + slope = LaunchConfiguration('slope') + + velocity_constant_launch_arg = DeclareLaunchArgument('velocity_constant', default_value = '0.015') + velocity_constant = LaunchConfiguration('velocity_constant') + + sequential_launch_arg = DeclareLaunchArgument('sequential', default_value = 'False') # do not change + sequential = LaunchConfiguration('sequential') + + constant_speed_launch_arg = DeclareLaunchArgument('constant_speed', default_value = 'False') # change + constant_speed = LaunchConfiguration('constant_speed') + return LaunchDescription([ + velocity1_launch_arg, + velocity2_launch_arg, + slope_launch_arg, + velocity3_launch_arg, + velocity_constant_launch_arg, + constant_speed_launch_arg, + sequential_launch_arg, Node( package = package_name, executable = 'forward_kinematics_node_2dof_1', @@ -27,7 +56,15 @@ def generate_launch_description(): executable = 'reference_node_2dof', name = 'reference_node', output = 'screen', - parameters = [] + parameters = [ + {'velocity1': velocity1}, + {'velocity2': velocity2}, + {'velocity3': velocity3}, + {'velocity_constant': velocity_constant}, + {'slope': slope}, + {'sequential': sequential}, + {'constant_speed': constant_speed} + ] ), Node( package='rviz2', diff --git a/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/forward_kinematics_node_2dof_1.py b/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/forward_kinematics_node_2dof_1.py index 1988ebce939d6e7acd84815a030f739c0f522709..7be6ee84c6e31a1bcbc5207edd04cad63aaec75e 100644 --- a/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/forward_kinematics_node_2dof_1.py +++ b/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/forward_kinematics_node_2dof_1.py @@ -19,7 +19,7 @@ import time class Forward_Kinematics_Node_2Dof(Node): def __init__(self): - super().__init__('forward_kinematics_node_1dof') + super().__init__('forward_kinematics_node_2dof') # Create a subscriber, initialising the transformation self.subscription = self.create_subscription( Float64, @@ -50,9 +50,15 @@ class Forward_Kinematics_Node_2Dof(Node): self.path.header.frame_id = "map" self.path.header.stamp = self.get_clock().now().to_msg() + self.index = 0 + def listener_callback(self, msg): # Get the message self.phi = msg.data + + if self.phi == 0: + self.index += 1 + # call the transformation function self.transformation() @@ -95,7 +101,8 @@ class Forward_Kinematics_Node_2Dof(Node): end_orientation = Rotation.from_matrix(end_forward_kinematics[:3, :3]).as_quat() self.publish_pose_simple_robot(end_position, end_orientation) - self.publish_pose_target_pose(end_position, end_orientation) + if self.index == 1: + self.publish_pose_target_pose(end_position, end_orientation) self.construct_path(end_position) @@ -177,6 +184,7 @@ class Forward_Kinematics_Node_2Dof(Node): self.pose_publisher_kuka_robot_.publish(pose_msg) # if self.phi == 0.0: # time.sleep(1) + def main(args = None): diff --git a/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/forward_kinematics_node_2dof_2.py b/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/forward_kinematics_node_2dof_2.py index e0fe2a98a5ff385bf956568f4014068dbce633a9..a605044e4832c5f88ac22cf247a67dcc36a99a39 100644 --- a/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/forward_kinematics_node_2dof_2.py +++ b/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/forward_kinematics_node_2dof_2.py @@ -19,7 +19,7 @@ import time class Forward_Kinematics_Node_2Dof(Node): def __init__(self): - super().__init__('forward_kinematics_node_1dof') + super().__init__('forward_kinematics_node_2dof') # Create a subscriber, initialising the transformation self.subscription = self.create_subscription( Float64, @@ -54,7 +54,7 @@ class Forward_Kinematics_Node_2Dof(Node): self.phi = msg.data # Define index and if phi is resetted add 1 to the index if(self.phi == 0): - self.index +=1 + self.index += 1 # check which function to call if(self.index % 2 == 0): @@ -103,7 +103,9 @@ class Forward_Kinematics_Node_2Dof(Node): self.end_vector = np.matmul(rotation, start_position) self.publish_pose_simple_robot(end_position_1, end_orientation_1) - self.publish_pose_target_pose(end_position_1, end_orientation_1) + + if self.index == 2: + self.publish_pose_target_pose(end_position_1, end_orientation_1) # construct the path of the rotation self.construct_path(end_position_1) @@ -127,7 +129,10 @@ class Forward_Kinematics_Node_2Dof(Node): end_position_2 = end_forward_kinematics_2[:4, 3] end_orientation_2 = Rotation.from_matrix(end_forward_kinematics_2[:3, :3]).as_quat() - self.publish_pose_target_pose(end_position_2, end_orientation_2) + self.publish_pose_simple_robot(end_position_2, end_orientation_2) + + if self.index == 3: + self.publish_pose_target_pose(end_position_2, end_orientation_2) # construct the path of the translation self.construct_path(end_position_2) diff --git a/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/reference_node_2dof.py b/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/reference_node_2dof.py index ae03518bafdf57b9b83d308bb19fa8eed34b86db..0c3482d0a7e304824a9dd062de9dca7cde61ce93 100644 --- a/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/reference_node_2dof.py +++ b/ros2_ws/src/simple_robot_2dof/simple_robot_2dof/reference_node_2dof.py @@ -9,15 +9,34 @@ import time class Reference_Node_2DoF(Node): def __init__(self): - super().__init__('reference_node_1dof') + super().__init__('reference_node_2dof') #Create a publisher sending the vector as a message - self.publisher_ = self.create_publisher(Float64, '/dof2/reference_angles', 10)# - timer_period = 0.05 # seconds - self.timer = self.create_timer(timer_period, self.ref_point_publisher) + self.publisher_ = self.create_publisher(Float64, '/dof2/reference_angles', 10) + + self.declare_parameter('velocity1', 0.0) + self.declare_parameter('velocity2', 0.0) + self.declare_parameter('velocity3', 0.0) + self.declare_parameter('velocity_constant', 0.0) + self.declare_parameter('slope', 0.0) + self.declare_parameter('sequential', False) + self.declare_parameter('constant_speed', False) + + self.velocity1 = self.get_parameter('velocity1').get_parameter_value().double_value + self.velocity2 = self.get_parameter('velocity2').get_parameter_value().double_value + self.velocity3 = self.get_parameter('velocity3').get_parameter_value().double_value + self.velocity_constant = self.get_parameter('velocity_constant').get_parameter_value().double_value + self.slope = self.get_parameter('slope').get_parameter_value().double_value + self.sequential = self.get_parameter('sequential').get_parameter_value().bool_value + self.constant_speed = self.get_parameter('constant_speed').get_parameter_value().bool_value + self.phi_start = 0.0 self.phi_end = 1.0 self.phi = self.phi_start - self.delta = 0.005 + self.delta = self.velocity_constant + + + self.timer_period = 0.1 # seconds + self.timer = self.create_timer(self.timer_period, self.ref_point_publisher) # List the points def ref_point_publisher(self): @@ -25,12 +44,42 @@ class Reference_Node_2DoF(Node): # Interpolate between x_0 - x_1 msg = Float64() - self.phi = self.phi + self.delta - + + if self.sequential == False: + if self.constant_speed == True: + self.phi = self.phi + self.delta + elif self.constant_speed == False: + if self.phi < self.slope: + self.phi = self.phi + self.velocity1 + elif self.phi > 1 - self.slope: + self.phi = self.phi + self.velocity3 + else: + self.phi = self.phi + self.velocity2 + elif self.sequential == True: + if self.constant_speed == True: + self.phi = self.phi + self.delta + elif self.constant_speed == False: + if self.phi < self.slope: + self.phi = self.phi + self.velocity1 + else: + self.phi = self.phi + self.velocity2 + + + + # if self.constant_speed == True: + # self.phi = self.phi + self.delta + # elif self.constant_speed == False: + # if self.phi < self.slope: + # self.phi = self.phi + self.velocity1 + # elif self.phi > 1 - self.slope: + # self.phi = self.phi + self.velocity3 + # else: + # self.phi = self.phi + self.velocity2 + #setting back to 0 if self.phi>self.phi_end: self.phi = self.phi_start - #self.get_logger().info('Resetting "%f"' % self.phi) + # self.get_logger().info('Resetting "%f"' % self.phi) msg.data = self.phi self.publisher_.publish(msg)