ROS actionServer as nodelet
ROS actionServer as nodelet
我是ROS的新手,我正在尝试将操作服务器用作节点或至少在带有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);
}
};
}
nodelet 的初始化与节点不同。教程将节点移植到 nodelet 的一个要点是将代码从构造函数移动到 onInit((。无法在构造函数中启动操作服务器,因为 ROS 未正确初始化。
要使用 C++11 修复代码,首先需要在标头中声明操作服务器的onInit
和(唯一(指针mActionServer
:
public:
virtual void onInit() override;
private:
std::unique_ptr<actionlib::SimpleActionServer<my_local_mission_manager::MissionAction>> mActionServer;
现在,您需要使用 getNodeHandle
方法在正式初始化期间执行此操作,而不是在构造函数中初始化此操作服务器。从构造函数中删除所有代码并初始化节点,例如
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();
}
需要指向操作服务器的指针,因为初始化未在构造函数中完成。因此,您还需要更新现有代码的所有操作服务器调用。例如,您需要将mActionServer.setSucceeded(mResult);
更改为 mActionServer->setSucceeded(mResult);
。
相关文章:
- 为什么我会" void value not ignored as it ought to be"?
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 编译错误:"lvalue required as left operand of assignment" 不确定原因
- 如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这
- Atom gpp编译器给出"'C:UsersadminUser' is not recognized as an internal or..."错误
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- template<class T, int N> void h(T const(&)[N]); as friend function
- 我正在"void value not ignored as it ought to be"我该怎么办?
- "expression cannot be used as a function"回报声明
- OMNeT++ cPacket as std::bitset 以应用 Reed-Solomon 编码
- 函数如何在不这样做的情况下在新线程上运行"as if"?
- C++指针算术"lvalue required as left operand of assignment"错误
- 当调用时,为什么ranges ::累积的init as std :: Move(init)
- 如何在开关语句中使用 cin "as a parameter"
- regex_match as predicate
- 类型转换运算符重载与 as 非成员函数
- 我在 MinGW 和 VS 代码"g++ not recognized as a cmdlet..."时遇到构建错误
- SpinBoxDelegate displayed as a DoubleSpinBoxDelegate
- ROS actionServer as nodelet