|  |  |  | #include "selfdrive/modeld/models/nav.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <cstdio>
 | 
					
						
							|  |  |  | #include <cstring>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "common/mat.h"
 | 
					
						
							|  |  |  | #include "common/modeldata.h"
 | 
					
						
							|  |  |  | #include "common/timing.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void navmodel_init(NavModelState* s) {
 | 
					
						
							|  |  |  |   #ifdef USE_ONNX_MODEL
 | 
					
						
							|  |  |  |     s->m = new ONNXModel("models/navmodel.onnx", &s->output[0], NAV_NET_OUTPUT_SIZE, USE_DSP_RUNTIME, false, true);
 | 
					
						
							|  |  |  |   #else
 | 
					
						
							|  |  |  |     s->m = new SNPEModel("models/navmodel_q.dlc", &s->output[0], NAV_NET_OUTPUT_SIZE, USE_DSP_RUNTIME, false, true);
 | 
					
						
							|  |  |  |   #endif
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NavModelResult* navmodel_eval_frame(NavModelState* s, VisionBuf* buf) {
 | 
					
						
							|  |  |  |   memcpy(s->net_input_buf, buf->addr, NAV_INPUT_SIZE);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   double t1 = millis_since_boot();
 | 
					
						
							|  |  |  |   s->m->addImage((float*)s->net_input_buf, NAV_INPUT_SIZE/sizeof(float));
 | 
					
						
							|  |  |  |   s->m->execute();
 | 
					
						
							|  |  |  |   double t2 = millis_since_boot();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   NavModelResult *model_res = (NavModelResult*)&s->output;
 | 
					
						
							|  |  |  |   model_res->dsp_execution_time = (t2 - t1) / 1000.;
 | 
					
						
							|  |  |  |   return model_res;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void fill_plan(cereal::NavModelData::Builder &framed, const NavModelOutputPlan &plan) {
 | 
					
						
							|  |  |  |   std::array<float, TRAJECTORY_SIZE> pos_x, pos_y;
 | 
					
						
							|  |  |  |   std::array<float, TRAJECTORY_SIZE> pos_x_std, pos_y_std;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (int i=0; i<TRAJECTORY_SIZE; i++) {
 | 
					
						
							|  |  |  |     pos_x[i] = plan.mean[i].x;
 | 
					
						
							|  |  |  |     pos_y[i] = plan.mean[i].y;
 | 
					
						
							|  |  |  |     pos_x_std[i] = exp(plan.std[i].x);
 | 
					
						
							|  |  |  |     pos_y_std[i] = exp(plan.std[i].y);
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   auto position = framed.initPosition();
 | 
					
						
							|  |  |  |   position.setX(to_kj_array_ptr(pos_x));
 | 
					
						
							|  |  |  |   position.setY(to_kj_array_ptr(pos_y));
 | 
					
						
							|  |  |  |   position.setXStd(to_kj_array_ptr(pos_x_std));
 | 
					
						
							|  |  |  |   position.setYStd(to_kj_array_ptr(pos_y_std));
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void navmodel_publish(PubMaster &pm, uint32_t frame_id, const NavModelResult &model_res, float execution_time) {
 | 
					
						
							|  |  |  |   // make msg
 | 
					
						
							|  |  |  |   MessageBuilder msg;
 | 
					
						
							|  |  |  |   auto framed = msg.initEvent().initNavModel();
 | 
					
						
							|  |  |  |   framed.setFrameId(frame_id);
 | 
					
						
							|  |  |  |   framed.setModelExecutionTime(execution_time);
 | 
					
						
							|  |  |  |   framed.setDspExecutionTime(model_res.dsp_execution_time);
 | 
					
						
							|  |  |  |   framed.setFeatures(to_kj_array_ptr(model_res.features.values));
 | 
					
						
							|  |  |  |   framed.setDesirePrediction(to_kj_array_ptr(model_res.desire_pred.values));
 | 
					
						
							|  |  |  |   fill_plan(framed, model_res.plan);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   pm.send("navModel", msg);
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void navmodel_free(NavModelState* s) {
 | 
					
						
							|  |  |  |   delete s->m;
 | 
					
						
							|  |  |  | }
 |