[ros-users] how to send a simple navigation goal to the robot?

Jolin Jia pplin86 at gmail.com
Thu Nov 4 07:06:55 UTC 2010


Hi,

I am learning sending a simple navigation goal to the robot in the website
of http://www.ros.org/wiki/navigation/Tutorials/SendingSimpleGoals. And I
found the simple_navigation_goals package is just the client. There must be
a server. So I write the code of server, but I am shamed that I don't very
understand the operating mechanism of the server. The file for the server is
as following:
=======================================simple_navigation_server.cpp==============================
#include <ros/ros.h>
#include <move_base_msgs/MoveBaseAction.h>
#include <actionlib/server/simple_action_server.h>
#include <geometry_msgs/PoseStamped.h>
#include "geometry_msgs/Twist.h"
class simple_server
{
public:
  simple_server(std::string name):as_(nh_,name),action_name_(name)
  {
    // Register the goal and feeback callbacks
    as_.registerGoalCallback(boost::bind(&simple_server::goalCB, this));
    as_.registerPreemptCallback(boost::bind(&simple_server::preemptCB,
this));
    sub_ =
nh_.subscribe("/random_number",1,&simple_server::analysisCB,this);
    cmd.linear.x = cmd.linear.y = cmd.angular.z = 0;

    // 广播命令
    cmd_pub_ = nh_.advertise<geometry_msgs::Twist>("/p3robot/cmd",1);
  }
  void goalCB()
  {
    ROS_INFO("%s : received a new goal",action_name_.c_str());
    as_.acceptNewGoal();
    ROS_INFO("end of receiving the new goal");
  }
  void preemptCB()
  {
    ROS_INFO("%s : preempted",action_name_.c_str());
    as_.setPreempted();
  }
  void analysisCB(const geometry_msgs::PoseStamped::ConstPtr& msg)
  {
    ROS_INFO("get in analysisCB");
    if(!as_.isActive())
      return;
    //feedback_.feedback.base_position.header = msg->header;
    //feedback_.feedback.base_position.pose.position.x =
msg->pose.position.x;
    //feedback_.feedback.base_position.pose.orientation.w =
msg->pose.orientation.w;
    cmd.linear.x = msg->pose.position.x;
    ROS_INFO("the position value is %d \n ",msg->pose.position.x);
    cmd_pub_.publish(cmd);
    //as_.setSucceeded(result_);
  }
protected:
  ros::NodeHandle nh_;
  actionlib::SimpleActionServer<move_base_msgs::MoveBaseAction> as_;
  std::string action_name_;
  geometry_msgs::PoseStamped goal_;
  move_base_msgs::MoveBaseActionFeedback feedback_;
  move_base_msgs::MoveBaseActionResult result_;
  ros::Subscriber sub_;

  ros::Publisher cmd_pub_;

  geometry_msgs::Twist cmd;
};

int main(int argc, char** argv)
{
  ros::init(argc,argv,"simple_server");
  simple_server serverInstance("move_base");
  ros::spin();

  return 0;
}
============================end of the file=================================

When I type "roscore"、 "rosrun simple_navigation_goals
simple_navigation_server
"、 "rosrun simple_navigation_goals simple_navigation_goals",I can find that
the client has sending a goal, and the server can receive the goal, but it
can't enter into the function of "preemptCB" and "analysisCB", that's to say
I can't publish the "/p3robot/cmd" cmd. I think there must be some problem
in the server file.

Then I am trying another way. I find the "move_base" package is really a
server. But when I type "rosrun move_base move_base" and "rosrun
simple_navigation_goals simple_navigation_goals", I find the client always
gets the "Waiting for the move_base action server to come up" outputs. This
means the client can't get touched the server. But the "move_base" node is
really a server named "move_server". What is the problem?

Thanks in advanced!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osuosl.org/pipermail/ros-users/attachments/20101104/406eebcd/attachment-0002.html>


More information about the ros-users mailing list