我已经能够将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;
}
答案 0 :(得分:0)
您的问题是您不能停止订阅并再次订阅,这不是最佳选择。
您可以通过两种方式进行此操作:
您可以删除ros::spin()
并使用ros::spinOnce()
要求订户在上一个任务完成后获取新数据(您说向前移动需要更长的时间,侧面需要更短的时间),您可以在您可以验证任务在代码中的任何位置完成之后,请调用它。
从订阅服务器获取输出,并将其存储在另一个变量中,并在while(n.ok())
内添加另一个控制函数,以对先前数据进行操作或更改为来自订阅服务器的新数据。