Robot Game  v1.0
Research Track part 1 - Assignment
rg_controller.cpp
Go to the documentation of this file.
1 
23 #include "ros/ros.h"
24 #include "ros/console.h"
25 #include "geometry_msgs/PoseWithCovariance.h"
26 #include "geometry_msgs/Point.h"
27 #include "geometry_msgs/Vector3.h"
28 #include "geometry_msgs/Twist.h"
29 #include "nav_msgs/Odometry.h"
30 
31 #include "robot_game/rg_get_target_srv.h"
32 #include "robot_game/rg_check_srv.h"
33 #include "robot_game/rg_get_vel_srv.h"
34 
36 #define XMIN (-6.f)
37 
39 #define XMAX (6.f)
40 
42 #define YMIN (-6.f)
43 
45 #define YMAX (6.f)
46 
48 ros::Subscriber in;
49 
51 ros::Publisher out;
52 
53 ros::ServiceClient check_tg_srv;
54 ros::ServiceClient newtg_srv;
55 ros::ServiceClient get_vel_srv;
56 
58 geometry_msgs::Point target;
59 
60 
61 
62 
73 geometry_msgs::Point rg_get_new_target( ros::ServiceClient srv, double xmin, double xmax, double ymin, double ymax )
74 {
75  // ask for a new target (rg_get_target)
76  robot_game::rg_get_target_srv newtrg_msg;
77  newtrg_msg.request.xmin = xmin;
78  newtrg_msg.request.xmax = xmax;
79  newtrg_msg.request.ymin = ymin;
80  newtrg_msg.request.ymax = ymax;
81 
82  //newtg_srv.call( newtrg_msg );
83  srv.call( newtrg_msg );
84 
85  return newtrg_msg.response.xt;
86 }
87 
88 
89 
105 void rg_controller_task( const nav_msgs::Odometry::ConstPtr& posemsg )
106 {
107  // check if the target was reached (rg_check_target)
108  robot_game::rg_check_srv checkmsg;
109  checkmsg.request.x.x = posemsg->pose.pose.position.x;
110  checkmsg.request.x.y = posemsg->pose.pose.position.y;
111  checkmsg.request.x.z = posemsg->pose.pose.position.z;
112  checkmsg.request.xt = target;
113  bool targetReached = check_tg_srv.call( checkmsg );
114 
115  if( targetReached )
117 
118  // ask a new Twist, then move the robot (rg_get_velocity)
119  robot_game::rg_get_vel_srv vel_msg;
120  vel_msg.request.x = checkmsg.request.x;
121  vel_msg.request.xt = target;
122 
123  get_vel_srv.call( vel_msg );
124 
125  out.publish( vel_msg.response.vel );
126  ros::spinOnce();
127 }
128 
129 
133 int main( int argc, char** argv )
134 {
135  ros::init( argc, argv, "rg_controller" );
136  ros::NodeHandle h;
137 
138  check_tg_srv = h.serviceClient<robot_game::rg_check_srv>("rg_check_target");
139  newtg_srv = h.serviceClient<robot_game::rg_get_target_srv>("rg_get_target");
140  get_vel_srv = h.serviceClient<robot_game::rg_get_vel_srv>("rg_get_velocity");
141 
143 
144  in = h.subscribe( "base_pose_ground_truth", 1000, rg_controller_task );
145  out = h.advertise<geometry_msgs::Twist>( "cmd_vel", 1000 );
146 
147  ros::spin();
148 
149  return 0;
150 }
#define XMAX
ros::ServiceClient newtg_srv
ros::Subscriber in
ros::Publisher out
int main(int argc, char **argv)
Ask for services, topics, and initialise the node.
#define YMAX
ros::ServiceClient get_vel_srv
#define XMIN
geometry_msgs::Point target
#define YMIN
ros::ServiceClient check_tg_srv
void rg_controller_task(const nav_msgs::Odometry::ConstPtr &posemsg)
The main function of the controller.
geometry_msgs::Point rg_get_new_target(ros::ServiceClient srv, double xmin, double xmax, double ymin, double ymax)
require a new target to reach to the server.