我正在遵循this tutorial并为我现有的ROS节点编写ROS nodelet Package 器类。但是当我运行test_nodelet.cpp
时,每次尝试访问基类时,我都收到以下错误。我应该如何初始化TestNode
?有人能给我指出正确的方向吗?
节点小程序:/usr/include/boost/智能指针/共享指针。hpp:734:类型名称增强::详细信息::sp成员访问::类型增强::共享指针::运算符-〉()常量[其中T = test::TestNode;类型名称增强::详细信息::sp成员访问::类型=测试::测试节点 *]:Assert“px!= 0”失败。
下面是我的头文件test.h:
#ifndef TEST_NODE_H_
#define TEST_NODE_H_
#include <test/TuningConfig.h>
#include <cv_bridge/cv_bridge.h>
#include <dynamic_reconfigure/server.h>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/RegionOfInterest.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/opencv.hpp>
namespace test {
class TestNode {
public:
TestNode(const std::string& cameraName);
static TestNode& GetInstance(const std::string& cameraName = "");
bool init();
private:
ros::NodeHandle nh;
ros::Subscriber imageSub;
ros::Publisher imagePub;
void InputImageCallback(const sensor_msgs::Image::ConstPtr& msg);
const std::string cameraName;
};
} // namespace test
#endif // TEST_NODE_H_
我的ROS节点看起来像下面的test_node.cpp:
#include <test/test_node.h>
namespace test {
TestNode& TestNode::GetInstance(const std::string& cameraName) {
static TestNode instance(cameraName);
return instance;
}
TestNode::TestNode(const std::string& cameraName)
: cameraName(cameraName), nh(){};
bool TestNode::init() {
imageSub = nh.subscribe(cameraName + "/image_raw", 10, &TestNode::InputImageCallback, this);
imagePub = nh.advertise<sensor_msgs::Image>(cameraName + "/final_image", 100);
return true;
}
void TestNode::InputImageCallback(const sensor_msgs::Image::ConstPtr& msg) {
cv_bridge::CvImageConstPtr cvPtr = cv_bridge::toCvShare(msg, sensor_msgs::image_encodings::BGR8);
TestNode::GetInstance().SetCurrentImage(cvPtr->image);
}
}
现在我尝试用下面的方式将测试类 Package 在nodelet类中(test_nodelet. cpp)-
#include "test/test_node.h"
#include "nodelet/nodelet.h"
#include "pluginlib/class_list_macros.h"
namespace test {
class TestNodelet : public nodelet::Nodelet {
public:
TestNodelet(){};
~TestNodelet(){}
virtual void onInit() {
ros::NodeHandle& nh = this->getPrivateNodeHandle();
std::string name = nh.getUnresolvedNamespace();
int pos = name.find_last_of('/');
name = name.substr(pos + 1);
if (node_->init()) {
NODELET_INFO_STREAM("Initialised. [" << name << "]");
} else {
NODELET_ERROR_STREAM("Couldn't initialise. ["<< name << "]");
}
}
private:
boost::shared_ptr<test::TestNode> node_;
};
} // namespace test
PLUGINLIB_EXPORT_CLASS(test::TestNodelet, nodelet::Nodelet);
1条答案
按热度按时间rqmkfv5c1#
我认为代码的问题似乎是TestNodelet类中的node_ member变量在onInit()函数中访问之前没有初始化。您需要示例化TestNode的一个示例并将其赋给node_。