Category:HamsterAPICPPTest
Contents
Tests in C++
How our C++ tests works ?
before all test we have to be connected to the Robot so we beginning with the connection.
It is necessary to create an object hamster and it use all information about the Hamster class. Then we use we create a new HamsterClientParameters. It use to initialize the port and the base address of the Robot. and now we use the object Hamster that we created before with two parameters :
1- number agent of the robot
2- the name of the HamsterClientParameters that we created before.
We put this little function in a try catch of function with throws exception because if we can't be connected to the robot all the test after will failed.
Example : <syntaxhighlight lang="bash" line='line'> HamsterAPI::HamsterClientParameters params7; params7.port = 8107; params7.base_address = "10.0.2"; // Init the agent ID and the port HamsterAPI::Hamster hamster7(7,params7); </syntaxhighlight>
Test with simulation
Before launch our test we have to launch our simulation software Gazebo.
<syntaxhighlight lang="bash" line='line'> cd hamster_ws source devel/setup.bash </syntaxhighlight>
and then launch Gazebo :
<syntaxhighlight lang="bash" line='line'> roslaunch hamster_api_server_cpp hamster_api_simulation_server_and_gazbo_and_algs.launch </syntaxhighlight>
For the tests we created a test file where each test corresponds to a function
<syntaxhighlight lang="bash" line='line'> try { // define pose like get pose from the robot and print it HamsterAPI::Pose pose = hamster.getPose(); HamsterAPI::Log::i("Client",pose.toString()); } catch(const HamsterAPI::HamsterError & message_error) { std::stringstream stream; stream << "Pose: " << message_error.what(); HamsterAPI::Log::i("Client", stream.str()); } </syntaxhighlight>
We have created a function to get the position of the robot and print it as long as we are connected. In a second time we start the topic on ROS and we compare the values. The purpose of this test is to verify that the positioning of the robot makes sense.
We have created a function that recovers speed and position as long as we are connected to the robot. The aim of this test is to verify the speed variations of the robots with respect to the position.
We created a function for the robot to navigate from point A to point B.
To be done:
-First define the point A as the initial points and therefore define the initial position.
<syntaxhighlight lang="bash" line='line'> HamsterAPI::Pose pose; pose.setX(7.03); pose.setY(1.35); pose.setHeading(-135.0); hamster.setInitialPose(pose); </syntaxhighlight>
- In second time set goal to reach with position
<syntaxhighlight lang="bash" line='line'> HamsterAPI::Goal goal; goal.setX(3.0); goal.setY(-2.0); goal.setHeading(-135.0); goal.setGoalType(HamsterAPI::GT_GLOBAL_GOAL); //print all information about the goal HamsterAPI::Log::i("Client", goal.toString());
// Thread --> sleep 1s boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
// ask to the hamster to navigate forward the goal hamster.navigateTo(goal); </syntaxhighlight>
Between the initial position and the goal we have to insert a thread.sleep().
Test with robots
To make the tests on the robots we use a software allowing us to know all the parameters of the robot such as the position on a map for example. To launch this software type the following command lines : <syntaxhighlight lang="bash" line='line'>
export ROS_MASTER_URI=http://10.0.2.1:11311
</syntaxhighlight> The address after http correspond to the robot's base address.
Now do an ifconfig and find the ip address that has just been added. <syntaxhighlight lang="bash" line='line'> ROS_IP=10.0.2. your address </syntaxhighlight>
And then launch rviz. <syntaxhighlight lang="bash" line='line'> rviz </syntaxhighlight>
To check the communication between two hamster we have developed two programs one for the sending of data and the other for the reception and the answer.
We first run the ReceiveDataMess program before the SendDataMessage program because we need the receiver connected to be able to send a message to it.
ReceiveDataMessage
<syntaxhighlight lang="bash" line='line'>
- HamsterAPIClientDataMessageReceiver.cpp
- Created on: jun 21, 2016
- Author: Ilan
- include <hamster_api_client_cpp/Hamster.h>
- include <boost/date_time.hpp>
- include <boost/thread.hpp>
- include "IFDEF.h"
- ifdef RECEIVER
int main(int argc, char ** argv) { try { HamsterAPI::HamsterClientParameters params; params.port = 8108; params.base_address = "10.0.2";
// Init hamster with the agent id number HamsterAPI::Hamster hamster(8,params);
while(hamster.isConnected()) { try { HamsterAPI::Log::i("Client", "Waiting for Sender to send msg");// print
while(!hamster.hasDataMessages()) // Thread --> sleep 1 boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
HamsterAPI::Log::i("Client", "Got msg"); // print
HamsterAPI::DataMessage msg = hamster.popLatestDataMessage(); HamsterAPI::Log::i("Client", boost::lexical_cast<std::string>(msg.getSourceAgentID()) + "=" + msg.getStringData());
// define message of receiver : receiver_msg HamsterAPI::DataMessage receiver_msg("coucou",8,7); HamsterAPI::Log::i("Client", "Sending Data Message");//print HamsterAPI::Log::i("Client", receiver_msg.toString());//print the receiver_msg // send the message from the receiver to the sender hamster.sendDataMessage(receiver_msg); } // Message Issue or Connection Issue catch(const HamsterAPI::HamsterError & message_error) { HamsterAPI::Log::i("Client", message_error.what()); } } } // Connection Issue catch(const HamsterAPI::HamsterError & connection_error) { HamsterAPI::Log::i("Client",connection_error.what());
}
}
- endif
</syntaxhighlight>
SendDataMessage
<syntaxhighlight lang="bash" line='line'>
* * HamsterAPIClientDataMessageSender.cpp * * Created on: jun 21, 2016 * Author: Ilan *
- include <hamster_api_client_cpp/Hamster.h>
- include <boost/date_time.hpp>
- include <boost/thread.hpp>
- include "IFDEF.h"
- ifdef SENDER
int main(int argc, char ** argv) { try { HamsterAPI::HamsterClientParameters params; params.port = 8107; params.base_address = "10.0.2";
// Init hamster with the agent id number HamsterAPI::Hamster hamster(7,params);
while(hamster.isConnected()) { try { // define the message from the sender : sender_msg HamsterAPI::DataMessage sender_msg("Salut",7,8); HamsterAPI::Log::i("Client", "Sending Data Message");//print HamsterAPI::Log::i("Client", sender_msg.toString());// print sender_msg hamster.sendDataMessage(sender_msg); // send message
HamsterAPI::Log::i("Client", "Waiting for Receiver to send msg");// print
while(!hamster.hasDataMessages()) // Thread --> sleep boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
HamsterAPI::Log::i("Client", "Got msg"); // print
HamsterAPI::DataMessage msg = hamster.popLatestDataMessage(); HamsterAPI::Log::i("Client", boost::lexical_cast<std::string>(msg.getSourceAgentID()) + "=" + msg.getStringData()); } // Message Issue or Connection Issue catch(const HamsterAPI::HamsterError & message_error) { HamsterAPI::Log::i("Client", message_error.what()); } } } // Connection Issue catch(const HamsterAPI::HamsterError & connection_error) { HamsterAPI::Log::i("Client",connection_error.what()); } }
- endif
</syntaxhighlight>
For launch correctly our communication between two Hamster we create a file IFDEF.h to launch the receiver before the sender. <syntaxhighlight lang="bash" line='line'>
* IFDEF.h * * Created on: Jun 21, 2017 * Author: cogniteam *
- ifndef IFDEF_H_
- define IFDEF_H_
- define RECEIVER 1
- define SENDER 1
- endif /* IFDEF_H_ */
</syntaxhighlight>
TwoHamsterTwoGoal
<syntaxhighlight lang="bash" line='line'> /*
* 2Goal2HamsterGlobal.cpp * * Created on: Jun 22, 2017 * Author: Ilan */
- include <hamster_api_client_cpp/Hamster.h>
- include <boost/date_time.hpp>
- include <boost/thread.hpp>
int main(int argc, char ** argv){
try{
HamsterAPI::HamsterClientParameters params7;
params7.port = 8107;
params7.base_address = "10.0.2";
// Init the agent ID and the port
HamsterAPI::Hamster hamster7(7,params7);
HamsterAPI::HamsterClientParameters params8; params8.port = 8108; params8.base_address = "10.0.2"; // Init the agent ID and the port HamsterAPI::Hamster hamster8(8,params8);
// Define a new position and set X, Y, and heading HamsterAPI::Pose pose; pose.setX(7.03); pose.setY(1.35); pose.setHeading(-135.0); // Def pose like the initial position for hamster 7 hamster7.setInitialPose(pose); pose.setX(6.02); pose.setY(1.98); // set new X, and Y and define the new pose like the initial position of hamster 8 hamster8.setInitialPose(pose);
// thread --> sleep during 2s boost::this_thread::sleep(boost::posix_time::milliseconds(2000));
// define new goal and set X, Y, heading and goal Type HamsterAPI::Goal goal; goal.setX(3.0); goal.setY(-2.0); goal.setHeading(-135.0); goal.setGoalType(HamsterAPI::GT_GLOBAL_GOAL); //print all information about the goal HamsterAPI::Log::i("Client", goal.toString());
// Thread --> sleep 1s boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
// ask to the hamster 7 to navigate forward the goal hamster7.navigateTo(goal);
while(hamster7.isConnected()){ // during Hamster 7 is connected // define state like the navigation state all the time // if the status is still in progress so we continue // if the status is reach so we break the loop // if the status is fail so we return 1 HamsterAPI::NavigationState state = hamster7.getNavigationState(); if(state.getStatus() == HamsterAPI::NS_IN_PROGRESS) continue; else if(state.getStatus() == HamsterAPI::NS_REACHED_GOAL) { HamsterAPI::Log::i("Client", "Reached Goal!"); break; } else { HamsterAPI::Log::i("Client", "Goal Failed."); return 1; } } // hamster 7 is disconnect hamster7.disconnect();
// Thread --> sleep 1s boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
if(!hamster7.isConnected()){ // if the hamster 7 is disconnect // define a new goal and we set X, Y, Heading and goal type HamsterAPI::Goal goal1; goal1.setX(4.76); goal1.setY(-2.46); goal1.setHeading(-135.0); goal1.setGoalType(HamsterAPI::GT_GLOBAL_GOAL);
// we print all information about goal1 HamsterAPI::Log::i("Client", goal1.toString());
//Thread --> 1s boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
// and ask to hamster 8 to navigate forward goal1 hamster8.navigateTo(goal1);
}
while(hamster8.isConnected()){ // during Hamster 8 is connected // define state like the navigation state all the time // if the status is still in progress so we continue // if the status is reach so we break the loop // if the status is fail so we return 1
HamsterAPI::NavigationState state = hamster8.getNavigationState(); if(state.getStatus() == HamsterAPI::NS_IN_PROGRESS) continue; else if(state.getStatus() == HamsterAPI::NS_REACHED_GOAL) { HamsterAPI::Log::i("Client", "Reached Goal!"); break; } else { HamsterAPI::Log::i("Client", "Goal Failed."); return 1; } } // disconnect hamster 8 hamster8.disconnect();
} catch(const HamsterAPI::HamsterError & connection_error){ HamsterAPI::Log::i("Client",connection_error.what());
} }
</syntaxhighlight>
The purpose of this test is to make two hamster go towards a definite goal one after the other.
As long as the first did not reach his goal the second robot does not go towards his objectives.
For this, first we initialize the positions of each robot and then we impose the goal for each of them.