Я смог интегрировать 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;
}