ROS2 вызывает сервис в рамках обратного вызова самостоятельной службы?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 ROS2 вызывает сервис в рамках обратного вызова самостоятельной службы?

Сообщение Anonymous »

Я использую Ros-humble.
Я пытаюсь воспроизвести учебник по последовательности Movement здесь: https://github.com/moveit/moveit2_tutor ... xtence.cpp> Создайте сервис, похожий на этот узел. Контекст заключается в том, что тип сообщения, который я получаю, не имеет правильного формата, чтобы вызвать службу последовательности GetMotion. Таким образом, мой узел - это услуга, которая получает сообщение и переформирует его в BE SESHERGENCEREQUESTEQUEST. При создании запроса он должен вызвать службу последовательности GetMotion и спланировать движение, т. Е. Я пытаюсь гнезд вызовов последовательности GetMotion в рамках обратной связи MyCustomService < /p>
Проблема, с которой я сталкиваюсь, относится к спине (более конкретно ожидающему результату GetMotionSectence): < /p>

Код: Выделить всё

void my_custom_callback(const std::shared_ptr msg,
std::shared_ptr success){
// Do some magic with msg
...
// Call GetMotionSequence
motion_sequence_service_future = motion_sequence_service_client_->async_send_request(
motion_sequence_service_request);

// Wait for the result (here I'm getting issues)
std::future_status service_status;
do
{
switch (service_status = service_future.wait_for(std::chrono::seconds(1)); service_status)
{
case std::future_status::deferred:
RCLCPP_ERROR(LOGGER, "Deferred");
break;
case std::future_status::timeout: // it gets caught here
RCLCPP_INFO(LOGGER, "Waiting for trajectory plan...");
break;
case std::future_status::ready:
RCLCPP_INFO(LOGGER, "Service ready!");
break;
}
} while (service_status != std::future_status::ready);

...

}
Из того, что я понимаю, поскольку я выполняю это в рамках обратного вызова mycustomservice, GetMotion Secute никогда не готова, и она застряла в std :: future_status :: timeout .
Я пытался сделать это классическим способом, используя rclcpp :: spin_until_future кода выполняется в рамках обратного вызова моего узла сервера, который сам вращается в основном с executor.spin () ).
Моя последняя попытка заставить это работать, было использовать перегрузку async_send_request :
motion_sequence_service_client_->async_send_request(
motion_sequence_service_request,
[success](rclcpp::Client::SharedFuture future){
auto response = future.get();
...
}
);
< /code>
Чтобы создать ответ MyCustomService с лямбдой, чтобы не было тупика. Проблема заключается в том, что это приводит к тому, что реакция MyCustomService будет писать слишком поздно, а клиент, который отправляет необразованные данные, не получает правильного ответа (успех), даже если нет тупика, и планирование движения было успешным.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... ed-service
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»