refactor(rbs_skill_servers): update action configuration, dependencies, and skills
- Removed `assembly_config_service.py` node from launch configuration.
- Added default `goal.duration` setting to `MoveToPose` and `MoveToPoseArray`.
- Replaced `timeout_seconds` with `duration` in action definitions for `MoveitSendJointStates` and `MoveitSendPose`.
- Removed dependencies on TinyXML2 and Gazebo/SDFormat, adding `controller_manager_msgs` and `control_msgs` to CMake configuration.
- Added new action servers `cartesian_move_to_pose` and `move_to_joint_states`, registering them in CMakeLists file.
- Introduced `SkillBase`, a template class for managing action-based skills, providing essential ROS 2 action server support and functionalities for handling goals, cancels, accepted actions, and controller management.
- Implemented methods to load, configure, and switch required controllers with conflict detection for active controllers, along with parameter checking and asynchronous handling for required parameters.
- Enhanced error handling for missing controllers, parameters, and resource conflicts.
- Updated `skills.launch.py` to utilize `ComposableNodeContainer` for skill nodes, incorporating `MoveToJointStateActionServer` and `CartesianMoveToPose` as composable nodes.
- Changed the executable name in `cartesian_move_to_pose_action_server` node configuration.
- Added `cartesian_move_to_pose.cpp`, implementing the `CartesianMoveToPose` action server, including trajectory interpolation, pose adjustment, and controller management.
- Updated `package.xml` to include `rclcpp_components` dependency.
- Refactored `MoveToJointStateActionServer` to extend `SkillBase`, leveraging `FollowJointTrajectory` for joint trajectory execution, while removing redundant code and dependencies.
- Implemented trajectory generation based on initial and target joint positions with parameterized interpolation for smoother execution, enhancing joint state handling to dynamically align current and target joint values.
2024-10-30 17:49:03 +03:00
|
|
|
#include "moveit/move_group_interface/move_group_interface.h"
|
|
|
|
#include "rbs_skill_interfaces/action/moveit_send_pose.hpp"
|
|
|
|
#include "rbs_skill_servers/base_skill.hpp"
|
|
|
|
#include <moveit/robot_trajectory/robot_trajectory.h>
|
|
|
|
#include <moveit/trajectory_processing/time_optimal_trajectory_generation.h>
|
|
|
|
#include <rclcpp/logging.hpp>
|
|
|
|
|
|
|
|
namespace rbs_skill_actions {
|
|
|
|
|
|
|
|
using MoveitSendPose = rbs_skill_interfaces::action::MoveitSendPose;
|
|
|
|
|
|
|
|
class MoveitMtpCart : public SkillBase<MoveitSendPose> {
|
|
|
|
public:
|
|
|
|
explicit MoveitMtpCart(const rclcpp::NodeOptions &options = rclcpp::NodeOptions())
|
|
|
|
: SkillBase("mtp_moveit_cart", options) {}
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::string requiredActionController() override {
|
|
|
|
return "joint_trajectory_controller";
|
|
|
|
}
|
|
|
|
|
|
|
|
void executeAction() override {
|
|
|
|
RCLCPP_INFO(this->get_logger(), "Executing action goal");
|
|
|
|
|
|
|
|
moveit::planning_interface::MoveGroupInterface move_group_interface(
|
|
|
|
this->shared_from_this(), m_current_goal->robot_name);
|
|
|
|
move_group_interface.startStateMonitor();
|
|
|
|
|
|
|
|
moveit::core::RobotState start_state(
|
|
|
|
*move_group_interface.getCurrentState());
|
|
|
|
|
|
|
|
std::vector<geometry_msgs::msg::Pose> waypoints;
|
|
|
|
auto current_pose = move_group_interface.getCurrentPose();
|
|
|
|
geometry_msgs::msg::Pose target_pose = m_current_goal->target_pose;
|
|
|
|
waypoints.push_back(target_pose);
|
|
|
|
|
|
|
|
RCLCPP_INFO(this->get_logger(), "New cartesian target pose [%f, %f, %f]",
|
|
|
|
target_pose.position.x, target_pose.position.y,
|
|
|
|
target_pose.position.z);
|
|
|
|
|
|
|
|
moveit_msgs::msg::RobotTrajectory trajectory;
|
|
|
|
const double jump_threshold = 0.0;
|
|
|
|
const double eef_step = 0.001;
|
|
|
|
double fraction = move_group_interface.computeCartesianPath(
|
|
|
|
waypoints, eef_step, jump_threshold, trajectory);
|
|
|
|
|
|
|
|
robot_trajectory::RobotTrajectory rt(
|
|
|
|
move_group_interface.getCurrentState()->getRobotModel(),
|
|
|
|
m_current_goal->robot_name);
|
|
|
|
|
|
|
|
rt.setRobotTrajectoryMsg(*move_group_interface.getCurrentState(), trajectory);
|
|
|
|
|
|
|
|
trajectory_processing::TimeOptimalTrajectoryGeneration tp;
|
|
|
|
|
|
|
|
bool su = tp.computeTimeStamps(rt);
|
|
|
|
if (!su) {
|
|
|
|
RCLCPP_ERROR(this->get_logger(), "Failed to compute timestamp of trajectory");
|
|
|
|
m_current_goal_handle->abort(m_current_result);
|
|
|
|
}
|
|
|
|
|
|
|
|
rt.getRobotTrajectoryMsg(trajectory);
|
|
|
|
|
|
|
|
moveit::planning_interface::MoveGroupInterface::Plan plan;
|
2024-12-01 16:20:57 +03:00
|
|
|
plan.trajectory = trajectory;
|
refactor(rbs_skill_servers): update action configuration, dependencies, and skills
- Removed `assembly_config_service.py` node from launch configuration.
- Added default `goal.duration` setting to `MoveToPose` and `MoveToPoseArray`.
- Replaced `timeout_seconds` with `duration` in action definitions for `MoveitSendJointStates` and `MoveitSendPose`.
- Removed dependencies on TinyXML2 and Gazebo/SDFormat, adding `controller_manager_msgs` and `control_msgs` to CMake configuration.
- Added new action servers `cartesian_move_to_pose` and `move_to_joint_states`, registering them in CMakeLists file.
- Introduced `SkillBase`, a template class for managing action-based skills, providing essential ROS 2 action server support and functionalities for handling goals, cancels, accepted actions, and controller management.
- Implemented methods to load, configure, and switch required controllers with conflict detection for active controllers, along with parameter checking and asynchronous handling for required parameters.
- Enhanced error handling for missing controllers, parameters, and resource conflicts.
- Updated `skills.launch.py` to utilize `ComposableNodeContainer` for skill nodes, incorporating `MoveToJointStateActionServer` and `CartesianMoveToPose` as composable nodes.
- Changed the executable name in `cartesian_move_to_pose_action_server` node configuration.
- Added `cartesian_move_to_pose.cpp`, implementing the `CartesianMoveToPose` action server, including trajectory interpolation, pose adjustment, and controller management.
- Updated `package.xml` to include `rclcpp_components` dependency.
- Refactored `MoveToJointStateActionServer` to extend `SkillBase`, leveraging `FollowJointTrajectory` for joint trajectory execution, while removing redundant code and dependencies.
- Implemented trajectory generation based on initial and target joint positions with parameterized interpolation for smoother execution, enhancing joint state handling to dynamically align current and target joint values.
2024-10-30 17:49:03 +03:00
|
|
|
|
|
|
|
if (fraction > 0) {
|
|
|
|
RCLCPP_INFO(this->get_logger(), "Planning success");
|
|
|
|
moveit::core::MoveItErrorCode execute_err_code =
|
|
|
|
move_group_interface.execute(plan);
|
|
|
|
if (execute_err_code == moveit::core::MoveItErrorCode::SUCCESS) {
|
|
|
|
m_current_result->success = true;
|
|
|
|
m_current_goal_handle->succeed(m_current_result);
|
|
|
|
RCLCPP_INFO(this->get_logger(), "Successfully executed action goal");
|
|
|
|
} else if (execute_err_code == moveit::core::MoveItErrorCode::FAILURE) {
|
|
|
|
RCLCPP_ERROR(this->get_logger(), "Failure in move:");
|
|
|
|
}
|
|
|
|
|
|
|
|
// move_group_interface.move();
|
|
|
|
} else {
|
|
|
|
RCLCPP_WARN(this->get_logger(), "Failed to generate plan");
|
|
|
|
m_current_goal_handle->abort(m_current_result);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_current_goal_handle->is_canceling()) {
|
|
|
|
m_current_goal_handle->canceled(m_current_result);
|
|
|
|
RCLCPP_ERROR(this->get_logger(), "Action goal canceled");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}; // class MoveToPoseActionServer
|
|
|
|
|
|
|
|
} // namespace rbs_skill_actions
|
|
|
|
|
|
|
|
#include "rclcpp_components/register_node_macro.hpp"
|
|
|
|
RCLCPP_COMPONENTS_REGISTER_NODE(rbs_skill_actions::MoveitMtpCart);
|