Как преобразовать словарь python в Eigen MatrixXd с помощью pybind - PullRequest
0 голосов
/ 19 июня 2020

У меня есть struct.h и struct. cpp. Есть переменная MatrixXd gnss_measurement. У меня также есть сценарий python, который будет читать в словаре, а затем передавать словарь в структуру. Он компилируется нормально, но когда я запускаю сценарий python, он выдает следующую ошибку:

Traceback (most recent call last):
  File "./run_filter2.py", line 125, in <module>
    navpt = filter.update(imupt, gnsspt)
  File "/Users/kerry/Desktop/aura/aura-navigation/scripts/new_wrapper2.py", line 58, in update
    self.Cgnss.from_dict(gnss)
RuntimeError: Unable to cast Python instance to C++ type (compile in debug mode for details)

Я не знаю, как это исправить, и ничего не могу найти в Интернете. Любая помощь? Спасибо!

Фрагмент python скрипта:

def update(self, imu, gnss):
        Cimu = IMUdata()
        Cimu.from_dict(imu)

        # queue delay
        self.imu_queue.insert(0, Cimu)
        Cimu = self.imu_queue.pop()

        self.Cgnss = GNSS_measurement()
        self.Cgnss.from_dict(gnss) # fails here!!!!!!
        self.filter.update(Cimu, self.Cgnss)

        nav = self.filter.get_nav()

Struch.h

struct GNSS_measurement
{
// private:
//      GNSS_measurement(float, const Eigen::MatrixXd&);
public: 
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    /// time in [s]
    float time;
    /// GNSS measurement data
    /// 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]
    MatrixXd gnss_measurement;
};

struct. cpp

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::cast<MatrixXd>(d["gnss_measurement"]); // I'm guessing something is wrong here 
                }
            )

        ;
}
...