Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ROS actionServer作为节点_C++_Ros - Fatal编程技术网

C++ ROS actionServer作为节点

C++ ROS actionServer作为节点,c++,ros,C++,Ros,我是ROS的新手,我尝试将actionserver用作nodelet,或者至少在包含nodelet的包中使用。 这可能吗? 如果不是,在不需要调用主函数的情况下运行actionServer的正确方法是什么 我尝试使用并将其修改为节点集,但看不到命中率 下面是我为测试编写的类: #include "ros/ros.h" #include "std_msgs/String.h" #include "std_msgs/Float32MultiArray.h" #include <vector&g

我是ROS的新手,我尝试将actionserver用作nodelet,或者至少在包含nodelet的包中使用。 这可能吗? 如果不是,在不需要调用主函数的情况下运行actionServer的正确方法是什么

我尝试使用并将其修改为节点集,但看不到命中率

下面是我为测试编写的类:

#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Float32MultiArray.h"
#include <vector>
#include "my_action_server.h"

//Nodelet dependencies
#include <pluginlib/class_list_macros.h>
PLUGINLIB_EXPORT_CLASS(my_local_mission_manager::myMissionActionServer, nodelet::Nodelet)

namespace my_local_mission_manager
{

void myMissionActionServer::onInit()
{
    ROS_INFO_STREAM("Starting my Mission Action Server Log Node");
}

myMissionActionServer::myMissionActionServer(std::string missionName) : mActionServer(mNH, missionName, boost::bind(&myMissionActionServer::executeMissionCallBack, this, _1), false),
                                                     mActionName(missionName)
{
    mActionServer.start();
}

myMissionActionServer::~myMissionActionServer(void)
{
    ROS_INFO_STREAM("Done - MissionAction");
}

void myMissionActionServer::executeMissionCallBack(const my_local_mission_manager::missionGoalConstPtr &goal)
{
    // helper variables
    int start = 0;
    ros::Rate r(1);
    bool success = true;

    for (int i = 0; i <= goal->demo_goal; i++)
    {
        if (mActionServer.isPreemptRequested() || !ros::ok())
        {
            ROS_INFO("%s: Preempted", mActionName.c_str());
            // set the action state to preempted
            mActionServer.setPreempted();
            success = false;
            break;
        }
        mFeedback.demo_feedback = i;
        mActionServer.publishFeedback(mFeedback); //publish the feedback

        r.sleep(); // this sleep is not necessary - debug and demo purpose
    }
    if (success)
    {
        mResult.demo_result = mFeedback.demo_feedback;
        ROS_INFO("%s: Succeeded", mActionName.c_str());
        // set the action state to succeeded
        mActionServer.setSucceeded(mResult);
    }
};
}
#包括“ros/ros.h”
#包括“标准msgs/String.h”
#包括“std_msgs/Float32MultiArray.h”
#包括
#包括“my_action_server.h”
//节点依赖关系
#包括
PLUGINLIB\u导出类(我的本地任务管理器::我的任务操作服务器,nodelet::nodelet)
名称空间my_local_mission_manager
{
void mymissionserver::onInit()
{
ROS_信息流(“启动我的任务行动服务器日志节点”);
}
MyMissionServer::MyMissionServer(std::string missionName):mActionServer(mNH,missionName,boost::bind(&MyMissionServer::executeMissionCallBack,this,_1),false),
mActionName(任务名称)
{
mActionServer.start();
}
myMissionActionServer::~myMissionActionServer(无效)
{
ROS_信息流(“完成任务”);
}
void myMissionActionServer::executeMissionCallBack(const my_local_mission_manager::MissiongOALConstr&goal)
{
//辅助变量
int start=0;
ros:速率r(1);
布尔成功=真;
对于(int i=0;i demo\u目标;i++)
{
if(mActionServer.ispremptRequested()| |!ros::ok())
{
ROS_信息(“%s:Preempted”,mActionName.c_str());
//将操作状态设置为抢占
mActionServer.setPreempted();
成功=错误;
打破
}
mFeedback.demo_feedback=i;
mActionServer.publishFeedback(MFFeedback);//发布反馈
r、 sleep();//此睡眠不是必需的-用于调试和演示
}
如果(成功)
{
mResult.demo_结果=mFeedback.demo_反馈;
ROS_INFO(“%s:successed”,mActionName.c_str());
//将操作状态设置为Successed
mActionServer.setSucceeded(mResult);
}
};
}

节点元素的初始化与节点不同。本教程的一个要点是将代码从构造函数移动到onInit()。由于ROS未正确初始化,因此无法在构造函数中启动操作服务器

要使用C++11修复代码,首先需要在头中声明操作服务器的
onInit
和(唯一)指针
mActionServer

public:
    virtual void onInit() override;

private:
    std::unique_ptr<actionlib::SimpleActionServer<my_local_mission_manager::MissionAction>> mActionServer;
需要指向操作服务器的指针,因为初始化不是在构造函数中完成的。因此,您还需要更新现有代码的所有操作服务器调用。例如,您需要更改
mActionServer.setSucceeded(mResult)
mActionServer->setSucceeded(mResult)

void MyMissionActionServer::onInit()
{
  ROS_INFO_STREAM("Starting my Mission Action Server Log Node");
  ros::NodeHandle nh = getNodeHandle();
  mActionServer = std::unique_ptr<actionlib::SimpleActionServer<my_local_mission_manager::MissionAction>>(
      new actionlib::SimpleActionServer<my_local_mission_manager::MissionAction>(
          nh, mActionName.c_str(), std::bind(&MyMissionActionServer::executeMissionCallBack, this, std::placeholders::_1), false));
  mActionServer->start();
}