ALEXA ROS VOICE COMMAND TURTLEBOT

时间:2018-11-14 13:02:32

标签: alexa ros voice

我已经能够将alexa集成到ROS中,并且总的来说它可以工作,问题是当我向alexa发送命令并发布一个主题时,turtlebot会继续收听它,例如,当我说向前,这没什么大不了的,因为我可以简单地告诉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 :(得分:0)

您的问题是您不能停止订阅并再次订阅,这不是最佳选择。

您可以通过两种方式进行此操作:

  1. 您可以删除ros::spin()并使用ros::spinOnce()要求订户在上一个任务完成后获取新数据(您说向前移动需要更长的时间,侧面需要更短的时间),您可以在您可以验证任务在代码中的任何位置完成之后,请调用它。

  2. 从订阅服务器获取输出,并将其存储在另一个变量中,并在while(n.ok())内添加另一个控制函数,以对先前数据进行操作或更改为来自订阅服务器的新数据。