首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从python绑定C++中的双向量数组错误:未捕获'm‘;py::bind_vector<vector<double>>(m,d["gnss_measurement"])

无法从python绑定C++中的双向量数组错误:未捕获'm‘;py::bind_vector<vector<double>>(m,d["gnss_measurement"])
EN

Stack Overflow用户
提问于 2020-06-17 08:51:55
回答 1查看 61关注 0票数 0

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

结构GPSdata可以工作,但是结构GNSS_measurement不能工作。我真的不知道如何修复它,但我知道我只需要在一行上做一些事情……帮助:(

我的structs.h

代码语言:javascript
复制
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)
    */
};

我的structs.cpp

代码语言:javascript
复制
#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| GNSS_measurement &gnss, const py::dict &d {

EN

回答 1

Stack Overflow用户

发布于 2020-06-17 12:19:15

我的一个朋友帮助我:)

代码语言:javascript
复制
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);
                 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62419785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档