//! Sends the command to start a given trajectory
 void startTrajectory(pr2_controllers_msgs::JointTrajectoryGoal goal)
 {
   
   // When to start the trajectory: 1s from now
   goal.trajectory.header.stamp = ros::Time::now() + ros::Duration(1.0);
   sendGoal(traj_client_, goal, nh);
 }
bool Cornering()
{
		goal_y += _row_width_;
		goal_x = x;
		goal_w += PI;
		sendGoal(goal_x, goal_y ,goal_w);
		while (!Begin_Row());
		return true;
}
bool Next_Goal()
{
	if (sin(w)>0){
		goal_x = _field_length_;
		}
	if (sin(w)<0){
		goal_x = 0;
		}
	sendGoal(goal_x, goal_y ,goal_w);
	return true;
}
int main(int argc, char** argv){
  ros::init(argc, argv, "slam_navigation");
  ros::NodeHandle nh;
  ros::NodeHandle nh1("~"); 				//subscribing to a private parameter server
  ros::Subscriber sub = nh.subscribe("odom", 1, &odomMsgs);				//subscribed to odometry msg
  ros::Subscriber local_costmap = nh.subscribe("/move_base/local_costmap/costmap",1,&costmap_grid);
 
  nh1.param("free_cells_", _free_cells_,80);
  nh1.param("field_length", _field_length_, 13);
  nh1.param("row_width", _row_width_, 0.75);
  nh1.param("number_of_rows", _num_rows_, 20);

  //tell the action client that we want to spin a thread by default
  //MoveBaseClient ac("move_base", true);
  
  ros::Rate loop_rate(10);

  //wait for the action server to come up
    
	
	sendGoal(_field_length_, 0 ,0);			//sending robot to its first goal
	ros::Time current_time, last_time;

  while (ros::ok()) {
		
		current_time = ros::Time::now();
		while(!End_Row());
	   
	  
	 	 dt = (current_time-last_time).toSec();
	  	last_time = current_time;
	  	
	  	loop_rate.sleep();
	  	ros::spinOnce();
     
  }
}
Exemple #5
0
int main(int argc, char **argv){

        ros::init(argc, argv, "automap");
        ros::NodeHandle nh;

        // create dynamic reconfigure object
        dynamic_reconfigure::Server<automap::ExplorationConfig> server;
        dynamic_reconfigure::Server<automap::ExplorationConfig>::CallbackType f;
        automap::ExplorationConfig dynConfig;

        ros::Time initTime = ros::Time::now();

        nav_msgs::MapMetaData mapMetaData;
        cv::Mat map;
        simulation::telemetry_msg telemetry;
        sensor_msgs::ImagePtr edgeImageMsg;

        MoveBaseClient ac("move_base", true);
        while(!ac.waitForServer(ros::Duration(5.0)) && ros::ok())
        {
                ROS_INFO("Waiting for the move_base action server to come up...");
        }
        //control_On : motion control on/off / detection_On : sensing on/off /  NBV_On : nbv on/off
        automap::automap_ctrl_msg ctrlSignals;

        tf::TransformListener listener;
        geometry_msgs::Pose position;
        std::vector<double> rpy(3, 0.0);
        cv::Point gridPose;

        ros::Subscriber mapMetaSub = nh.subscribe<nav_msgs::MapMetaData>("map_metadata", 10, boost::bind(mapMetaCallback, _1, &mapMetaData));
        ros::Subscriber ctrlSub = nh.subscribe<automap::automap_ctrl_msg>("automap/ctrl_msg", 10, boost::bind(ctrlCallback, _1, &ctrlSignals));
        ros::Subscriber mapSub = nh.subscribe<nav_msgs::OccupancyGrid>("map", 10, boost::bind(mapCallback, _1, &map));
        ros::Publisher pathPub = nh.advertise<nav_msgs::Path>("pathtransformPlanner/path", 10);
        ros::Subscriber robotInfo = nh.subscribe<simulation::telemetry_msg>("telemetry", 10, boost::bind(telemetryCallback, _1, &telemetry));

        image_transport::ImageTransport it(nh);
        image_transport::Publisher edgePub = it.advertise("floatingEdges", 1);

        //wait for map - server
        ros::Duration d = ros::Duration(2, 0);
        ros::spinOnce();
        while(mapMetaData.resolution == 0 && ros::ok()) {
                ROS_INFO("Waiting for the map server to come up...");
                d.sleep();
                ros::spinOnce();
        }
        while(map.cols==0 && map.rows==0 && ros::ok()) {
                ROS_INFO("Waiting for the map server to come up...");
                d.sleep();
                ros::spinOnce();
        }

        PathtransformPlanner pPlanner(mapMetaData);
        ExplorationPlanner ePlanner(&pPlanner);

        // Begin: exploration metrics
        // array for drawing the robots path
        std::vector<cv::Point> explorationPath;
        // average planner time
        ros::Time planner_timer;
        double t_planner = 0;
        unsigned int t_planner_counter = 0;
        // average ex-planner time
        ros::Time explanner_timer;
        double t_explanner = 0;
        unsigned int t_explanner_counter = 0;
        // average busy loop time
        ros::Time loop_timer;
        double t_loop = 0;
        unsigned int t_loop_counter = 0;

        double timediff = 0;

        f = boost::bind(&configCallback, _1, _2, &pPlanner, &ePlanner, &dynConfig);
        server.setCallback(f);

        ctrlSignals.control_On=dynConfig.node_control_on;
        ctrlSignals.detection_On=dynConfig.node_sensing_on;
        ctrlSignals.NBV_On=dynConfig.node_use_nbv;

        bool finished = false;
        bool finalCheck = false;
        int retry = dynConfig.node_retries;
        cv::Mat old = cv::Mat::zeros(map.rows, map.cols, CV_8UC1);
        // Loop starts here:
        ros::Rate loop_rate(dynConfig.node_loop_rate);
        while(ros::ok() && !finished) {
                //start measure processing time
                loop_timer = ros::Time::now();

                //calculate information gain
                double gain = cv::norm(old, map, CV_L2);
                //Get Position Information...
                getPositionInfo("map", "base_footprint", listener, &position, &rpy);
                setGridPosition(position, mapMetaData, &gridPose);
                //Remember path
                explorationPath.push_back(gridPose);

                if(gain>dynConfig.node_information_gain || retry==0) {
                        ROS_INFO("Enough information gained: %lf",gain);
                        old = map.clone();
                        retry = dynConfig.node_retries;

                        //Feed pathtransformPlanner...
                        try{
                                ROS_INFO("Feeding PathtransformPlanner...");
                                //start measure processing time
                                planner_timer = ros::Time::now();
                                pPlanner.updateTransformMatrices(map, gridPose);
                                //stop measure processing time
                                timediff = (ros::Time::now()-planner_timer).toNSec()/NSEC_PER_SEC;
                                t_planner += timediff;
                                t_planner_counter++;
                                ROS_INFO("Path planning took: %lf",timediff);

                        }catch(std::exception& e) {
                                std::cout<<e.what()<<std::endl;
                        }
                        bool w = false;

                        if(ctrlSignals.detection_On) {
                                //start measure processing time
                                explanner_timer = ros::Time::now();
                                w = ePlanner.findBestPlan(map, gridPose, rpy[2], ctrlSignals.NBV_On);
                                //stop measure processing time
                                timediff = (ros::Time::now()-explanner_timer).toNSec()/NSEC_PER_SEC;
                                t_explanner += timediff;
                                t_explanner_counter++;
                                ROS_INFO("Exploration planning took: %lf",timediff);
                                if(!w && !finalCheck){
                                  finalCheck = true;
                                  continue;
                                }

                        }else{
                                w = true;
                        }



                        if(w) {
                                finalCheck =false;

                                ROS_INFO("Best next Plan found!");
                                std_msgs::Header genericHeader;
                                genericHeader.stamp = ros::Time::now();
                                genericHeader.frame_id = "map";


                                // send map with valid detected Edges
                                if(dynConfig.node_show_exploration_planner_result){
                                  cv::Mat out = ePlanner.drawFrontiers();
                                  edgeImageMsg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", out).toImageMsg();
                                  edgePub.publish(edgeImageMsg);
                                }


                                nav_msgs::Path frontierPath;
                                if(ctrlSignals.detection_On) {
                                        frontierPath = ePlanner.getBestPlan(genericHeader);
                                }


                                if(ctrlSignals.control_On && ctrlSignals.detection_On) {
                                        ROS_INFO("Sending Plan..");
                                        pathPub.publish(frontierPath);
                                        ros::spinOnce();
                                        ROS_INFO("Sending Goal..");
                                        sendGoal(frontierPath, ac);
                                }

                        }else{
                                ROS_INFO("Map exploration finished, aborting loop...");
                                //ac.waitForResult();
                                ac.cancelGoal();
                                ac.waitForResult();

                                std::string imgMetaPath = ros::package::getPath("automap") + "/data/output/map.yaml";
                                std::string imgStatPath = ros::package::getPath("automap") + "/data/output/exploration_statistics.txt";
                                std::string imgPath = ros::package::getPath("automap") + "/data/output/map.pgm";
                                std::string recordedPathPath = ros::package::getPath("automap") + "/data/output/path.png";

                                //Save explored map
                                std::vector<int> com_param;
                                com_param.push_back(CV_IMWRITE_PNG_COMPRESSION);
                                com_param.push_back(9);
                                try {
                                        cv::imwrite(imgPath, map, com_param);
                                        ROS_INFO("Map written to: %s", imgPath.c_str());

                                } catch (std::runtime_error& ex) {
                                        std::cout << "Exception converting img to PNG: " << ex.what() << std::endl;
                                }

                                //Save exploration path
                                cv::Mat pathMap = map.clone();
                                cv::cvtColor(pathMap, pathMap, CV_GRAY2RGB);
                                cv::polylines(pathMap, explorationPath, false, cv::Scalar(0, 0, 255), 1, 8);
                                try {
                                        cv::imwrite(recordedPathPath, pathMap, com_param);
                                        ROS_INFO("Path written to: %s", recordedPathPath.c_str());

                                } catch (std::runtime_error& ex) {
                                        std::cout << "Exception converting img to PNG: " << ex.what() << std::endl;
                                }

                                YAML::Emitter Y_out;
                                Y_out << YAML::BeginMap;
                                Y_out << YAML::Key << "image";
                                Y_out << YAML::Value << "map.pgm";
                                Y_out << YAML::Key << "resolution";
                                Y_out << YAML::Value << mapMetaData.resolution;
                                Y_out << YAML::Key << "origin";
                                Y_out << YAML::Flow;
                                Y_out << YAML::BeginSeq << mapMetaData.origin.position.x<<mapMetaData.origin.position.y
                                      <<mapMetaData.origin.position.z << YAML::EndSeq;
                                Y_out << YAML::Key << "negate";
                                Y_out << YAML::Value << 0;
                                Y_out << YAML::Key << "occupied_thresh";
                                Y_out << YAML::Value << 0.65;
                                Y_out << YAML::Key << "free_thresh";
                                Y_out << YAML::Value << 0.196;
                                Y_out << YAML::EndMap;


                                YAML::Emitter Y_out_statistics;
                                Y_out_statistics << YAML::BeginMap;
                                Y_out_statistics << YAML::Key << "driven distance during exploration(m)";
                                Y_out_statistics << YAML::Value << telemetry.radial_distance;
                                Y_out_statistics << YAML::Key << "time elapsed during exploration(s)";
                                Y_out_statistics << YAML::Value << (ros::Time::now()-initTime).toNSec()/NSEC_PER_SEC;
                                Y_out_statistics << YAML::Key << "average path planner processing time(s)";
                                Y_out_statistics << YAML::Value << t_planner/t_planner_counter;
                                Y_out_statistics << YAML::Key << "average exploration planner processing time(s)";
                                Y_out_statistics << YAML::Value << t_explanner/t_explanner_counter;
                                Y_out_statistics << YAML::Key << "average busy loop processing time(s)";
                                Y_out_statistics << YAML::Value << t_loop/t_loop_counter;

                                // calc quality of map
                                std::string godMapPath = ros::package::getPath("simulation") + "/data/map/map.pgm";
                                cv::Mat godMap = cv::imread(godMapPath,1);
                                cv::cvtColor(godMap, godMap, CV_RGB2GRAY);
                                double diffMap = cv::norm(godMap, map, CV_L2);

                                Y_out_statistics << YAML::Key << "in comparison to god map (L2Norm)";
                                Y_out_statistics << YAML::Value << diffMap;
                                Y_out_statistics << YAML::EndMap;

                                std::ofstream outfile_yaml(imgMetaPath);
                                try{
                                        outfile_yaml<<Y_out.c_str();
                                        ROS_INFO("MapMetaData written to: %s", imgMetaPath.c_str());
                                }catch (std::runtime_error& ex) {
                                        std::cout << "Exception writing .yaml-file: " << ex.what() << std::endl;
                                }
                                outfile_yaml.close();

                                std::ofstream outfile_statistics(imgStatPath);
                                try{
                                        outfile_statistics<<Y_out_statistics.c_str();
                                        ROS_INFO("Statistics data written to: %s", imgStatPath.c_str());
                                }catch (std::runtime_error& ex) {
                                        std::cout << "Exception writing .txt-file: " << ex.what() << std::endl;
                                }
                                outfile_statistics.close();

                                finished = true;
                                ros::shutdown();


                        }


                }else{
                        ROS_INFO("Not enough information gained: %lf",gain);
                        retry--;
                }
                // resend map with valid detected Edges
                if(dynConfig.node_show_exploration_planner_result){
                  cv::Mat out = ePlanner.drawFrontiers();
                  edgeImageMsg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", out).toImageMsg();
                  edgePub.publish(edgeImageMsg);
                }

                //stop measure processing time
                timediff = (ros::Time::now()-loop_timer).toNSec()/NSEC_PER_SEC;
                t_loop += timediff;
                t_loop_counter++;
                ROS_INFO("Whole loop took: %lf",timediff);

                ros::spinOnce();
                loop_rate.sleep();
        }

        ros::spin();
}
int main(int argc, char** argv) {

	// Initialize ourselves as a ROS node.
	ros::init(argc, argv, "planner");
	ros::NodeHandle nh;
	ros::Rate loop_rate(0.5); //hz
	vis = nh.advertise<visualization_msgs::Marker> ("visualization_marker", 0);

	// Subscribe to the map and people finder data.
	ros::Subscriber map_sub;
	ros::Subscriber people_finder_sub;
	ros::Subscriber robot_pose_sub;
	//ros::Subscriber costmap_sub;
	//costmap_sub = nh.subscribe<nav_msgs::GridCells>("/move_base_node/local_costmap/obstacles", 1, updateCost);
	map_sub = nh.subscribe<nav_msgs::OccupancyGrid> ("/map", 1, updateMap);
	people_finder_sub = nh.subscribe<hide_n_seek::PeopleFinder> (
			"fake_people_finder/people_finder", 1, updatePeople);
	robot_pose_sub = nh.subscribe<nav_msgs::Odometry> (
			"/base_pose_ground_truth", 1, updateRobotPose);

	// map_inited = false;
	pomdp.num_states = 400;
	pomdp.num_lookahead = 1;
	pomdp.states_inited = false;
	//pomdp.current_state.pose.position.x = 0;
	//pomdp.current_state.pose.position.y = 0;


	ROS_INFO("States initialized.");

	// spin the main loop
	while (ros::ok()) {
		ROS_INFO("service loop...");

		 {

			State internalGoal,personGoal;
			State s;
			if (people.size() != 0) {
				// If we have people to explore, exploring them is first priority.
				personGoal.pose = people.at(0);
				//this  is a real world pose, now convert it into one of the pompdp state to calculate the euc dist from all poss states
				personGoal.state_space_pose  = realToStatePose(personGoal.pose);
				s = makePlan(personGoal);
				ROS_INFO("Person found at real(%f, %f)! Using them as the next goal.", personGoal.pose.position.x, internalGoal.pose.position.y);
			} else if (pomdp.states_inited){
				// get goal from POMDp with highest probability, if its an internal state no conversion needed

				internalGoal = getMostLikelyState();
				s = makePlan(internalGoal);

			}
			//internalGoal.state_space_pose = realToStatePose(internalGoal.pose);
			// once we've initialized some states...
			// make a plan

			ROS_INFO("State received from makePlan: (%f, %f)", s.pose.position.x, s.pose.position.y);

			if (people.size() != 0) {
				people.erase(people.begin());
			}
			// print current goals
			printGoals(vis);
			// send a goal
			visualization_msgs::Marker marker;
			marker.header.frame_id = "map";//->header.frame_id;
			marker.id = 67845;
			marker.header.stamp = ros::Time();
			marker.type = visualization_msgs::Marker::ARROW;
			marker.action = visualization_msgs::Marker::ADD;
			marker.pose.position.x = s.pose.position.x;
			marker.pose.position.y = s.pose.position.y;
			marker.pose.position.z = 0;
			marker.pose.orientation.x = 0.0;
			marker.pose.orientation.y = -1.0;
			marker.pose.orientation.z = 0.0;
			marker.pose.orientation.w = 1.0;
			marker.scale.z = 2.0;
			marker.scale.x = 2.0;
			marker.scale.y = 2.0;

			marker.color.r = 1.0;
			marker.color.g = 1.0;
			marker.color.b = 1.0;
			vis.publish(marker);
			sendGoal(s);
			ROS_INFO("Goal we're sending: (%f, %f)", s.pose.position.x, s.pose.position.y);

			// set the current state
			pomdp.current_state = s;

		}

		ros::spinOnce();
		loop_rate.sleep();
	}
}