コード例 #1
0
ファイル: rvo_example.cpp プロジェクト: ipab-rad/ICRIN
int main(int argc, char* argv[]) {
	ros::init(argc, argv, "rvo_example");
	ros::NodeHandle nh("rvo_example");

	/* Create a new simulator instance. */
	RVO::RVOSimulator* sim = new RVO::RVOSimulator();

	/* Set up the scenario. */
	setupScenario(sim);

	/* Perform (and manipulate) the simulation. */
	ROS_INFO("Iteration");
	do {
#if RVO_OUTPUT_TIME_AND_POSITIONS
		updateVisualization(sim);
#endif
		setPreferredVelocities(sim);
		sim->doStep();
	} while (!reachedGoal(sim));
	ROS_INFO("End");

	delete sim;

	return 0;
}
コード例 #2
0
ファイル: ExampleBlocks.cpp プロジェクト: tpastor/CSharpRVO
int main(int argc, const char* argv[])
{
    /* Create a new simulator instance. */
    RVO::RVOSimulator* sim = new RVO::RVOSimulator();

    /* Set up the scenario. */
    setupScenario(sim);

    /* Perform (and manipulate) the simulation. */
    do {
        updateVisualization(sim);
        setPreferredVelocities(sim);
        sim->doStep();
    } while (!reachedGoal(sim));

    delete sim;

    return 0;
}
コード例 #3
0
void AgentClass::run()
{	
	//Funkcija se periodicki poziva i radi korak simulacije u RVO simulatoru
	if (!(addAgent1True_))
	{
		gazebo_msgs::GetModelState pozicija;
		pozicija.request.model_name = "pioneer1";
		pozicija_.call(pozicija);						//Ocitavanje pozicije pioneera1 u Gazebu

		//Stvaranje objekta kvaterniona klase tf::Quaternion kako bi mogao koristiti funkcije za dobivanje kuta rotacije  
		tf::Quaternion q = tf::Quaternion(pozicija.response.pose.orientation.x,pozicija.response.pose.orientation.y,pozicija.response.pose.orientation.z,pozicija.response.pose.orientation.w);

		float theta = round(100*q.getAngleShortestPath())/100.0; //Kut rotacije najkraćim putem
		tf::Vector3 os = q.getAxis();
		float X,Y,V;
		RVO::Vector2 trenutna_brzina;
		if (os.z() >= 0.0)
		{
			X = round(100*pozicija.response.pose.position.x)/100.0 - (0.34/2)*cos(theta);
			Y = round(100*pozicija.response.pose.position.y)/100.0 + (0.34/2)*sin(theta);

			V = round(100*pozicija.response.twist.linear.x)/100.0;
			trenutna_brzina = RVO::Vector2(-1*V*cos(theta),V*sin(theta));
		}
		else
		{
			X = round(100*pozicija.response.pose.position.x)/100.0 - (0.34/2)*cos(theta);
			Y = round(100*pozicija.response.pose.position.y)/100.0 - (0.34/2)*sin(theta);

			V = round(100*pozicija.response.twist.linear.x)/100.0;
			trenutna_brzina = RVO::Vector2(-1*V*cos(theta),-1*V*sin(theta));
		}
		simulator->setAgentVelocity(pioneer1_num,trenutna_brzina);	//Trenutna brzina iz Gazeba u RVO simulator
		simulator->setAgentPosition(pioneer1_num,RVO::Vector2(X,Y)); //Trenutna pozicija iz Gazeba u RVO simulator
	}

	if (!(addAgent2True_))
	{
		gazebo_msgs::GetModelState pozicija;
		pozicija.request.model_name = "pioneer2";
		pozicija_.call(pozicija);						//Ocitavanje pozicije pioneera2 u Gazebu
		
		//Stvaranje objekta kvaterniona klase tf::Quaternion kako bi mogao koristiti funkcije za dobivanje kuta rotacije  
		tf::Quaternion q = tf::Quaternion(pozicija.response.pose.orientation.x,pozicija.response.pose.orientation.y,pozicija.response.pose.orientation.z,pozicija.response.pose.orientation.w);

		float theta = round(100*q.getAngleShortestPath())/100.0; //Kut rotacije najkraćim putem
		tf::Vector3 os = q.getAxis();
		float X,Y,V;
		RVO::Vector2 trenutna_brzina;
		if (os.z() >= 0.0)
		{
			X = round(100*pozicija.response.pose.position.x)/100.0 - (0.34/2)*cos(theta);
			Y = round(100*pozicija.response.pose.position.y)/100.0 + (0.34/2)*sin(theta);

			V = round(100*pozicija.response.twist.linear.x)/100.0;
			trenutna_brzina = RVO::Vector2(-1*V*cos(theta),V*sin(theta));
		}
		else
		{
			X = round(100*pozicija.response.pose.position.x)/100.0 - (0.34/2)*cos(theta);
			Y = round(100*pozicija.response.pose.position.y)/100.0 - (0.34/2)*sin(theta);

			V = round(100*pozicija.response.twist.linear.x)/100.0;
			trenutna_brzina = RVO::Vector2(-1*V*cos(theta),-1*V*sin(theta));
		}
		simulator->setAgentVelocity(pioneer1_num,trenutna_brzina);	//Trenutna brzina iz Gazeba u RVO simulator
		simulator->setAgentPosition(pioneer1_num,RVO::Vector2(X,Y)); //Trenutna pozicija iz Gazeba u RVO simulator
	}

	
	if (!addAgent1True_)
	{
		simulator->doStep(); //Provođenje koraka simulacije

		geometry_msgs::Twist brzina_twist;
		RVO::Vector2 brzina = simulator->getAgentVelocity(pioneer1_num);
		float theta_sad = atan2(brzina.y(),brzina.x()); //Kut vektora brzine u ovom koraku simulacije
		brzina_twist.linear.x = sqrt(pow(brzina.x(),2)+ pow(brzina.y(),2));
		brzina_twist.angular.z = (theta_sad-theta_prije)/simulator->getTimeStep();	
		theta_prije = theta_sad; //Spremanje kuta za sljedeći korak simulacije
		pub_.publish(brzina_twist);
	}
}
コード例 #4
0
void AgentClass::setupScenario()
{
simulator->setTimeStep(0.1f);  //Postavljanje vremena koraka simulacije 	
	
	simulator->setAgentDefaults(1.0f,5,0.1f,5.0f,0.4f,1.0f);//Osnovni parametri za svakog novog robota dodanog u simulaciju
}
コード例 #5
0
void AgentClass::callback_function_2(const geometry_msgs::Twist::ConstPtr& data)
{
	if (addAgent2True_)
		{
		gazebo_msgs::GetModelState pozicija;
		pozicija.request.model_name = "pioneer2";
		pozicija_.call(pozicija);
		
		tf::Quaternion q = tf::Quaternion(pozicija.response.pose.orientation.x,pozicija.response.pose.orientation.y,pozicija.response.pose.orientation.z,pozicija.response.pose.orientation.w);
		float theta = round(100*q.getAngleShortestPath())/100.0; //Kut rotacije najkraćim putem
		tf::Vector3 os = q.getAxis();
		float X,Y;
		if(os.z() >= 0.0)
		{
			X = round(100*pozicija.response.pose.position.x)/100.0 - (0.34/2)*cos(theta);
			Y = round(100*pozicija.response.pose.position.y)/100.0 + (0.34/2)*sin(theta);
		}
		else
		{
			X = round(100*pozicija.response.pose.position.x)/100.0 - (0.34/2)*cos(theta);
			Y = round(100*pozicija.response.pose.position.y)/100.0 - (0.34/2)*sin(theta);
		}
		simulator->addAgent(RVO::Vector2(X,Y)); //Prvotno dodavanje pioneera u RVO simulator
		pioneer2_num = simulator->getNumAgents()-1; //Pamćenje rednog broja robota u simulatoru za povrat informacije iz simulatora
		addAgent2True_ = false; //Zastavica da je robot dodan u simulator 
		//Postavljanje preferirane brzine 2. pioneera
		if (os.z() >= 0.0)
		{
			RVO::Vector2 brzina_pref = RVO::Vector2(-1*data->linear.x*cos(theta),data->linear.x*sin(theta)); //Vektor preferirane brzine
			simulator->setAgentPrefVelocity(pioneer2_num, brzina_pref); //Postavljanje prefrerirane brzine 2. pioneera
		}
		else
		{
			RVO::Vector2 brzina_pref = RVO::Vector2(-1*data->linear.x*cos(theta),-1*data->linear.x*sin(theta)); //Vektor preferirane brzine
			simulator->setAgentPrefVelocity(pioneer2_num, brzina_pref); //Postavljanje prefrerirane brzine 2. pioneera
		}

		}
	else
		{
		gazebo_msgs::GetModelState pozicija;
		pozicija.request.model_name = "pioneer2";
		pozicija_.call(pozicija);
		
		tf::Quaternion q = tf::Quaternion(pozicija.response.pose.orientation.x,pozicija.response.pose.orientation.y,pozicija.response.pose.orientation.z,pozicija.response.pose.orientation.w);
		float theta = round(100*q.getAngleShortestPath())/100.0; //Kut rotacije najkraćim putem
		tf::Vector3 os = q.getAxis();
		if (os.z() >= 0.0)
		{
			RVO::Vector2 brzina_pref = RVO::Vector2(-1*data->linear.x*cos(theta),data->linear.x*sin(theta)); //Vektor preferirane brzine
			simulator->setAgentPrefVelocity(pioneer2_num, brzina_pref); //Postavljanje prefrerirane brzine 2. pioneera
		}
		else
		{
			RVO::Vector2 brzina_pref = RVO::Vector2(-1*data->linear.x*cos(theta),-1*data->linear.x*sin(theta)); //Vektor preferirane brzine
			simulator->setAgentPrefVelocity(pioneer2_num, brzina_pref); //Postavljanje prefrerirane brzine 2. pioneera
		}
		}
	


}