#include <ros/ros.h>
// MoveIt!
#include <moveit/robot_model_loader/robot_model_loader.h>
#include <moveit/robot_model/robot_model.h>
#include <moveit/robot_state/robot_state.h>
#include <moveit/robot_state/joint_state_group.h>
// Robot state publishing
#include <moveit/robot_state/conversions.h>
#include <moveit_msgs/DisplayRobotState.h>
// Kinematics
#include <moveit_msgs/GetPositionIK.h>
int main(int argc, char **argv)
{
ros::init (argc, argv, "right_arm_kinematics");
ros::AsyncSpinner spinner(1);
spinner.start();
ros::NodeHandle node_handle;
// Start a service client
ros::ServiceClient service_client = node_handle.serviceClient<moveit_msgs::GetPositionIK> ("compute_ik");
ros::Publisher robot_state_publisher = node_handle.advertise<moveit_msgs::DisplayRobotState>( "tutorial_robot_state", 1 );
robot_model_loader::RobotModelLoader robot_model_loader("robot_description");
robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();
robot_state::RobotStatePtr kinematic_state(new robot_state::RobotState(kinematic_model));
robot_state::JointStateGroup* joint_state_group = kinematic_state->getJointStateGroup("manipulator");
while(!service_client.exists())
{
ROS_INFO("Waiting for service");
sleep(1.0);
}
moveit_msgs::GetPositionIK::Request service_request;
moveit_msgs::GetPositionIK::Response service_response;
service_request.ik_request.group_name = "manipulator";
service_request.ik_request.pose_stamped.header.frame_id = "torso_roll_link";
service_request.ik_request.pose_stamped.pose.position.x = 0.0228744447231;
service_request.ik_request.pose_stamped.pose.position.y = -0.498571574688;
service_request.ik_request.pose_stamped.pose.position.z = -0.898984670639;
service_request.ik_request.avoid_collisions = true;
/* Call the service */
service_client.call(service_request, service_response);
ROS_INFO_STREAM("Result: " << ((service_response.error_code.val == service_response.error_code.SUCCESS) ? "True " : "False ") << service_response.error_code.val);
/* Filling in a seed state */
/* Visualize the result*/
moveit_msgs::DisplayRobotState msg;
joint_state_group->setVariableValues(service_response.solution.joint_state);
robot_state::robotStateToRobotStateMsg(*kinematic_state, msg.state);
robot_state_publisher.publish(msg);
//Sleep to let the message go through
ros::Duration(2.0).sleep();
ros::shutdown();
return 0;
}