|
@@ -500,6 +500,11 @@ void WorkflowManager::transitionToRotating()
|
|
|
|
|
|
|
|
// 停止旋转检查定时器
|
|
// 停止旋转检查定时器
|
|
|
stopRotationTimer();
|
|
stopRotationTimer();
|
|
|
|
|
+
|
|
|
|
|
+ // 关键修复:进入旋转状态时,停止搜索超时定时器
|
|
|
|
|
+ stopSearchTimeoutTimer();
|
|
|
|
|
+
|
|
|
|
|
+ RCLCPP_INFO(node_->get_logger(), "已停止搜索超时定时器,进入旋转搜索模式");
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -570,11 +575,23 @@ void WorkflowManager::transitionToCharging()
|
|
|
try
|
|
try
|
|
|
{
|
|
{
|
|
|
if (current_state_ == WheelchairState::SEARCHING ||
|
|
if (current_state_ == WheelchairState::SEARCHING ||
|
|
|
- current_state_ == WheelchairState::WALKING)
|
|
|
|
|
|
|
+ current_state_ == WheelchairState::WALKING ||
|
|
|
|
|
+ current_state_ == WheelchairState::ROTATING) // 增加旋转状态
|
|
|
{
|
|
{
|
|
|
setState(WheelchairState::CHARGING);
|
|
setState(WheelchairState::CHARGING);
|
|
|
RCLCPP_INFO(node_->get_logger(), "开始充电");
|
|
RCLCPP_INFO(node_->get_logger(), "开始充电");
|
|
|
|
|
+
|
|
|
|
|
+ // 停止所有定时器
|
|
|
stopSearchTimeoutTimer();
|
|
stopSearchTimeoutTimer();
|
|
|
|
|
+ stopRotationTimer();
|
|
|
|
|
+
|
|
|
|
|
+ // 如果正在旋转,停止旋转
|
|
|
|
|
+ if (rotation_manager_ && rotation_manager_->isRotating())
|
|
|
|
|
+ {
|
|
|
|
|
+ rotation_manager_->stopRotation();
|
|
|
|
|
+ RCLCPP_INFO(node_->get_logger(), "停止旋转,开始充电");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
publishState("CHARGING_START");
|
|
publishState("CHARGING_START");
|
|
|
|
|
|
|
|
// 发布回充成功通知
|
|
// 发布回充成功通知
|
|
@@ -593,13 +610,18 @@ void WorkflowManager::transitionToReady()
|
|
|
{
|
|
{
|
|
|
std::string previous_state = getCurrentState();
|
|
std::string previous_state = getCurrentState();
|
|
|
setState(WheelchairState::READY);
|
|
setState(WheelchairState::READY);
|
|
|
|
|
+
|
|
|
|
|
+ // 停止所有定时器
|
|
|
stopSearchTimeoutTimer();
|
|
stopSearchTimeoutTimer();
|
|
|
stopRotationTimer();
|
|
stopRotationTimer();
|
|
|
|
|
+
|
|
|
// 如果正在旋转,停止旋转
|
|
// 如果正在旋转,停止旋转
|
|
|
if (rotation_manager_ && rotation_manager_->isRotating())
|
|
if (rotation_manager_ && rotation_manager_->isRotating())
|
|
|
{
|
|
{
|
|
|
rotation_manager_->stopRotation();
|
|
rotation_manager_->stopRotation();
|
|
|
|
|
+ RCLCPP_INFO(node_->get_logger(), "停止旋转,返回到就绪状态");
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
RCLCPP_INFO(node_->get_logger(), "返回到就绪状态 (前状态: %s)",
|
|
RCLCPP_INFO(node_->get_logger(), "返回到就绪状态 (前状态: %s)",
|
|
|
previous_state.c_str());
|
|
previous_state.c_str());
|
|
|
publishState("WHEELCHAIR_READY");
|
|
publishState("WHEELCHAIR_READY");
|
|
@@ -1032,6 +1054,10 @@ void WorkflowManager::handleSearchTimeoutEvent()
|
|
|
{
|
|
{
|
|
|
RCLCPP_INFO(node_->get_logger(), "处理搜索超时事件");
|
|
RCLCPP_INFO(node_->get_logger(), "处理搜索超时事件");
|
|
|
|
|
|
|
|
|
|
+ // 记录当前状态,便于调试
|
|
|
|
|
+ std::string current_state_str = getCurrentState();
|
|
|
|
|
+ RCLCPP_INFO(node_->get_logger(), "搜索超时发生时的状态: %s", current_state_str.c_str());
|
|
|
|
|
+
|
|
|
// 搜索超时30秒视为回充失败
|
|
// 搜索超时30秒视为回充失败
|
|
|
RCLCPP_WARN(node_->get_logger(), "搜索30秒超时,回充失败");
|
|
RCLCPP_WARN(node_->get_logger(), "搜索30秒超时,回充失败");
|
|
|
|
|
|
|
@@ -1134,6 +1160,7 @@ void WorkflowManager::emergencyTransitionToReady(const std::string &reason)
|
|
|
rotation_check_timer_->cancel();
|
|
rotation_check_timer_->cancel();
|
|
|
rotation_check_timer_.reset();
|
|
rotation_check_timer_.reset();
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
// 停止旋转
|
|
// 停止旋转
|
|
|
if (rotation_manager_ && rotation_manager_->isRotating())
|
|
if (rotation_manager_ && rotation_manager_->isRotating())
|
|
|
{
|
|
{
|
|
@@ -1266,31 +1293,32 @@ void WorkflowManager::searchTimeoutCallback()
|
|
|
{
|
|
{
|
|
|
try
|
|
try
|
|
|
{
|
|
{
|
|
|
- if (current_state_ == WheelchairState::SEARCHING ||
|
|
|
|
|
- current_state_ == WheelchairState::ROTATING)
|
|
|
|
|
|
|
+ // 只在搜索状态下处理搜索超时,旋转状态由RotationManager处理
|
|
|
|
|
+ if (current_state_ == WheelchairState::SEARCHING)
|
|
|
{
|
|
{
|
|
|
- double total_search_time = 0.0;
|
|
|
|
|
-
|
|
|
|
|
- if (current_state_ == WheelchairState::SEARCHING)
|
|
|
|
|
- {
|
|
|
|
|
- total_search_time = (node_->now() - search_start_time_).seconds();
|
|
|
|
|
- }
|
|
|
|
|
- else if (current_state_ == WheelchairState::ROTATING && rotation_manager_)
|
|
|
|
|
- {
|
|
|
|
|
- // 计算总搜索时间:搜索时间 + 旋转时间
|
|
|
|
|
- double search_duration = 10.0; // 搜索了10秒后才开始旋转
|
|
|
|
|
- double rotation_duration = rotation_manager_->getRotationDuration();
|
|
|
|
|
- total_search_time = search_duration + rotation_duration;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ double total_search_time = (node_->now() - search_start_time_).seconds();
|
|
|
|
|
|
|
|
RCLCPP_WARN(node_->get_logger(),
|
|
RCLCPP_WARN(node_->get_logger(),
|
|
|
- "总搜索时间 %.1f 秒超时(包括旋转),回充失败",
|
|
|
|
|
|
|
+ "搜索 %.1f 秒超时,回充失败",
|
|
|
total_search_time);
|
|
total_search_time);
|
|
|
handleSearchTimeoutEvent();
|
|
handleSearchTimeoutEvent();
|
|
|
}
|
|
}
|
|
|
|
|
+ else if (current_state_ == WheelchairState::ROTATING)
|
|
|
|
|
+ {
|
|
|
|
|
+ // 旋转状态不应该触发搜索超时,这应该是个bug
|
|
|
|
|
+ RCLCPP_ERROR(node_->get_logger(),
|
|
|
|
|
+ "错误:旋转状态下触发了搜索超时回调!当前状态: %s",
|
|
|
|
|
+ getCurrentState().c_str());
|
|
|
|
|
+
|
|
|
|
|
+ // 停止搜索超时定时器
|
|
|
|
|
+ stopSearchTimeoutTimer();
|
|
|
|
|
+ RCLCPP_INFO(node_->get_logger(), "已纠正:停止旋转状态下的搜索超时定时器");
|
|
|
|
|
+ }
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- RCLCPP_DEBUG(node_->get_logger(), "搜索超时定时器触发,但当前不在搜索状态");
|
|
|
|
|
|
|
+ RCLCPP_DEBUG(node_->get_logger(),
|
|
|
|
|
+ "搜索超时定时器触发,但当前不在搜索状态: %s",
|
|
|
|
|
+ getCurrentState().c_str());
|
|
|
stopSearchTimeoutTimer();
|
|
stopSearchTimeoutTimer();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|