【问题标题】:ALEXA ROS VOICE COMMAND TURTLEBOTALEXA ROS 语音命令龟甲
【发布时间】:2018-11-14 13:02:32
【问题描述】:

我已经能够将 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;
}

【问题讨论】:

    标签: alexa ros voice


    【解决方案1】:

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

    有两种方法可以做到这一点:

    1. 你可以删除ros::spin()并使用ros::spinOnce()在你之前的任务完成后要求订阅者获取新数据(你说向前移动需要更长的时间,而两边需要更短的时间)你可以在你之后调用它可以验证任务是否在代码中的任何位置完成。

    2. 从订阅者获取输出并将其存储在另一个变量中,并在您的while(n.ok()) 中添加另一个控制函数,以处理以前的数据或更改来自订阅者的新数据。

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多