Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include "ros/ros.h"
  2.  
  3. #include "kobuki_msgs/BumperEvent.h"
  4. #include "geometry_msgs/Twist.h"
  5.  
  6. #define TURNING_TIME 5.0
  7. #define BACKING_TIME 3.0
  8.  
  9. class BumpGo{
  10. public:
  11.  
  12.     BumpGo(): state_(GOING_FORWARD), pressed_(false)
  13.     {
  14.         sub_bumber_ = n_.subscribe("/mobile_base/events/bumper",1, &BumpGo::bumperCallback,this);
  15.         pub_vel_ = n_.advertise<geometry_msgs::Twist>("/mobile_base/commands/velocity",1);
  16.     }
  17.  
  18.     void bumperCallback(const kobuki_msgs::BumperEvent::ConstPtr& msg)
  19.     {
  20.         if(msg -> state == 1)
  21.         {
  22.         pressed_ = true;
  23.         }
  24.         else
  25.         {
  26.         pressed_ = false;
  27.         }
  28.     }
  29.  
  30.     void step()
  31.     {
  32.         geometry_msgs::Twist cmd;
  33.  
  34.         switch(state_)
  35.         {
  36.         case GOING_FORWARD:
  37.             cmd.linear.x = 0.2;
  38.             cmd.angular.z = 0;
  39.             if(pressed_)
  40.             {
  41.                 press_ts_ = ros::Time::now();
  42.                 state_ = GOING_BACK;
  43.                 ROS_INFO("GOING_FORWARD -> GOING_BACK");
  44.             }
  45.             break;
  46.  
  47.         case GOING_BACK:
  48.             cmd.linear.x = -0.2;
  49.             cmd.angular.z = 0;
  50.  
  51.             if((ros::Time::now()-press_ts_).toSec() > BACKING_TIME )
  52.             {
  53.                 turn_ts_ = ros::Time::now();
  54.                 state_ = TURNING;
  55.                 ROS_INFO("GOING_BACK -> TURNING");
  56.             }
  57.             break;
  58.  
  59.         case TURNING:
  60.             cmd.linear.x = 0;
  61.             cmd.angular.z = 0.33;
  62.             if((ros::Time::now()-turn_ts_).toSec() > TURNING_TIME )
  63.             {
  64.                 state_ = GOING_FORWARD;
  65.                 ROS_INFO("TURNING -> GOING_FORWARD");
  66.  
  67.             }
  68.             break;
  69.         }
  70.  
  71.         pub_vel_.publish(cmd);
  72.     }
  73.  
  74. private:
  75.     ros::NodeHandle n_;
  76.  
  77.     static const int GOING_FORWARD  = 0;
  78.     static const int GOING_BACK     = 1;
  79.     static const int TURNING        = 2;
  80.  
  81.     int state_;
  82.  
  83.     bool pressed_;
  84.  
  85.     ros::Time press_ts_;
  86.     ros::Time turn_ts_;
  87.  
  88.     ros::Subscriber sub_bumber_;
  89.     ros::Publisher pub_vel_;
  90. };
  91.  
  92.  
  93. int main(int argc, char **argv)
  94. {
  95.  
  96.     ros::init(argc, argv, "bumpgo");
  97.  
  98.     BumpGo bumpgo;
  99.  
  100.     ros::Rate loop_rate(20);
  101.  
  102.     while (ros::ok())
  103.     {
  104.         bumpgo.step();
  105.  
  106.         ros::spinOnce();
  107.         loop_rate.sleep();
  108.     }
  109.  
  110.  
  111.  
  112.     return 0;
  113.  
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement