data_engine.h
Go to the documentation of this file.
1 #pragma once
2 // std
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <vector>
7 // socket
8 #include <sys/wait.h>
9 #include <sys/types.h>
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <netinet/tcp.h>
13 #include <pthread.h>
14 #include <thread>
15 #include <arpa/inet.h>
16 // opencv
17 #include <opencv2/opencv.hpp>
18 #include <opencv2/core/core.hpp>
19 #include <opencv2/highgui/highgui.hpp>
20 #include <opencv2/imgproc/imgproc.hpp>
21 // octomap
22 #include <octomap/octomap.h>
23 // eigen
24 #include "../include/eigen/Eigen/Dense"
25 #include "../include/eigen/Eigen/src/Geometry/Quaternion.h"
26 // se2
27 #include "../include/se2/se2.h"
28 // my headers
29 #include "global.h"
30 
31 // 2D recon
32 struct CellMap{
33  cv::Point2f coordinate;
34  bool isScanned = false;
35  bool isFree = false;
36  bool isOccupied = false;
37  //bool onFrontier = false;
38 };
39 const float map_cellsize = 0.05;
40 const int map_rows = 1200;
41 const int map_cols = 1200;
42 const float xmax_oc_g = 30;
43 const float xmin_oc_g = -30;
44 const float zmax_oc_g = 30;
45 const float zmin_oc_g = -30;
46 // grid project height
47 const double project_max_height = 1.5; // meter
48 const double project_min_height = 0.15; // meter
49 const double free_voxel_porject_height = project_max_height; // meter, this variable does not make sense
50 class Recon2D
51 {
52 public:
55  {
56  m_cellmap = new CellMap*[map_rows];
57  for (int rid = 0; rid < map_rows; ++rid)
58  m_cellmap[rid] = new CellMap[map_cols];
59  for (int rid = 0; rid < map_rows; ++rid)
60  {
61  for (int cid = 0; cid < map_cols; ++cid)
62  {
63  m_cellmap[rid][cid].isScanned = false;
64  m_cellmap[rid][cid].isFree = false;
65  m_cellmap[rid][cid].isOccupied = false;
66  }
67  }
68  return;
69  }
70  ~Recon2D() // todo:
71  {
72  // delete
73  }
74 };
75 // 3D recon
76 class Recon3D
77 {
78 public:
79  //
80  octomap::OcTree * m_tree;
81  //
83  {
84  m_tree = new octomap::OcTree(map_cellsize);
85  return;
86  }
87  Recon3D(float resolution)
88  {
89  m_tree = new octomap::OcTree(resolution);
90  return;
91  }
92  //
94  {
95  delete m_tree;
96  return;
97  }
98 };
99 
100 // process scanning data
102 {
103 public:
104  // camera internal params
105  const double camera_factor = 1000;
106  const double camera_cx = 320.5;
107  const double camera_cy = 240.5;
108  const double camera_fx = 554.38;
109  const double camera_fy = 554.38;
110  const int scan_max_range = 3000; // mm
111  // socket
112  #define PORT 3333
113  const int MAXRECV = 10240;
114  const int frame_rows = 480;
115  const int frame_cols = 640;
116  char *server_ip = "192.168.180.128";
118  //bool m_sock_success = false;
119  // robot
120  int rbt_num = 3;
121  std::vector<cv::Mat> m_rgb;
122  std::vector<cv::Mat> m_depth;
123  std::vector<std::vector<float>> m_pose; // 7 value: x, y, z, q()
124  std::vector<std::vector<float>> m_set_pose; // 7 value: x, y, z, q()
125  // scene recon
128  // 2d frustum
129  std::vector<std::vector<cv::Point>> m_frustum_contours;
130  // 2d free
131  std::vector<std::vector<cv::Point>> m_free_space_contours2d;
132  // 2d pose
133  std::vector<iro::SE2> m_pose2d;
134 
135  // constructor
136  DataEngine(int r_num)
137  {
138  rbt_num = r_num;
139  // frames
140  m_rgb.clear();
141  m_depth.clear();
142  for (int i = 0; i < rbt_num; i++)
143  {
144  m_rgb.push_back(cv::Mat(frame_rows, frame_cols, CV_8UC3));
145  m_depth.push_back(cv::Mat(frame_rows, frame_cols, CV_16UC1));
146  }
147  // poses
148  m_pose.clear();
149  m_pose.resize(rbt_num);
150  for (int i = 0; i < rbt_num; ++i)
151  {
152  m_pose[i].resize(7);
153  }
154  //
155  m_frustum_contours.clear();
156  m_frustum_contours.resize(rbt_num);
157  //
158  m_free_space_contours2d.clear();
159  m_free_space_contours2d.resize(rbt_num);
160  //
161  m_pose2d.clear();
162  m_pose2d.resize(rbt_num);
163  // finished.
164  return;
165  }
166 
167  // initialize, not finished.
169  {
170  // init
171  create_connection();
172 
173  //todo
174 
175  // finished.
176  return 0;
177  }
178 
179  // initialization: connect socket.
180  bool create_connection();
181 
182  // get rgbd
183  bool getRGBDFromServer();
184  // rcv rgbd from server
185  bool rcvRGBDFromServer();
186  // get pose
187  bool getPoseFromServer();
188  // rcv robot pose
189  bool rcvPoseFromServer();
190  // ask to set up surroundings, use to initialization
191  void scanSurroundingsCmd();
192  // move to views
193  bool socket_move_to_views(std::vector<std::vector<double>> poses);
194 
195  // insert a frame 2 tree
196  void insertAFrame2Tree(cv::Mat & depth, std::vector<float> pose);
197 
198  // fuse scans by multi-robot, update robot poses
199  void fuseScans2MapAndTree();
200 
201  // compute ideal frustum
202  std::vector<cv::Point> loadIdealFrustum(Eigen::MatrixXd r, Eigen::Vector3d t);
203 
204  // fill trivial holes in known region.
205  void fillTrivialHolesKnownRegion();
206 
207  // set up scan envir
208  void SetUpSurroundings();
209 
210  // find free contours that octomap cant handle, not finished
211  void findExtraFreeSpace(int rid, cv::Mat depth, std::vector<float> pose);
212 
213  // coordinate system transfer
214  std::pair<Eigen::MatrixXd, Eigen::Vector3d> coord_trans_7f_rt(std::vector<float> pose);
215 
216  // coordinate system transfer
217  iro::SE2 coord_trans_7f_se2(std::vector<float> pose);
218 
219  // coordinate system transfer: se22gazebo
220  std::vector<double> coord_trans_se22gazebo(iro::SE2 pose);
221 
222  // coordinate transformation: oc2cell return (row, col)
223  Eigen::Vector2i coord_trans_oc2cell(Eigen::Vector3d p_oc);
224 
225  // coordinate transformation: oc2cell return (row, col)
226  Eigen::Vector2i coord_trans_oc2cell(Eigen::Vector3d p_oc, double node_size, int scale);
227 
228  // project octree 2 map
229  void projectOctree2Map();
230 
231  // vis
232  cv::Mat visCellMap();
233 
234  // show
235  cv::Mat showCellMap();
236 
237  // show
238  cv::Mat showStatement();
239 
240  // test
241  void test()
242  {
243 /*
244  getPoseFromServer();
245  getRGBDFromServer();
246  for (int rid = 0; rid < rbt_num; ++rid)
247  {
248  insertAFrame2Tree(m_depth[rid], m_pose[rid]);
249  char output_dir[100];
250  sprintf(output_dir, "/home/bamboo/catkin_ws/src/co_scan/temp/dsy_octree_%d.bt", rid);
251  m_recon3D.m_tree->writeBinary(output_dir);
252  }
253 //*/
254  // set up initial region. ok.
255  SetUpSurroundings();
256  m_recon3D.m_tree->writeBinary("/home/bamboo/catkin_ws/src/co_scan/temp/dsy_octree.bt");
257 //*/
258 /*
259  // test se2. ok.
260  iro::SE2 view2d(1.2, -3.4, -3.15);
261  std::cerr<<view2d.translation().x()<<std::endl;
262  std::cerr<<view2d.translation().y()<<std::endl;
263  std::cerr<<view2d.rotation().angle()<<std::endl;
264 //*/
265 
266  // vis
267  visCellMap();
268  }
269 };
std::vector< std::vector< float > > m_set_pose
Definition: data_engine.h:124
std::vector< iro::SE2 > m_pose2d
Definition: data_engine.h:133
cv::Point2f coordinate
Definition: data_engine.h:33
octomap::OcTree * m_tree
Definition: data_engine.h:80
CellMap ** m_cellmap
Definition: data_engine.h:53
Recon3D m_recon3D
Definition: data_engine.h:126
const float zmax_oc_g
Definition: data_engine.h:44
int rbt_num
Definition: co_scan.cpp:15
const double free_voxel_porject_height
Definition: data_engine.h:49
std::vector< std::vector< float > > m_pose
Definition: data_engine.h:123
~Recon2D()
Definition: data_engine.h:70
Recon3D(float resolution)
Definition: data_engine.h:87
std::vector< cv::Mat > m_rgb
Definition: data_engine.h:121
const double project_min_height
Definition: data_engine.h:48
~Recon3D()
Definition: data_engine.h:93
std::vector< cv::Mat > m_depth
Definition: data_engine.h:122
const float map_cellsize
Definition: data_engine.h:39
bool isFree
Definition: data_engine.h:35
const int map_rows
Definition: data_engine.h:40
bool isOccupied
Definition: data_engine.h:36
int sockClient
Definition: data_engine.h:117
int initialize()
Definition: data_engine.h:168
std::vector< std::vector< cv::Point > > m_free_space_contours2d
Definition: data_engine.h:131
const int map_cols
Definition: data_engine.h:41
bool isScanned
Definition: data_engine.h:34
Recon2D m_recon2D
Definition: data_engine.h:127
Definition: se2.h:49
const double project_max_height
Definition: data_engine.h:47
DataEngine(int r_num)
Definition: data_engine.h:136
void test()
Definition: data_engine.h:241
std::vector< std::vector< cv::Point > > m_frustum_contours
Definition: data_engine.h:129
const float zmin_oc_g
Definition: data_engine.h:45
const float xmax_oc_g
Definition: data_engine.h:42
const float xmin_oc_g
Definition: data_engine.h:43


co_scan
Author(s):
autogenerated on Mon Feb 28 2022 23:00:41