добавлен полноценный модуль планирования траекторных перемещений. Необходимо его оформить правильным образом
This commit is contained in:
@@ -93,9 +93,9 @@ def _runtime_setup(context, *args, **kwatgs):
|
|||||||
|
|
||||||
# TODO: не забудь поменять правильное название и имя пакета
|
# TODO: не забудь поменять правильное название и имя пакета
|
||||||
moveit_py_node = Node(
|
moveit_py_node = Node(
|
||||||
name="moveit_py",
|
# name="motion_planning_node",
|
||||||
package="iiwa_planning",
|
package="iiwa_planning",
|
||||||
executable="motion_planning_test",
|
executable="motion_planning",
|
||||||
output="both",
|
output="both",
|
||||||
parameters=[moveit_configs.to_dict()],
|
parameters=[moveit_configs.to_dict()],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,9 +16,10 @@ include_directories(include)
|
|||||||
ament_python_install_package(${PROJECT_NAME})
|
ament_python_install_package(${PROJECT_NAME})
|
||||||
|
|
||||||
install(PROGRAMS
|
install(PROGRAMS
|
||||||
scripts/motion_planning_test.py
|
# scripts/motion_planning_test.py
|
||||||
|
scripts/motion_planning.py
|
||||||
DESTINATION lib/${PROJECT_NAME}
|
DESTINATION lib/${PROJECT_NAME}
|
||||||
RENAME motion_planning_test
|
RENAME motion_planning
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,128 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import rclpy
|
||||||
|
from rclpy.node import Node
|
||||||
|
from moveit.core.robot_state import RobotState
|
||||||
|
from moveit.planning import MoveItPy, PlanningComponent
|
||||||
|
from geometry_msgs.msg import PoseStamped
|
||||||
|
from rclpy.executors import ExternalShutdownException
|
||||||
|
from tf_transformations import quaternion_from_euler
|
||||||
|
|
||||||
|
|
||||||
|
class MotionPlaning(Node):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__("motion_planning_node")
|
||||||
|
|
||||||
|
self.moveit = MoveItPy(node_name="motion_planning_node")
|
||||||
|
self.robot_arm = self.moveit.get_planning_component("iiwa_arm")
|
||||||
|
self.planning_scene_monitor = self.moveit.get_planning_scene_monitor()
|
||||||
|
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
self.get_logger().info("MotionPlanning node is ready...")
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
# self.robot_arm.set_start_state(configuration_name="home")
|
||||||
|
# self.robot_arm.set_goal_state(configuration_name="work")
|
||||||
|
# self.plan_end_execute()
|
||||||
|
|
||||||
|
self.timer = self.create_timer(5.0, self._run_once)
|
||||||
|
|
||||||
|
def _run_once(self):
|
||||||
|
self.timer.cancel()
|
||||||
|
self.handle_plan_execute_pose(0.677, 0.25, 0.21, 3.14, 0, 3.14)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_plan_execute_pose(self, x, y, z, a, b, c):
|
||||||
|
|
||||||
|
pose_goal = PoseStamped()
|
||||||
|
pose_goal.header.frame_id="base_link"
|
||||||
|
pose_goal.header.stamp = self.get_clock().now().to_msg()
|
||||||
|
pose_goal.pose.position.x=x
|
||||||
|
pose_goal.pose.position.y=y
|
||||||
|
pose_goal.pose.position.z=z
|
||||||
|
|
||||||
|
xx, yy, zz, w = quaternion_from_euler(a, b, c)
|
||||||
|
|
||||||
|
pose_goal.pose.orientation.x=xx
|
||||||
|
pose_goal.pose.orientation.y=yy
|
||||||
|
pose_goal.pose.orientation.z=zz
|
||||||
|
pose_goal.pose.orientation.w=w
|
||||||
|
|
||||||
|
# Check collisions
|
||||||
|
with self.planning_scene_monitor.read_only() as scene:
|
||||||
|
|
||||||
|
robot_state = scene.current_state
|
||||||
|
original_joint_positions = robot_state.get_joint_group_positions("iiwa_arm")
|
||||||
|
|
||||||
|
ok_ik = robot_state.set_from_ik("iiwa_arm", pose_goal.pose, "link_ee")
|
||||||
|
robot_state.update()
|
||||||
|
|
||||||
|
if not ok_ik:
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
self.get_logger().error("IK failed -> abort")
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
return
|
||||||
|
|
||||||
|
robot_collision_status = scene.is_state_colliding(
|
||||||
|
robot_state=robot_state,
|
||||||
|
joint_model_group_name="iiwa_arm",
|
||||||
|
verbose=True
|
||||||
|
)
|
||||||
|
if robot_collision_status:
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
self.get_logger().error("Goal in collision -> abort")
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
return
|
||||||
|
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
self.get_logger().info(f"\nRobot is in collision: {robot_collision_status}\n")
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
|
||||||
|
robot_state.set_joint_group_positions(
|
||||||
|
"iiwa_arm",
|
||||||
|
original_joint_positions,
|
||||||
|
)
|
||||||
|
robot_state.update()
|
||||||
|
|
||||||
|
# получить текущее состояние как изначальное для перемещения
|
||||||
|
self.robot_arm.set_start_state_to_current_state()
|
||||||
|
# self.robot_arm.set_start_state(configuration_name="home")
|
||||||
|
# self.robot_arm.set_goal_state(configuration_name="work")
|
||||||
|
|
||||||
|
self.robot_arm.set_goal_state(
|
||||||
|
pose_stamped_msg=pose_goal,
|
||||||
|
pose_link="link_ee"
|
||||||
|
)
|
||||||
|
self.plan_end_execute()
|
||||||
|
|
||||||
|
|
||||||
|
def plan_end_execute(self):
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
self.get_logger().info("Planning trajectory")
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
|
||||||
|
plan_result = self.robot_arm.plan()
|
||||||
|
if plan_result:
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
self.get_logger().info("Executing plan")
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
robot_trajectory = plan_result.trajectory
|
||||||
|
self.moveit.execute(robot_trajectory, controllers=[])
|
||||||
|
else:
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
self.get_logger().info("Planning failed")
|
||||||
|
self.get_logger().warn("***********************************************************")
|
||||||
|
|
||||||
|
|
||||||
|
def main(args=None):
|
||||||
|
try:
|
||||||
|
rclpy.init(args=args)
|
||||||
|
node = MotionPlaning()
|
||||||
|
rclpy.spin(node=node)
|
||||||
|
node.destroy_node()
|
||||||
|
except (KeyboardInterrupt, ExternalShutdownException):
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
rclpy.shutdown()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -79,6 +79,9 @@ def main(args=None):
|
|||||||
rclpy.spin(node=node)
|
rclpy.spin(node=node)
|
||||||
except (KeyboardInterrupt, ExternalShutdownException):
|
except (KeyboardInterrupt, ExternalShutdownException):
|
||||||
pass
|
pass
|
||||||
|
finally:
|
||||||
|
node.destroy_node()
|
||||||
|
rclpy.shutdown()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user