Unify finish trajectory logic (#552)
Port active trajectory checks and subscriber shutdown logic into FinishTrajectory(), so that a trajectory can be cleanly finished by function call.master
parent
3e684b298b
commit
9fb2b09a0b
|
@ -375,6 +375,30 @@ bool Node::ValidateTopicNames(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Node::FinishTrajectoryUnderLock(const int trajectory_id) {
|
||||||
|
if (is_active_trajectory_.count(trajectory_id) == 0) {
|
||||||
|
LOG(INFO) << "Trajectory_id " << trajectory_id << " is not created yet.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!is_active_trajectory_[trajectory_id]) {
|
||||||
|
LOG(INFO) << "Trajectory_id " << trajectory_id
|
||||||
|
<< " has already been finished.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shutdown the subscribers of this trajectory.
|
||||||
|
for (auto& entry : subscribers_[trajectory_id]) {
|
||||||
|
entry.subscriber.shutdown();
|
||||||
|
subscribed_topics_.erase(entry.topic);
|
||||||
|
LOG(INFO) << "Shutdown the subscriber of [" << entry.topic << "]";
|
||||||
|
}
|
||||||
|
CHECK_EQ(subscribers_.erase(trajectory_id), 1);
|
||||||
|
CHECK(is_active_trajectory_.at(trajectory_id));
|
||||||
|
map_builder_bridge_.FinishTrajectory(trajectory_id);
|
||||||
|
is_active_trajectory_[trajectory_id] = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Node::HandleStartTrajectory(
|
bool Node::HandleStartTrajectory(
|
||||||
::cartographer_ros_msgs::StartTrajectory::Request& request,
|
::cartographer_ros_msgs::StartTrajectory::Request& request,
|
||||||
::cartographer_ros_msgs::StartTrajectory::Response& response) {
|
::cartographer_ros_msgs::StartTrajectory::Response& response) {
|
||||||
|
@ -421,27 +445,7 @@ bool Node::HandleFinishTrajectory(
|
||||||
::cartographer_ros_msgs::FinishTrajectory::Request& request,
|
::cartographer_ros_msgs::FinishTrajectory::Request& request,
|
||||||
::cartographer_ros_msgs::FinishTrajectory::Response& response) {
|
::cartographer_ros_msgs::FinishTrajectory::Response& response) {
|
||||||
carto::common::MutexLocker lock(&mutex_);
|
carto::common::MutexLocker lock(&mutex_);
|
||||||
const int trajectory_id = request.trajectory_id;
|
return FinishTrajectoryUnderLock(request.trajectory_id);
|
||||||
if (is_active_trajectory_.count(trajectory_id) == 0) {
|
|
||||||
LOG(INFO) << "Trajectory_id " << trajectory_id << " is not created yet.";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!is_active_trajectory_[trajectory_id]) {
|
|
||||||
LOG(INFO) << "Trajectory_id " << trajectory_id
|
|
||||||
<< " has already been finished.";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shutdown the subscribers of this trajectory.
|
|
||||||
for (auto& entry : subscribers_[trajectory_id]) {
|
|
||||||
entry.subscriber.shutdown();
|
|
||||||
subscribed_topics_.erase(entry.topic);
|
|
||||||
LOG(INFO) << "Shutdown the subscriber of [" << entry.topic << "]";
|
|
||||||
}
|
|
||||||
CHECK_EQ(subscribers_.erase(trajectory_id), 1);
|
|
||||||
map_builder_bridge_.FinishTrajectory(trajectory_id);
|
|
||||||
is_active_trajectory_[trajectory_id] = false;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Node::HandleWriteState(
|
bool Node::HandleWriteState(
|
||||||
|
@ -457,17 +461,14 @@ void Node::FinishAllTrajectories() {
|
||||||
for (auto& entry : is_active_trajectory_) {
|
for (auto& entry : is_active_trajectory_) {
|
||||||
const int trajectory_id = entry.first;
|
const int trajectory_id = entry.first;
|
||||||
if (entry.second) {
|
if (entry.second) {
|
||||||
map_builder_bridge_.FinishTrajectory(trajectory_id);
|
CHECK(FinishTrajectoryUnderLock(trajectory_id));
|
||||||
entry.second = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::FinishTrajectory(const int trajectory_id) {
|
bool Node::FinishTrajectory(const int trajectory_id) {
|
||||||
carto::common::MutexLocker lock(&mutex_);
|
carto::common::MutexLocker lock(&mutex_);
|
||||||
CHECK(is_active_trajectory_.at(trajectory_id));
|
return FinishTrajectoryUnderLock(trajectory_id);
|
||||||
map_builder_bridge_.FinishTrajectory(trajectory_id);
|
|
||||||
is_active_trajectory_[trajectory_id] = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::RunFinalOptimization() {
|
void Node::RunFinalOptimization() {
|
||||||
|
|
|
@ -54,8 +54,9 @@ class Node {
|
||||||
|
|
||||||
// Finishes all yet active trajectories.
|
// Finishes all yet active trajectories.
|
||||||
void FinishAllTrajectories();
|
void FinishAllTrajectories();
|
||||||
// Finishes a single given trajectory.
|
// Finishes a single given trajectory. Returns false if the trajectory did not
|
||||||
void FinishTrajectory(int trajectory_id);
|
// exist or was already finished.
|
||||||
|
bool FinishTrajectory(int trajectory_id);
|
||||||
|
|
||||||
// Runs final optimization. All trajectories have to be finished when calling.
|
// Runs final optimization. All trajectories have to be finished when calling.
|
||||||
void RunFinalOptimization();
|
void RunFinalOptimization();
|
||||||
|
@ -134,6 +135,7 @@ class Node {
|
||||||
bool ValidateTrajectoryOptions(const TrajectoryOptions& options);
|
bool ValidateTrajectoryOptions(const TrajectoryOptions& options);
|
||||||
bool ValidateTopicNames(const ::cartographer_ros_msgs::SensorTopics& topics,
|
bool ValidateTopicNames(const ::cartographer_ros_msgs::SensorTopics& topics,
|
||||||
const TrajectoryOptions& options);
|
const TrajectoryOptions& options);
|
||||||
|
bool FinishTrajectoryUnderLock(int trajectory_id) REQUIRES(mutex_);
|
||||||
|
|
||||||
const NodeOptions node_options_;
|
const NodeOptions node_options_;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue