42 #include <geometry_msgs/Twist.h>
43 #include <geometry_msgs/TransformStamped.h>
44 #include <nav_msgs/OccupancyGrid.h>
45 #include <nav_msgs/Odometry.h>
46 #include <sensor_msgs/LaserScan.h>
57 constexpr
char LOGNAME[] =
"ergodic exploration";
65 template <
class ModelT>
93 void mapCallback(
const nav_msgs::OccupancyGrid::ConstPtr& msg);
105 void control(
const Target& target,
const std::string& map_frame_id,
106 const std::string& base_frame_id,
double frequency,
double val_dt,
133 template <
class ModelT>
138 , ergodic_control_(ergodic_control)
139 , collision_(collision)
141 , map_received_(false)
142 , vb_(3, arma::fill::zeros)
143 , tfListener_(tfBuffer_)
148 template <
class ModelT>
154 cmd_pub_ = nh_.advertise<geometry_msgs::Twist>(
"cmd_vel", 1);
155 opt_traj_pub_ = nh_.advertise<nav_msgs::Path>(
"trajectory", 1);
156 dwa_path_pub_ = nh_.advertise<nav_msgs::Path>(
"dwa_trajectory", 1);
157 target_pub_ = nh_.advertise<visualization_msgs::MarkerArray>(
"target", 1,
true);
160 template <
class ModelT>
163 vb_(0) = msg.twist.twist.linear.x;
164 vb_(1) = msg.twist.twist.linear.y;
165 vb_(2) = msg.twist.twist.angular.z;
168 template <
class ModelT>
173 map_received_ =
true;
176 template <
class ModelT>
178 const std::string& base_frame_id,
double frequency,
179 double val_dt,
double val_horizon)
182 ergodic_control_.setTarget(target);
184 const visualization_msgs::MarkerArray marker_array = target.
markers(map_frame_id);
185 target_pub_.publish(marker_array);
187 const auto dwa_steps = dwa_.steps();
188 vec u(3, arma::fill::zeros);
189 vec pose(3, arma::fill::zeros);
191 bool pose_known =
false;
192 bool follow_dwa =
false;
201 const geometry_msgs::TransformStamped t_map_base =
202 tfBuffer_.lookupTransform(map_frame_id, base_frame_id,
ros::Time(0));
203 pose(0) = t_map_base.transform.translation.x;
204 pose(1) = t_map_base.transform.translation.y;
205 pose(2) =
getYaw(t_map_base.transform.rotation.x, t_map_base.transform.rotation.y,
206 t_map_base.transform.rotation.z, t_map_base.transform.rotation.w);
209 ergodic_control_.addStateMemory(pose);
221 if (map_received_ && pose_known)
227 follow_dwa = (i != dwa_steps) ?
true :
false;
232 u = ergodic_control_.control(grid_, pose);
234 const nav_msgs::Path trajectory = ergodic_control_.path(map_frame_id);
235 opt_traj_pub_.publish(trajectory);
246 u = std::get<vec>(dwa_.control(grid_, pose, vb_, u));
257 const mat opt_traj = ergodic_control_.optTraj();
260 const tuple<bool, vec> dwa_state =
261 dwa_.control(grid_, pose, vb_, opt_traj, ergodic_control_.timeStep());
263 u = std::get<vec>(dwa_state);
267 follow_dwa = std::get<bool>(dwa_state);
274 const nav_msgs::Path dwa_traj =
275 constTwistPath(map_frame_id, pose, u, dwa_.timeStep(), dwa_.horizon());
276 dwa_path_pub_.publish(dwa_traj);
281 geometry_msgs::Twist twist_msg;
282 twist_msg.linear.x = u(0);
283 twist_msg.linear.y = u(1);
284 twist_msg.angular.z = u(2);
286 cmd_pub_.publish(twist_msg);