Example #1
0
void Listener::ros_comms_init() {
	ros::NodeHandle n;
	image_transport::ImageTransport it_(n);
	image_sub_ = it_.subscribe("/openni2_camera/rgb/image_raw", 1,
	      &Listener::chatterCallback, this);
	//chatter_subscriber = n.subscribe("chatter", 1000, &Listener::chatterCallback, this);
}
    Node ()
       // initialization list copy the arguments to the class attributes.
      {
       
       imageOut_.init(480,640);
       lastHeaderSeq_ = 1;

       image_transport::ImageTransport it_(nh_);

         //pub_ = it_.advertise("out", 1);
       sub_ = it_.subscribe("vrep/Vision_sensorIT", 1, &Node::subscriberCb,this);

        // create subscriber, publisher using nh_.
      }
Example #3
0
int main(int argc, char** argv)
{
  ros::init(argc, argv, "edp2_c4"); 

  ros::NodeHandle nh_;
  
  image_transport::ImageTransport it_(nh_);

  image_transport::Subscriber image_sub_;

  image_sub_ = it_.subscribe("/camera/rgb/image_color", 1, imageCb); //subscribes to the Kinect video frames

  ros::spin();
  return 0;
}
    Node (ros::NodeHandle& nh, ros::NodeHandle& nhPrivate) :
      nh_(*nh),
      nhPrivate_(*nhPrivate)
             // initialization list copy the arguments to the class attributes.
      {
        //nh_ = nh;
        //nhPrivate_=nhPrivate;
        //it_ = *it; 
        it_(nh_);

        imageOut_.init(480,640);
        lastHeaderSeq_ = 1;

         //pub_ = it_.advertise("out", 1);
         sub_ = it_.subscribe("vrep/Vision_sensorIT", 1, &Node::subscriberCb,this);

        // create subscriber, publisher using nh_.
      }
