У меня есть 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
}
)
;
}