Не удалось связать двойной векторный массив в C ++ из-за ошибки python: 'm' не захватывается; py :: bind_vector (m, d ["gnss_measurement"]) - PullRequest
0 голосов
/ 17 июня 2020

Я новичок в pybind11 и хочу изменить Structs.h и Structs. cpp, чтобы он работал с вектором>, но я не могу понять это правильно. Кто-нибудь может мне помочь?

Структура GPSdata работает, но структура GNSS_measurement не работает. Я действительно не знаю, как это исправить, но я знаю, что мне просто нужно что-то сделать в одной строке ... Справка: (

Mystructs.h

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)
    */
};

Мои структуры . 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: примечание: лямбда-функция не имеет значения по умолчанию 77 | [] (Измерение GNSS и gnss, const py :: dict & d) {

1 Ответ

0 голосов
/ 17 июня 2020

Мне помог один из друзей :)

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);
                 }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...