【问题标题】:Callback fuction is not getting called回调函数没有被调用
【发布时间】:2020-09-06 15:48:12
【问题描述】:

我正在尝试用 c++ 实现 ROS GotoGoal,这是代码

#include "ros/ros.h"
#include "geometry_msgs/Twist.h"
#include "geometry_msgs/Pose2D.h"
#include "turtlesim/Pose.h"

class Turtle {

public :
  Turtle(int argc,char** argv){
    ros::init(argc,argv,"mover");
    ros::NodeHandle n;
    pose = turtlesim::Pose();
    pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 100);
    sub = n.subscribe("/turtle1/pose", 100, &Turtle::Update, this);
  }

  void Update(const turtlesim::Pose::ConstPtr& msg){
    ROS_INFO("Pose recieved : x = %f y = %f\n", msg->x, msg->y );
    pose = *msg;
  }

  void move2goal(){
    turtlesim::Pose goalPose= turtlesim::Pose() ;
    
    std::cout<<"Enter goal x : "<<" ";
    std::cin>>goalPose.x ;
    std::cout<<"Enter goal y : "<<" ";
    std::cin>>goalPose.y ;
    
    float d ;
    std::cout<<"Enter distance tolerance d : "<<" ";
    std::cin>>d ;
    
    auto vel_msg = geometry_msgs::Twist() ;
    ros::Rate loop_rate(2.0);
    while(distance(goalPose)>=d && ros::ok()){
      vel_msg.linear.x = linear_velocity(goalPose,1.5); 
      vel_msg.linear.y =0 ;
      vel_msg.linear.z = 0 ;
      
      vel_msg.angular.x = 0 ;
      vel_msg.angular.y= 0 ;
      vel_msg.angular.z = angular_velocity(goalPose,6) ;
      
      pub.publish(vel_msg) ;
      loop_rate.sleep() ; 
 ROS_INFO("current : %f %f\n",pose.x,pose.y) ;  
 }
    vel_msg.angular.z=0 ;
    vel_msg.linear.x =0 ;
    pub.publish(vel_msg) ;
    ros::spin();
  }

  ros::Publisher pub;
  ros::Subscriber sub;
  turtlesim::Pose pose;
  int ch = 0;
};

int main(int argc, char** argv) {
  Turtle turtle = Turtle(argc,argv);
  turtle.move2goal();
  return 0;
}

但是 Update 回调函数没有被调用,并且由于姿势没有得到更新,乌龟正在绕圈移动。我尝试使用 ROS_INFO 来调试问题,但没有任何效果。 我在这里做错了什么? 注意:由于 stackoverflow 的政策,一些函数的实现已从代码 sn-p 中删除。

[输出][1] [1]:https://i.stack.imgur.com/eL9Sr.png

【问题讨论】:

  • 为我工作。请添加您的主要功能。
  • ``` int main(int argc, char** argv){ Turtle turtle = Turtle(argc,argv) ; turtle.move2lgoal() ;}```
  • 有一个cin。你输入什么?代码能走多远?您是否在其他任何地方放置了任何调试语句?你的问题真的会受益于这样的更多细节。
  • cin 语句用于从控制台获取目标位置 (x,y)。我在更新回调函数中添加了一条调试语句,并在循环结束时添加了一条
  • 顺便说一句,我尝试实现这个wiki.ros.org/turtlesim/Tutorials/Go%20to%20Goal

标签: c++ c++14 ros robotics gazebo-simu


【解决方案1】:

我想你误解了 sleep 的作用。与spin 不同,它实际上并不执行所有的 ROS 通信事件。这只是准确睡眠的便利。见Difference between spin and rate.sleep in ROS

幸运的是,修复非常简单,只需添加一个spinOnce

while( distance(goalPose) >= d && ros::ok()) {
  // (..)
  ros::spinOnce();
  loop_rate.sleep();
}

【讨论】:

猜你喜欢
  • 2017-07-26
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多