无法从Python错误中绑定C++中的双向量数组:“M”未被捕获;py::bind_vector<vector<double>>(m,d[“gnss_测量”])

2024-05-19 01:44:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我是pybind11的新手,我想修改structs.h和structs.cpp,使其适用于vector>;,但我不能完全正确地理解它。有人能帮我吗

struct GPSdata可以工作,但是struct GNSS_测量不工作。我真的不知道如何修复它,但我知道我只需要在一行上做一些事情。。。帮助:(

我的结构

struct GPSdata
{
    float time;       // seconds
    double unix_sec;  // seconds in unix time reference
    double lat, lon;  // rad
    float alt;        // meter
    float vn, ve, vd; // m/sec
    int sats;
};

struct GNSS_measurement
{

    float time;       // seconds
    vector<vector<double>> gnss_measurement; 
    /*
        GNSS_measurements     GNSS measurement data:
        Column 1              Pseudo-range measurements (m)
        Column 2              Pseudo-range rate measurements (m/s)
        Columns 3-5           Satellite ECEF position (m)
        Columns 6-8           Satellite ECEF velocity (m/s)
    */
};

My structs.cpp

#include "structs.h"

#ifdef HAVE_PYBIND11

#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <pybind11/stl_bind.h>
#include <vector>

namespace py = pybind11;

PYBIND11_MODULE(structs, m) {
py::class_<GNSS_measurement>(m,"GNSS_measurement")
        .def(py::init<>())
    .def_readwrite("time", &GNSS_measurement::time)
    .def_readwrite("gnss_measurement", &GNSS_measurement::gnss_measurement)
        .def("as_dict",
             [](const GNSS_measurement &gnss) {
                 py::dict result;
                 result["time"] = gnss.time;
                 result["gnss_measument"]= gnss.gnss_measurement;
                 return result;
             }
         )
         .def("from_dict",
             [](GNSS_measurement &gnss, const py::dict &d) {
                 gnss.time = py::float_(d["time"]);
                 //gnss.gnss_measurement = py::float_(d["gnss_measurement"]);
                 gnss.gnss_measurement = py::bind_vector<vector<double>>(m,d["gnss_measurement"]);

             }
         )
        ;

    py::class_<GPSdata>(m, "GPSdata")
        .def(py::init<>())
    .def_readwrite("time", &GPSdata::time)
    .def_readwrite("lat", &GPSdata::lat)
    .def_readwrite("lon", &GPSdata::lon)
    .def_readwrite("alt", &GPSdata::alt)
    .def_readwrite("vn", &GPSdata::vn)
    .def_readwrite("ve", &GPSdata::ve)
    .def_readwrite("vd", &GPSdata::vd)
    .def_readwrite("sats", &GPSdata::sats)
        .def("as_dict",
             [](const GPSdata &gps) {
                 py::dict result;
                 result["time"] = gps.time;
                 result["unix_sec"] = gps.unix_sec;
                 result["lat"] = gps.lat;
                 result["lon"] = gps.lon;
                 result["alt"] = gps.alt;
                 result["vn"] = gps.vn;
                 result["ve"] = gps.ve;
                 result["vd"] = gps.vd;
                 result["sats"] = gps.sats;
                 return result;
             }
         )
        .def("from_dict",
             [](GPSdata &gps, const py::dict &d) {
                 gps.time = py::float_(d["time"]);
                 gps.unix_sec = py::float_(d["unix_sec"]);
                 gps.lat = py::float_(d["lat"]);
                 gps.lon = py::float_(d["lon"]);
                 gps.alt = py::float_(d["alt"]);
                 gps.vn = py::float_(d["vn"]);
                 gps.ve = py::float_(d["ve"]);
                 gps.vd = py::float_(d["vd"]);
                 gps.sats = py::int_(d["sats"]);
              }
         )
        ;
}

我得到的错误如下:

src/nav_common/structs.cpp:80:74:错误:未捕获“m” 80 | gnss.gnss_measurement=py::bind_vector>;(m,d[“gnss_measurement”); | ^ src/nav_common/structs.cpp:77:15:注意:lambda没有捕获默认值 77 |[](全球导航卫星系统测量和全球导航卫星系统,常数:dict和d){


Tags: pytimedefresultfloatdictgpsgnss
1条回答
网友
1楼 · 发布于 2024-05-19 01:44:55

我的一个朋友帮了我:)

const auto& outer_list=py::cast<py::list>(d["gnss_measurement"]);
                 for(auto& inner_list: outer_list)
                 {
                    vector<double> tmp;
                    for(auto val:inner_list)
                    {
                        tmp.push_back(py::cast<double>(val));
                    }
                    gnss.gnss_measurement.push_back(tmp);
                 }

相关问题 更多 >

    热门问题