base for grasp_interface.cpp is finished
now defining the task
This commit is contained in:
parent
c976f7242a
commit
f4313063e5
@ -28,6 +28,7 @@ find_package(moveit_msgs REQUIRED)
|
|||||||
find_package(std_msgs REQUIRED)
|
find_package(std_msgs REQUIRED)
|
||||||
find_package(geometry_msgs REQUIRED)
|
find_package(geometry_msgs REQUIRED)
|
||||||
find_package(franka_cps_msgs REQUIRED)
|
find_package(franka_cps_msgs REQUIRED)
|
||||||
|
find_package(franka_msgs REQUIRED)
|
||||||
|
|
||||||
find_package(tf2)
|
find_package(tf2)
|
||||||
find_package(tf2_ros)
|
find_package(tf2_ros)
|
||||||
@ -57,6 +58,7 @@ ament_target_dependencies(
|
|||||||
moveit_ros_planning_interface
|
moveit_ros_planning_interface
|
||||||
moveit_task_constructor_core
|
moveit_task_constructor_core
|
||||||
moveit_msgs
|
moveit_msgs
|
||||||
|
franka_msgs
|
||||||
franka_cps_msgs
|
franka_cps_msgs
|
||||||
std_msgs
|
std_msgs
|
||||||
geometry_msgs
|
geometry_msgs
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
<depend>std_msgs</depend>
|
<depend>std_msgs</depend>
|
||||||
<depend>geometry_msgs</depend>
|
<depend>geometry_msgs</depend>
|
||||||
<depend>franka_cps_msgs</depend>
|
<depend>franka_cps_msgs</depend>
|
||||||
|
<depend>franka_msgs</depend>
|
||||||
|
|
||||||
<depend>eigen</depend>
|
<depend>eigen</depend>
|
||||||
|
|
||||||
|
@ -6,13 +6,20 @@
|
|||||||
|
|
||||||
#include <rclcpp/rclcpp.hpp>
|
#include <rclcpp/rclcpp.hpp>
|
||||||
#include <rclcpp_action/rclcpp_action.hpp>
|
#include <rclcpp_action/rclcpp_action.hpp>
|
||||||
|
|
||||||
#include <franka_cps_msgs/action/grasp_sequence.hpp>
|
#include <franka_cps_msgs/action/grasp_sequence.hpp>
|
||||||
|
#include <geometry_msgs/msg/pose.hpp>
|
||||||
|
#include <franka_msgs/action/move.hpp>
|
||||||
|
#include <franka_msgs/action/grasp.hpp>
|
||||||
|
|
||||||
#include <moveit/planning_scene/planning_scene.h>
|
#include <moveit/planning_scene/planning_scene.h>
|
||||||
#include <moveit/planning_scene_interface/planning_scene_interface.h>
|
|
||||||
#include <moveit/task_constructor/task.h>
|
#include <moveit/task_constructor/task.h>
|
||||||
#include <moveit/task_constructor/solvers.h>
|
|
||||||
#include <moveit/task_constructor/stages.h>
|
#include <moveit/task_constructor/stages.h>
|
||||||
|
|
||||||
|
#include <moveit/task_constructor/solvers.h>
|
||||||
|
|
||||||
|
#include "tf2_ros/transform_listener.h"
|
||||||
|
|
||||||
#if __has_include(<tf2_geometry_msgs/tf2_geometry_msgs.hpp>)
|
#if __has_include(<tf2_geometry_msgs/tf2_geometry_msgs.hpp>)
|
||||||
#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
|
#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
|
||||||
#else
|
#else
|
||||||
@ -27,34 +34,194 @@
|
|||||||
static const rclcpp::Logger LOGGER = rclcpp::get_logger("franka_grasp_interface");
|
static const rclcpp::Logger LOGGER = rclcpp::get_logger("franka_grasp_interface");
|
||||||
namespace mtc = moveit::task_constructor;
|
namespace mtc = moveit::task_constructor;
|
||||||
|
|
||||||
class GraspInterfaceNode
|
class GraspInterfaceNode : public rclcpp::Node
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GraspInterfaceNode(const rclcpp::NodeOptions& options);
|
using GraspSequence = franka_cps_msgs::action::GraspSequence;
|
||||||
|
using GoalHandleGraspSequence = rclcpp_action::ServerGoalHandle<GraspSequence>;
|
||||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr getNodeBaseInterface();
|
using FrankaMove = franka_msgs::action::Move;
|
||||||
|
using FrankaGrasp = franka_msgs::action::Grasp;
|
||||||
void doTask();
|
|
||||||
|
GraspInterfaceNode()
|
||||||
void setupPlanningScene();
|
: Node("grasp_interface"), tf_buffer_(this->get_clock()),tf_listener_(tf_buffer_)
|
||||||
|
{
|
||||||
|
// Action server for getting new Grasp Sequences
|
||||||
|
action_server_ = rclcpp_action::create_server<GraspSequence>(
|
||||||
|
this,
|
||||||
|
"franka_grasp_moveit/grasp",
|
||||||
|
std::bind(&GraspInterfaceNode::handle_goal, this, std::placeholders::_1, std::placeholders::_2),
|
||||||
|
std::bind(&GraspInterfaceNode::handle_cancel, this, std::placeholders::_1),
|
||||||
|
std::bind(&GraspInterfaceNode::handle_accepted, this, std::placeholders::_1));
|
||||||
|
|
||||||
|
// Publisher for pose
|
||||||
|
pose_publisher_ = this->create_publisher<geometry_msgs::msg::PoseStamped>("franka_grasp_moveit/current_pose", 10);
|
||||||
|
|
||||||
|
// Service for IK
|
||||||
|
|
||||||
|
|
||||||
|
// TF2
|
||||||
|
tf2_ros::Buffer tf_buffer_(this->get_clock());
|
||||||
|
tf2_ros::TransformListener tf_listener_(tf_buffer_);
|
||||||
|
tf2_timer_ = this->create_wall_timer(std::chrono::milliseconds(200), std::bind(&GraspInterfaceNode::compute_endeffector_pose, this));
|
||||||
|
|
||||||
|
// Setup for move groups
|
||||||
|
static const std::string arm_group_name = "panda_arm";
|
||||||
|
static const std::string hand_group_name = "hand";
|
||||||
|
static const std::string hand_frame = "panda_hand";
|
||||||
|
}
|
||||||
|
|
||||||
rclcpp_action::create_client<franka_cps_msgs::action::GraspSequence>(this, "grasp_interface/grasp");
|
|
||||||
private:
|
private:
|
||||||
mtc::Task createTask();
|
rclcpp_action::Server<GraspSequence>::SharedPtr action_server_;
|
||||||
mtc::Task task_;
|
rclcpp::Publisher<geometry_msgs::msg::PoseStamped>::SharedPtr pose_publisher_;
|
||||||
rclcpp::Node::SharedPtr node_;
|
tf2_ros::Buffer tf_buffer_;
|
||||||
}
|
tf2_ros::TransformListener tf_listener_;
|
||||||
|
rclcpp::TimerBase::SharedPtr tf2_timer_;
|
||||||
|
|
||||||
|
void compute_endeffector_pose()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
geometry_msgs::msg::TransformStamped transform_stamped;
|
||||||
|
transform_stamped = tf_buffer_.lookupTransform("panda_link1", "panda_link7", rclcpp::Time(0));
|
||||||
|
|
||||||
|
geometry_msgs::msg::PoseStamped current_pose;
|
||||||
|
current_pose.header.frame_id = "panda_link8";
|
||||||
|
current_pose.header.stamp = transform_stamped.header.stamp;
|
||||||
|
//Position
|
||||||
|
current_pose.pose.position.x = transform_stamped.transform.translation.x;
|
||||||
|
current_pose.pose.position.y = transform_stamped.transform.translation.y;
|
||||||
|
current_pose.pose.position.z = transform_stamped.transform.translation.z;
|
||||||
|
// Orientation
|
||||||
|
current_pose.pose.orientation.x = transform_stamped.transform.rotation.x;
|
||||||
|
current_pose.pose.orientation.y = transform_stamped.transform.rotation.y;
|
||||||
|
current_pose.pose.orientation.z = transform_stamped.transform.rotation.z;
|
||||||
|
current_pose.pose.orientation.w = transform_stamped.transform.rotation.w;
|
||||||
|
pose_publisher_->publish(current_pose);
|
||||||
|
}
|
||||||
|
catch (tf2::TransformException &ex)
|
||||||
|
{
|
||||||
|
RCLCPP_WARN(this->get_logger(), "%s", ex.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GrapsInterfaceNode::GrapsInterfaceNode(const rclccp::NodeOptions& options)
|
rclcpp_action::GoalResponse handle_goal(
|
||||||
: node_{ std::make_shared<rclcpp::Node>("grasp_interface_node", options)}
|
const rclcpp_action::GoalUUID & uuid,
|
||||||
{
|
std::shared_ptr<const GraspSequence::Goal> goal)
|
||||||
}
|
{
|
||||||
|
RCLCPP_INFO(this->get_logger(), "Received goal request!");
|
||||||
|
(void)uuid;
|
||||||
|
return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rclcpp_action::CancelResponse handle_cancel(const std::shared_ptr<GoalHandleGraspSequence> goal_handle)
|
||||||
|
{
|
||||||
|
RCLCPP_INFO(this->get_logger(), "Received request to cancel goal");
|
||||||
|
(void)goal_handle;
|
||||||
|
return rclcpp_action::CancelResponse::ACCEPT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_accepted(const std::shared_ptr<GoalHandleGraspSequence> goal_handle)
|
||||||
|
{
|
||||||
|
// This needs to run in a separate thread to avoid blocking the executor
|
||||||
|
std::thread([this, goal_handle]() {
|
||||||
|
const auto goal = goal_handle->get_goal();
|
||||||
|
auto result = std::make_shared<GraspSequence::Result>();
|
||||||
|
|
||||||
|
// Generate and execute the task
|
||||||
|
try {
|
||||||
|
auto task = createTask(*goal);
|
||||||
|
auto success = executeTask(task);
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
result->result_msg = "Execution successful";
|
||||||
|
result->error_code = 0; // Success code
|
||||||
|
goal_handle->succeed(result);
|
||||||
|
} else {
|
||||||
|
result->result_msg = "Execution failed";
|
||||||
|
result->error_code = 1; // Generic failure code
|
||||||
|
goal_handle->abort(result);
|
||||||
|
}
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "Execution exception: %s", e.what());
|
||||||
|
result->result_msg = std::string("Execution exception: ") + e.what();
|
||||||
|
result->error_code = 2; // Exception code
|
||||||
|
goal_handle->abort(result);
|
||||||
|
}
|
||||||
|
}).detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generating a task
|
||||||
|
auto createTask(const GraspSequence::Goal& goal) -> moveit::task_constructor::Task {
|
||||||
|
moveit::task_constructor::Task task;
|
||||||
|
task.stages()->setName("Grasp Task");
|
||||||
|
task.loadRobotModel(this->shared_from_this());
|
||||||
|
|
||||||
|
// set Planners
|
||||||
|
auto interpolation_planner = std::make_shared<mtc::solvers::JointInterpolationPlanner>();
|
||||||
|
|
||||||
|
std::vector<double> joint_positions;
|
||||||
|
/*
|
||||||
|
// Compute IK for each pose and create corresponding stages
|
||||||
|
if (computeIK(goal->hover, joint_positions)) {
|
||||||
|
// Create and add MoveTo stage using computed joint positions
|
||||||
|
auto move_to_hover = std::make_unique<mtc::stages::MoveTo>("Move to Hover", interpolation_planner);
|
||||||
|
move_to_hover->setGroup(arm_group_name); // set group
|
||||||
|
move_to_hover->setGoal(joint_positions); // set goal
|
||||||
|
task.add(std::move(move_to_hover)); // add Task
|
||||||
|
} else {
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "Failed to compute IK for hover pose");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (computeIK(goal->grasp, joint_positions)) {
|
||||||
|
auto move_to_hover = std::make_unique<mtc::stages::MoveTo>("Move to Hover", interpolation_planner);
|
||||||
|
move_to_hover->setGroup(arm_group_name); // set group
|
||||||
|
move_to_hover->setGoal(joint_positions); // set goal
|
||||||
|
task.add(std::move(move_to_hover)); // add Task
|
||||||
|
} else {
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "Failed to compute IK for hover pose");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (computeIK(goal->hover, joint_positions)) {
|
||||||
|
// Create and add MoveTo stage using computed joint positions
|
||||||
|
auto move_to_hover2 = std::make_unique<mtc::stages::MoveTo>("Move to Hover", interpolation_planner);
|
||||||
|
move_to_hover2->setGroup(arm_group_name); // set group
|
||||||
|
move_to_hover2->setGoal(joint_positions); // set goal
|
||||||
|
task.add(std::move(move_to_hover2)); // add Task
|
||||||
|
} else {
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "Failed to compute IK for hover pose");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (computeIK(goal->drop, joint_positions)) {
|
||||||
|
// Create and add MoveTo stage using computed joint positions
|
||||||
|
auto move_to_drop = std::make_unique<mtc::stages::MoveTo>("Move to drop", interpolation_planner);
|
||||||
|
move_to_drop->setGroup(arm_group_name); // set group
|
||||||
|
move_to_drop->setGoal(joint_positions); // set goal
|
||||||
|
task.add(std::move(move_to_drop)); // add Task
|
||||||
|
} else {
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "Failed to compute IK for drop pose");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (computeIK(goal->idle, joint_positions)) {
|
||||||
|
// Create and add MoveTo stage using computed joint positions
|
||||||
|
auto move_to_idle = std::make_unique<mtc::stages::MoveTo>("Move to idle", interpolation_planner);
|
||||||
|
move_to_idle->setGroup(arm_group_name); // set group
|
||||||
|
move_to_idle->setGoal(joint_positions); // set goal
|
||||||
|
task.add(std::move(move_to_idle)); // add Task
|
||||||
|
} else {
|
||||||
|
RCLCPP_ERROR(this->get_logger(), "Failed to compute IK for idle pose");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool executeTask(moveit::task_constructor::Task& task) {
|
||||||
|
// Logic to execute the given task
|
||||||
|
// Return true if successful, false otherwise
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr GraspInterfaceNode::getNodeBaseInterface()
|
|
||||||
{
|
|
||||||
return node_->get_node_base_interface();
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user