Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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++ 露台没有开火_C++_Callback_Swig_Gazebo Simu - Fatal编程技术网

C++ 露台没有开火

C++ 露台没有开火,c++,callback,swig,gazebo-simu,C++,Callback,Swig,Gazebo Simu,我正在尝试编写一个小型库来连接Gazebo和Python(我尝试使用pygazebo库,但没有成功)。我试图从相机获得输出并找到四月标签,并使用C++中的Sigg代码将位置数据存储在类变量中,以便在Python中使用。我有一个独立的C++应用程序打印这些数据,但是我不能让它在一个类中工作。从我的测试行sub=node->Subscribe(IMAGE\u主题,&april::callback,this)可能是问题所在。代码包括在下面 gazeboApril.cpp #include "gazeb

我正在尝试编写一个小型库来连接Gazebo和Python(我尝试使用pygazebo库,但没有成功)。我试图从相机获得输出并找到四月标签,并使用C++中的Sigg代码将位置数据存储在类变量中,以便在Python中使用。我有一个独立的C++应用程序打印这些数据,但是我不能让它在一个类中工作。从我的测试行
sub=node->Subscribe(IMAGE\u主题,&april::callback,this)可能是问题所在。代码包括在下面

gazeboApril.cpp

#include "gazeboApril.hpp"

april::april(void) {
    this->tag_size = (0.3 * (8.0 / 10.0)) / 2.0;
    apriltag_family_t *tf = tag36h11_create();
    this->td = apriltag_detector_create();
    apriltag_detector_add_family(this->td, tf);
    gazebo::client::setup();
    gazebo::transport::NodePtr node(new gazebo::transport::Node());
    gazebo::transport::SubscriberPtr sub;
    node->Init();
    sub = node->Subscribe(IMAGE_TOPIC, &april::callback, this);
}

void april::callback(ConstImageStampedPtr &msg) {
    int width;
    int height;
    char *data;

    width = (int) msg->image().width();
    height = (int) msg->image().height();
    data = new char[msg->image().data().length() + 1];

    memcpy(data, msg->image().data().c_str(), msg->image().data().length());
    cv::Mat image(height, width, CV_8UC3, data);

    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    image_u8_t im = { .width = gray.cols,
        .height = gray.rows,
        .stride = gray.cols,
        .buf = gray.data
    };
    zarray_t *detections = apriltag_detector_detect(td, &im);
    apriltag_detection *det;
    this->id.resize(zarray_size(detections));
    this->d.resize(zarray_size(detections));
    this->theta.resize(zarray_size(detections));
    for (int i = 0; i < zarray_size(detections); i++) {
        zarray_get(detections, i, &det);
        this->id.at(i) = det->id;
        matd_t *pose = homography_to_pose(det->H, -1108.77, 1108.77, 1280 / 2, 720 / 2);
        this->d.at(i) = this->tag_size * sqrt(pow(MATD_EL(pose, 0, 3), 2) + pow(MATD_EL(pose, 2, 3), 2));
        this->theta.at(i) = atan2(MATD_EL(pose, 0, 3), MATD_EL(pose, 2, 3));
    }
    delete data;
}

void april::stop(void) {
    gazebo::client::shutdown();
}
#包括“gazeboApril.hpp”
四月:四月(作废){
这个->标签大小=(0.3*(8.0/10.0))/2.0;
apriltag_family_t*tf=tag36h11_create();
这->td=apriltag_detector_create();
apriltag\u探测器\u添加\u系列(此->td,tf);
gazebo::client::setup();
gazebo::transport::NodePtr节点(新的gazebo::transport::node());
gazebo::transport::SubscriberPtr sub;
node->Init();
sub=node->Subscribe(IMAGE\u主题,&april::callback,this);
}
无效四月::回调(ConstImageStampedPtr&msg){
整数宽度;
内部高度;
字符*数据;
宽度=(int)msg->image().width();
高度=(int)msg->image().height();
数据=新字符[msg->image().data().length()+1];
memcpy(data,msg->image().data().c_str(),msg->image().data().length());
cv::Mat图像(高度、宽度、cv_8UC3、数据);
cv::席灰色;
cv::cvtColor(图像,灰色,cv::COLOR_bgr2灰色);
image_u8_t im={.width=gray.cols,
.高度=灰色。行,
.stride=gray.cols,
.buf=gray.data
};
zarray_t*检测=apriltag_检测器_检测(td和im);
apriltag_检测*det;
这->id.resize(zarray_大小(检测));
这->d.resize(zarray_大小(检测));
这->θ.resize(zarray_大小(检测));
对于(int i=0;iid.at(i)=数据->id;
matd_t*pose=单应性_to_pose(det->H,-1108.771108.771280/2720/2);
这个->d.at(i)=这个->标签大小*sqrt(pow(MATD_EL(姿势,0,3),2)+pow(MATD_EL(姿势,2,3),2));
这->θ.at(i)=atan2(MATD_EL(姿势,0,3),MATD_EL(姿势,2,3));
}
删除数据;
}
无效四月::停止(无效){
gazebo::client::shutdown();
}
gazeboApril水电站

#include <vector>

#include <gazebo/gazebo_client.hh>
#include <gazebo/msgs/msgs.hh>
#include <gazebo/transport/transport.hh>

#include <opencv2/opencv.hpp>

#include "apriltag.h"
#include "tag36h11.h"
#include "common/homography.h"

#pragma once

#define IMAGE_TOPIC "/gazebo/default/pioneer3at/camera/link/camera/image"

class april {
public:
    april(void);
    void stop(void);
public:
    void callback(ConstImageStampedPtr &msg);
public:
    std::vector<int> id;
    std::vector<double> d;
    std::vector<double> theta;
protected:
    apriltag_detector_t *td;
    double tag_size;
};
#包括
#包括
#包括
#包括
#包括
#包括“apriltag.h”
#包括“tag36h11.h”
#包括“公共/单应性.h”
#布拉格语一次
#定义图像主题“/gazebo/default/preoner3at/camera/link/camera/IMAGE”
四月班{
公众:
4月(无效);
无效停止(void);
公众:
无效回调(ConstImageStampedPtr&msg);
公众:
std::向量id;
std::载体d;
向量θ;
受保护的:
apriltag_探测器_t*td;
双标签尺寸;
};
gazeboApril.i

%module gazeboApril
%include "typemaps.i"
%include "std_vector.i"
namespace std {
    %template(IntVector) vector<int>;
    %template(DoubleVector) vector<double>;
};
%{
#include <Python.h>
#include "gazeboApril.hpp"
%}
%naturalvar april::id;
%naturalvar april::d;
%naturalvar april::theta;
%include "gazeboApril.hpp"
%module gazeboApril
%包括“typemaps.i”
%包括“标准向量i”
名称空间标准{
%模板(IntVector)向量;
%模板(双向量)向量;
};
%{
#包括
#包括“gazeboApril.hpp”
%}
%naturalvar april::id;
%自然四月:d;
%四月自然风:θ;
%包括“gazeboApril.hpp”

您需要将
节点::Subscribe的返回值设置为局部变量并保留它


在调用
SubscribePtr
的析构函数之前,您只能一直订阅该主题。在您的示例中,
sub
变量是构造函数的本地变量,因此您可以在构造函数离开后立即取消订阅。

如果不提供更多信息,您将无法获得任何有意义的答案。你有什么错误?编译错误还是运行时错误?请提供尽可能多的信息。我没有错误。它可以编译和运行,但从未调用回调函数。您能显示您正在使用的接口文件吗?问题已更新为包含SWIG接口文件。我也有同样的问题。你有没有想过?