АЛЕКСА РОС ГОЛОСОВАЯ КОМАНДА TURTLEBOT - PullRequest
0 голосов
/ 14 ноября 2018

Я смог интегрировать alexa в ROS, и в общих чертах это работает, проблема в том, что когда я посылаю команду alexa и она публикует тему, Turtlebot продолжает ее слушать, и, например, когда я говорю вперед, это не имеет большого значения, потому что я могу просто сказать черепашке остановиться, но я нахожу это проблемой, когда говорю «повернуть налево или повернуть направо», потому что он продолжает идти влево или вправо, я не уверен, как это решить .

Тип сообщений, которые я публикую = геометрия сообщений / твист

Мои идеи:

1- Создайте подписчика, который подписывается только на определенное время, затем закрывается и подписывается, когда публикуется новая команда.

Недостаток: для продвижения вперед потребовалось бы больше времени, чем для сторон, поэтому, возможно, это не решило бы проблему

2 - Создание подписчика, который подписывается, получает только одно сообщение, закрывается и подписывается, когда публикуется новое сообщение.

Недостаток: продвигаться вперед всего один раз, это не решило бы эту проблему, а только создало бы совершенно противоположную проблему

Я видел, что для второго случая я могу использовать это, но я не уверен, как это сделать.

  ros::topic::waitForMessage(..)

Код, который у меня есть для подписчика на данный момент, таков.

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

void cmd_vel_callback(const geometry_msgs::Twist& vel_cmd)
{ 
ROS_INFO("I heard: [%f]", vel_cmd.linear.y);
std::cout << "Twist Received " << std::endl;
}


int main( int argc, char* argv[] )
{
ros::init(argc, argv, "turtl" );

ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("/cmd_vel", 1000, cmd_vel_callback);

while( n.ok() ) 
{
ros::spin();
}

return 1;
}

1 Ответ

0 голосов
/ 21 ноября 2018

Ваша проблема в том, что вы не можете просто прекратить подписку и подписаться снова, что не оптимально.

есть 2 способа сделать это:

  1. вы можете удалить ros::spin() и используйте ros::spinOnce() попросить подписчика получить новые данные после того, как ваша предыдущая задача будет выполнена (вы сказали, что для продвижения вперед это занимает больше времени, а для сторон - короче), вы можете вызвать его после того, как сможете убедиться, что задача выполнена в любом месте кода.

  2. получить выходные данные от подписчика, сохранить их в другой переменной и добавить еще одну функцию управления внутри while(n.ok()), чтобы воздействовать на предыдущие данные или переходить на новые данные, полученные от подписчика.

...