int main(int argc, char **argv)
{	
	// unit test for extractPose() and createHomogeneousTransformMatrix()
	//~ tf::StampedTransform t;
	//~ tf::Vector3 origin(2, 3, 4);
	//~ tf::Quaternion quaternion(0, 1, 0, 1);
	//~ t.setOrigin(origin);
	//~ t.setRotation(quaternion);
	//~ geometry_msgs::Pose p = convertToPose(t);
	//~ ROS_INFO_STREAM("pose:\n" << p);
	//~ Eigen::Matrix4d T = createHomogeneousTransformMatrix(t);
	//~ ROS_INFO_STREAM("homogeneous transformation matrix:\n" << T);
	//~ return 1;

	ros::init(argc, argv, "insertion");
	ros::NodeHandle node("~");

	ros::AsyncSpinner spinner(1);
	spinner.start();
	/*
	ros::Publisher pub = node.advertise<baxter_core_msgs::JointCommand>("/robot/limb/right/joint_command", 10);

	ros::Subscriber sub = node.subscribe("/usb_pose", 10, usbCallback);
	ros::Rate rate(1.0);

	ros::Publisher gripper_pub = node.advertise<baxter_core_msgs::EndEffectorCommand>("/robot/end_effector/right_gripper/command", 10);
	 */



	// create OpenCV window
	cv::namedWindow(OPENCV_WINDOW);
	cv::namedWindow(OPENCV_WINDOW_K, CV_GUI_NORMAL);

	node.param<std::string>("camera_topic", camera_topic, "/cameras/right_hand_camera/image");

	ROS_INFO("Listening to: %s", camera_topic.c_str());
	// subscribe to the camera topic
	image_transport::ImageTransport it_(node);
	image_transport::Subscriber image_sub_ = it_.subscribe(camera_topic, 1, 
			imageCallback);

	// move arm top in front of wires

	// once arm is in position, ready to detect blobs
	readyToFindWire = true;


	/*
	// create messages to control the gripper
	baxter_core_msgs::EndEffectorCommand ee_msg_close;
	ee_msg_close.id = 65664;
	ee_msg_close.command = "grip";
	ee_msg_close.args = "{}";

	baxter_core_msgs::EndEffectorCommand ee_msg_open;
	ee_msg_open.id = 65664;
	ee_msg_open.command = "release";
	ee_msg_open.args = "{}";

	move_group_interface::MoveGroup group("right_arm");
	move_group_interface::MoveGroup group1("right_arm");
	move_group_interface::MoveGroup group2("right_arm");
	move_group_interface::MoveGroup group3("right_arm");
	move_group_interface::MoveGroup group4("right_arm");
	move_group_interface::MoveGroup group5("right_arm");
	move_group_interface::MoveGroup group6("right_arm");
	move_group_interface::MoveGroup group7("right_arm");

	// get current pose and joints
	geometry_msgs::PoseStamped curr_pose = group.getCurrentPose();
	ROS_INFO_STREAM("current end effector pose: "<<curr_pose);
	std::vector<double> joint_values = group.getCurrentJointValues();
	std::vector<std::string> joint_names = group.getJoints();
	for (int i = 0; i < joint_values.size(); i++)
		std::cout<<joint_names[i]<<": "<<joint_values.at(i)<<std::endl;

	// setup IK solver
	ros::ServiceClient service_client = node.serviceClient<moveit_msgs::GetPositionIK>("/compute_ik");
	while(!service_client.exists())
	{
		ROS_INFO("Waiting for service");
		sleep(1.0);
	}
	moveit_msgs::GetPositionIK::Request service_request;
	moveit_msgs::GetPositionIK::Response service_response; 

	ROS_INFO_STREAM("Press Enter when ready ");
	char c = std::cin.get();

	curr_pose = group.getCurrentPose();
	ROS_INFO_STREAM("current end effector pose: "<<curr_pose);

	// hardcode fixed target poses
	geometry_msgs::PoseStamped p1, p2, p3, p4, p5, p6, p7, p8, p9;
	p1.header = createHeader(ros::Time(0), "/base");
	p1.pose.position = createPoint(0.76, -0.445, -0.02);
	p1.pose.orientation = createQuaternion(0,0.707,0,0.707);
	p2.header = createHeader(ros::Time(0), "/base");
	p2.pose.position = createPoint(0.815, -0.445, -0.025);
	p2.pose.orientation = createQuaternion(0,0.707,0,0.707);
	p3.header = createHeader(ros::Time(0), "/base");
	p3.pose.position = createPoint(0.80, -0.445, -0.025);
	p3.pose.orientation = createQuaternion(0,0.707,0,0.707);
	p4.header = createHeader(ros::Time(0), "/base");
	p4.pose.position = createPoint(0.83, -0.445, -0.025);
	p4.pose.orientation = createQuaternion(0,0.707,0,0.707);
	p5.header = createHeader(ros::Time(0), "/base");
	p5.pose.position = createPoint(0.835, -0.445, -0.025);
	p5.pose.orientation = createQuaternion(0,0.707,0,0.707);
	p6.header = createHeader(ros::Time(0), "/base");
	p6.pose.position = createPoint(0.815, -0.445, -0.095);
	p6.pose.orientation = createQuaternion(0,0.707,0,0.707);
	p7.header = createHeader(ros::Time(0), "/base");
	p7.pose.position = createPoint(0.815, -0.445, -0.115);
	p7.pose.orientation = createQuaternion(0,0.707,0,0.707);
	p8.header = createHeader(ros::Time(0), "/base");
	p8.pose.position = createPoint(0.819, -0.445, -0.115);
	p8.pose.orientation = createQuaternion(0,0.707,0,0.707);
	p9.header = createHeader(ros::Time(0), "/base");
	p9.pose.position = createPoint(0.811, -0.445, -0.115);
	p9.pose.orientation = createQuaternion(0,0.707,0,0.707);
	std::vector<geometry_msgs::PoseStamped> waypoints;
	waypoints.push_back(p1);
	waypoints.push_back(p2);
	waypoints.push_back(p3);
	waypoints.push_back(p4);
	waypoints.push_back(p5);
	waypoints.push_back(p6);
	waypoints.push_back(p7);
	waypoints.push_back(p8);

	// ---------------------------------------------------------
	// hardcode nominal joint configuration
	std::vector<double> joint_values_nominal = group.getCurrentJointValues();
	std::vector<double> joint_values_pregrasp = group.getCurrentJointValues();

	// These values are for the USB-Monitor alignment
	joint_values_nominal[0] = 1.04963;
	joint_values_nominal[1] = -0.865932;
	joint_values_nominal[2] = -0.0613592;
	joint_values_nominal[3] = 2.2864;
	joint_values_nominal[4] = 1.055;
	joint_values_nominal[5] = 0.00076699;
	joint_values_nominal[6] = -0.885107;
	//~ joint_values_nominal[0] = 0.627015;
	//~ joint_values_nominal[1] = -0.575626;
	//~ joint_values_nominal[2] = 0.883189;
	//~ joint_values_nominal[3] = 1.50982;
	//~ joint_values_nominal[4] = -0.854044;
	//~ joint_values_nominal[5] = 0.967942;
	//~ joint_values_nominal[6] = 2.38419;

	// joint values for pregrasp of USB
	//~ joint_values_pregrasp[0] = 0.0318301;
	//~ joint_values_pregrasp[1] = 0.0644272;
	//~ joint_values_pregrasp[2] = 0.37851;
	//~ joint_values_pregrasp[3] = 1.42468;
	//~ joint_values_pregrasp[4] = -0.790767;
	//~ joint_values_pregrasp[5] = -1.24828;
	//~ joint_values_pregrasp[6] = -0.179859;
	joint_values_pregrasp[0] = 0.530374;
	joint_values_pregrasp[1] = -0.368539;
	joint_values_pregrasp[2] = 0.214374;
	joint_values_pregrasp[3] = 2.24345;
	joint_values_pregrasp[4] = 0.274583;
	joint_values_pregrasp[5] = -1.43005;
	joint_values_pregrasp[6] = -0.158767;

	MoveGroupPlan plan;
	//~ // ---------------------------------------------------------
	//~ // Move to nominal configuration
	//~ joint_values = group.getCurrentJointValues();
	//~ ROS_INFO_STREAM("Press Enter to move to nominal configuration");
	//~ c = std::cin.get();
	//~ plan = createPlan(joint_values, joint_values_nominal, 10, 1, joint_names);
	//~ if (c == '\n')
	//~ {
		//~ plan = planStampNow(plan);
		//~ group.execute(plan);
	//~ }
	//~ ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());

	// ---------------------------------------------------------
	// Move to pre-grasp configuration
	joint_values = group.getCurrentJointValues();
	ROS_INFO_STREAM("Press Enter to move to pregrasp configuration");
	c = std::cin.get();
	plan = createPlan(joint_values, joint_values_pregrasp, 10, 1, joint_names);
	if (c == '\n')
	{
		plan = planStampNow(plan);
		group1.execute(plan);
	}
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());

	std::vector<double> target_joint_values(joint_names.size());
	sensor_msgs::JointState joint_state;

	//~ // solve IK for each waypoint in list
	int service_error;
	std::vector<sensor_msgs::JointState> waypoints_joint;
	service_request.ik_request.group_name = "right_arm";
	for (int i=0; i<waypoints.size(); i++)
	{
		service_request.ik_request.pose_stamped = waypoints[i];
		service_client.call(service_request, service_response);
		ROS_INFO_STREAM("waypoints["<<0<<"]: \n"<<waypoints[i]);
		service_error = service_response.error_code.val;
		ROS_INFO_STREAM("IK solver error code: " << service_error);
		if (service_error == service_response.error_code.FAILURE)
		{
			ROS_INFO_STREAM("Exiting ...");
			return 1;
		}
		waypoints_joint.push_back(service_response.solution.joint_state);
	}

	// ---------------------------------------------------------
	// Move to waypoint 1
	joint_values = group1.getCurrentJointValues();
	joint_state = waypoints_joint[0];
	target_joint_values = extractRightArmJointValues(joint_state);
	ROS_INFO_STREAM("Press Enter to move to target #"<<1);
	c = std::cin.get();
	if (c == '\n')
	{
		move(pub, group1, target_joint_values, joint_names,0.08,0.01);
	}
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());

	// ---------------------------------------------------------
	// Move to waypoint 2
	joint_values = group2.getCurrentJointValues();
	joint_state = waypoints_joint[1];
	target_joint_values = extractRightArmJointValues(joint_state);
	ROS_INFO_STREAM("Moving to target #"<<2);
	move(pub, group2, target_joint_values, joint_names,0.08,0.002);
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());


	// ---------------------------------------------------------
	// Iteratively close gripper until we find the USB
	move_group_interface::MoveGroup * grouptemp;
	//~ move_group_interface::MoveGroup grouptemp("right_arm");
	for (int usbiter = 0; usbiter<4; usbiter++)
	{
		for (int usbiter2 = 0; usbiter2<2; usbiter2++)
		{
			grouptemp = new move_group_interface::MoveGroup("right_arm");
			joint_values = grouptemp->getCurrentJointValues();
			joint_state = waypoints_joint[1+usbiter2];
			target_joint_values = extractRightArmJointValues(joint_state);
			ROS_INFO_STREAM("Moving to target #"<<2+usbiter2);
			move(pub, *grouptemp, target_joint_values, joint_names,0.08,0.002);

			ROS_INFO_STREAM("Press Enter to close gripper"<<0);
			c = std::cin.get();
			usbFound = 0; // zero out flag
			if (c == '\n')
			{
				gripper_pub.publish(ee_msg_close);
			}

			usleep(4000000); // sleep 1 sec
			ROS_INFO_STREAM("hi 1");
			//~ delete grouptemp;
			ROS_INFO_STREAM("hi 2");


			if (usbFound > 0) {
			ROS_INFO_STREAM("hi 3");
				usbiter = 10; // cause outer loop to break
				break;
			}

			gripper_pub.publish(ee_msg_open);
		}

	}

	ROS_INFO_STREAM("hi 4");

	//~ ROS_INFO_STREAM("Close gripper. Press Enter when done"<<0);
	//~ c = std::cin.get();

	//~ std::vector<double> joint_values_preinsert = group.getCurrentJointValues();
	//~ joint_values_preinsert[0] = 0.737845;
	//~ joint_values_preinsert[1] = 0.0682621;
	//~ joint_values_preinsert[2] = 0.266913;
	//~ joint_values_preinsert[3] = 1.54012;
	//~ joint_values_preinsert[4] = -1.66552;
	//~ joint_values_preinsert[5] = -1.28624;
	//~ joint_values_preinsert[6] = -0.0705631;
//~ 
	//~ // ---------------------------------------------------------
	//~ // Move to pre-insert configuration
	//~ joint_values = group.getCurrentJointValues();
	//~ ROS_INFO_STREAM("Press Enter to move to pregrasp configuration");
	//~ c = std::cin.get();
	//~ plan = createPlan(joint_values, joint_values_preinsert, 10, 1, joint_names);
	//~ if (c == '\n')
	//~ {
		//~ plan = planStampNow(plan);
		//~ group.execute(plan);
	//~ }
	//~ ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());
	//~ 
	//~ 

	// ---------------------------------------------------------
	// Move to waypoint 5
	joint_values = group3.getCurrentJointValues();
	joint_state = waypoints_joint[4];
	target_joint_values = extractRightArmJointValues(joint_state);
	ROS_INFO_STREAM("Press Enter to move to target #"<<5);
	c = std::cin.get();
	//~ plan = createPlan(joint_values, target_joint_values, 5, 1, joint_names);
	if (c == '\n')
	{
		move(pub, group3, target_joint_values, joint_names,0.08,0.01);
	}
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());

	// ---------------------------------------------------------
	// Move to waypoint 6
	joint_values = group4.getCurrentJointValues();
	joint_state = waypoints_joint[5];
	target_joint_values = extractRightArmJointValues(joint_state);
	ROS_INFO_STREAM("Press Enter to move to target #"<<6);
	c = std::cin.get();
	if (c == '\n')
	{
		move(pub, group4, target_joint_values, joint_names,0.04,0.004);
	}
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());

	printf("usbFound: %d\n", usbFound);
	printf("usbPose: %f, %f, %f\n", usbPose.position.x, usbPose.position.y, usbPose.position.z);

	// These are the delta motions to send to the gripper
	//~ double deltaz = -0.001*(usbPose.position.x - 90)/22;
	//~ double deltax = 0.001*(usbPose.position.y + 78)/22;
	double deltaz = -0.001*(usbPose.position.x - 90)/18;
	double deltax = 0.001*(usbPose.position.y + 78)/18;
	deltax -= 0.001*(usbPose.orientation.w+1)*0.55;
	ROS_INFO_STREAM("Gripper offset from sensor: "<<deltax<<", "<<deltaz);

	waypoints[6].pose.position.x = waypoints[6].pose.position.x + deltax;
	waypoints[6].pose.position.z = waypoints[6].pose.position.z + deltaz;

	// solve IK for each waypoint in list
	waypoints_joint.clear();
	service_request.ik_request.group_name = "right_arm";
	for (int i=0; i<waypoints.size(); i++)
	{
		service_request.ik_request.pose_stamped = waypoints[i];
		service_client.call(service_request, service_response);
		ROS_INFO_STREAM("waypoints["<<0<<"]: \n"<<waypoints[i]);
		service_error = service_response.error_code.val;
		ROS_INFO_STREAM("IK solver error code: " << service_error);
		if (service_error == service_response.error_code.FAILURE)
		{
			ROS_INFO_STREAM("Exiting ...");
			return 1;
		}
		waypoints_joint.push_back(service_response.solution.joint_state);
	}

	// ---------------------------------------------------------
	// Move to waypoint 7
	joint_values = group.getCurrentJointValues();
	joint_state = waypoints_joint[6];
	target_joint_values = extractRightArmJointValues(joint_state);
	ROS_INFO_STREAM("Press Enter to move to target #"<<7);
	c = std::cin.get();
	if (c == '\n')
	{
		move(pub, group5, target_joint_values, joint_names,0.02,0.002);
	}
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());

	// ---------------------------------------------------------
	// Move to waypoint 8
	joint_values = group.getCurrentJointValues();
	joint_state = waypoints_joint[7];
	target_joint_values = extractRightArmJointValues(joint_state);
	ROS_INFO_STREAM("Press Enter to move to target #"<<8);
	move(pub, group5, target_joint_values, joint_names,0.02,0.004);
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());

	// ---------------------------------------------------------
	// Move to waypoint 9
	joint_values = group.getCurrentJointValues();
	joint_state = waypoints_joint[8];
	target_joint_values = extractRightArmJointValues(joint_state);
	ROS_INFO_STREAM("Press Enter to move to target #"<<9);
	move(pub, group6, target_joint_values, joint_names,0.02,0.004);
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());

	// ---------------------------------------------------------
	// Move to waypoint 7
	joint_values = group.getCurrentJointValues();
	joint_state = waypoints_joint[6];
	target_joint_values = extractRightArmJointValues(joint_state);
	ROS_INFO_STREAM("Press Enter to move to target #"<<7);
	move(pub, group7, target_joint_values, joint_names,0.02,0.004);
	ROS_INFO_STREAM("current end-effector pose: "<<group.getCurrentPose());


	ROS_INFO_STREAM("press any key to terminate");
	c = std::cin.get();

	 */
	// destroy cv window
	ROS_INFO_STREAM("press any key to terminate");
	std::cin.get();

	cv::destroyWindow(OPENCV_WINDOW);
	cv::destroyWindow(OPENCV_WINDOW_K);

	ros::shutdown();
	return 0;	
}