vlp16_driver_test.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. * @Description: vlp16驱动测试
  3. * @Author: yct
  4. * @Date: 2021-07-26 14:11:26
  5. * @LastEditTime: 2021-08-01 15:51:10
  6. * @LastEditors: yct
  7. */
  8. #include <iostream>
  9. #include <fstream>
  10. // velodyne driver seperation test
  11. #include "../velodyne_lidar/velodyne_driver/input.h"
  12. #include "../velodyne_lidar/velodyne_driver/rawdata.h"
  13. bool velo_driver_test()
  14. {
  15. velodyne_driver::InputSocket sock;
  16. if (!sock.init("", 2368))
  17. {
  18. std::cout << "sock init failed" << std::endl;
  19. return false;
  20. }
  21. velodyne_rawdata::RawData data;
  22. data.setup("VLP16", "/home/youchen/extra_space/chutian/measure/puai_wj_2021/setting/VLP16db.yaml", 1.2, 0.1, 0, 360);
  23. int count = 0;
  24. unsigned char pkt[1206];
  25. std::vector<Lidar_point> t_point;
  26. while (count++ < 50000)
  27. {
  28. int ret = sock.getPacket(pkt);
  29. if (ret != 0)
  30. std::cout << "get pack: " << ret << std::endl;
  31. else
  32. {
  33. // t_point.clear();
  34. // memset(&pkt[1205], 0, 1);
  35. // printf("%s\n", pkt);
  36. data.unpack(pkt, t_point);
  37. std::cout << "point size: " << t_point.size() << std::endl;
  38. if(t_point.size() > 30000)
  39. {
  40. std::ofstream out("/home/youchen/extra_space/chutian/measure/puai_wj_2021/build/point.txt");
  41. if(out.is_open())
  42. {
  43. for (size_t i = 0; i < t_point.size(); i++)
  44. {
  45. char buf[255] = {0};
  46. sprintf(buf, "%.3f %.3f %.3f %.6f\n", t_point[i].x, t_point[i].y, t_point[i].z, t_point[i].timestamp);
  47. out << buf;
  48. }
  49. out.close();
  50. return true;
  51. }
  52. else
  53. {
  54. std::cout << "cannot open file to write cloud." << std::endl;
  55. }
  56. }
  57. }
  58. usleep(500);
  59. }
  60. sock.uninit();
  61. return true;
  62. }
  63. // velodyne driver combination test
  64. #include "../velodyne_lidar/velodyne_driver/velodyne_lidar_device.h"
  65. void device_test()
  66. {
  67. velodyne::velodyneLidarParams params;
  68. params.set_ip("");
  69. params.set_port(2368);
  70. params.set_model("VLP16");
  71. params.set_calibrationfile("/home/youchen/extra_space/chutian/measure/puai_wj_2021/setting/VLP16db.yaml");
  72. params.mutable_calib()->set_y(1.57);
  73. Velodyne_lidar_device t_device;
  74. t_device.init(params);
  75. usleep(1000 * 1000);
  76. std::mutex p_mutex;
  77. pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud(new pcl::PointCloud<pcl::PointXYZ>);
  78. Error_manager ec = t_device.get_new_cloud_and_wait(&p_mutex, p_cloud, std::chrono::steady_clock::now(), 6000);
  79. if (ec == SUCCESS)
  80. {
  81. std::ofstream out("/home/youchen/extra_space/chutian/measure/puai_wj_2021/build/device_point.txt");
  82. if (out.is_open())
  83. {
  84. for (size_t i = 0; i < p_cloud->size(); i++)
  85. {
  86. char buf[255] = {0};
  87. sprintf(buf, "%.3f %.3f %.3f\n", p_cloud->points[i].x, p_cloud->points[i].y, p_cloud->points[i].z);
  88. out << buf;
  89. }
  90. std::cout << "cloud written" << std::endl;
  91. out.close();
  92. }
  93. else
  94. {
  95. std::cout << "cannot open file to write cloud." << std::endl;
  96. }
  97. }else{
  98. std::cout << "get cloud failed" << std::endl;
  99. }
  100. t_device.uninit();
  101. }
  102. // ground region class function test
  103. #include "../velodyne_lidar/ground_region.h"
  104. #include "../tool/measure_filter.h"
  105. #include "../tool/point_tool.h"
  106. void region_detect()
  107. {
  108. std::ifstream in("/home/youchen/extra_space/chutian/measure/puai_wj_2021/build/comb_calib.txt");
  109. if(!in.is_open())
  110. {
  111. std::cout << "cannot open file to read cloud." << std::endl;
  112. return;
  113. }
  114. else
  115. {
  116. // 准备点云
  117. pcl::PointCloud<pcl::PointXYZ>::Ptr t_cloud(new pcl::PointCloud<pcl::PointXYZ>);
  118. while(!in.eof())
  119. {
  120. std::string t_linestr;
  121. if (getline(in, t_linestr))
  122. {
  123. std::vector<std::string> str_vector;
  124. std::stringstream ss(t_linestr);
  125. std::string num_str;
  126. while (getline(ss, num_str, ' '))
  127. {
  128. str_vector.push_back(num_str);
  129. }
  130. if (str_vector.size() != 3)
  131. {
  132. std::cout << "unsupported point cloud / cannot find point x y z value " << std::endl;
  133. return;
  134. }
  135. pcl::PointXYZ t_point;
  136. t_point.x = stod(str_vector[0]);
  137. t_point.y = stod(str_vector[1]);
  138. t_point.z = stod(str_vector[2]);
  139. t_cloud->push_back(t_point);
  140. }
  141. }
  142. // 初始化region
  143. velodyne::Region param;
  144. param.set_minx(-3.10);
  145. param.set_maxx(0);
  146. param.set_miny(-2.75);
  147. param.set_maxy(3.08);
  148. param.set_minz(0.01);
  149. param.set_maxz(0.2);
  150. param.set_region_id(0);
  151. pcl::PointCloud<pcl::PointXYZ>::Ptr left = pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);
  152. pcl::PointCloud<pcl::PointXYZ>::Ptr right = pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);
  153. if (!read_pointcloud("/home/youchen/extra_space/chutian/measure/puai_wj_2021/setting/left_model.txt", left) || !read_pointcloud("/home/youchen/extra_space/chutian/measure/puai_wj_2021/setting/right_model.txt", right))
  154. {
  155. std::cout << "cannot read left/right model " << std::endl;
  156. return;
  157. }
  158. Ground_region t_region;
  159. std::cout << "before init" << std::endl;
  160. t_region.init(param, left, right);
  161. std::cout << "after init" << std::endl;
  162. // 测试region功能
  163. detect_wheel_ceres3d::Detect_result t_result;
  164. Error_manager ec = t_region.detect(t_cloud, t_result);
  165. std::cout << ec.to_string() << std::endl;
  166. std::cout << "---------------" << std::endl;
  167. for (size_t i = 0; i < 12; i++)
  168. {
  169. t_region.update_cloud(t_cloud);
  170. usleep(1000*100);
  171. }
  172. Common_data::Car_wheel_information t_wheel_info;
  173. ec = Measure_filter::get_instance_references().get_filtered_wheel_information(0, t_wheel_info);
  174. if (ec == SUCCESS)
  175. {
  176. std::cout << t_wheel_info.to_string() << std::endl;
  177. }
  178. else { std::cout << ec.to_string() << std::endl; }
  179. }
  180. }
  181. // velodyne manager test
  182. #include "../velodyne_lidar/velodyne_manager.h"
  183. void velo_manager_test()
  184. {
  185. Velodyne_manager_task t_velodyne_manager_task;
  186. Common_data::Car_wheel_information t_car_information_by_velodyne;
  187. t_velodyne_manager_task.task_init(TASK_CREATED,"",NULL,std::chrono::milliseconds(3000),
  188. 0, std::chrono::system_clock::now());
  189. Error_manager ec = Velodyne_manager::get_instance_references().velodyne_manager_init(0);
  190. std::cout << "veodyne_manager = " << Velodyne_manager::get_instance_references().check_status().to_string() << std::endl;
  191. if(ec != SUCCESS)
  192. {
  193. std::cout << "manager init failed: " << ec.to_string() << std::endl;
  194. return;
  195. }
  196. usleep(1000 * 500);
  197. Velodyne_manager::get_instance_references().execute_task(&t_velodyne_manager_task);
  198. ec = Velodyne_manager::get_instance_references().execute_task(&t_velodyne_manager_task);
  199. std::cout << "manager execute base check result: " << ec.to_string() << std::endl;
  200. // 等待处理完成,来自于system_executor
  201. while (t_velodyne_manager_task.is_task_end() == false)
  202. {
  203. if (t_velodyne_manager_task.is_over_time())
  204. {
  205. //超时处理。取消任务。
  206. Velodyne_manager::get_instance_pointer()->cancel_task(&t_velodyne_manager_task);
  207. ec.error_manager_reset(Error_code::VELODYNE_MANAGER_TASK_OVER_TIME, Error_level::MINOR_ERROR,
  208. " t_velodyne_manager_task is_over_time ");
  209. t_velodyne_manager_task.set_task_error_manager(ec);
  210. }
  211. else
  212. {
  213. //继续等待
  214. std::this_thread::sleep_for(std::chrono::microseconds(1));
  215. std::this_thread::yield();
  216. }
  217. }
  218. //提取任务单 的错误码
  219. ec = t_velodyne_manager_task.get_task_error_manager();
  220. if (ec == Error_code::SUCCESS)
  221. {
  222. t_car_information_by_velodyne = t_velodyne_manager_task.get_car_wheel_information();
  223. }
  224. else
  225. {
  226. LOG(INFO) << " velodyne_manager_task error :::::::" << t_velodyne_manager_task.get_task_error_manager().to_string();
  227. }
  228. std::cout << "--------------------------"<< std::endl;
  229. Velodyne_manager::get_instance_references().Velodyne_manager_uninit();
  230. }
  231. // 测试通信功能
  232. #include "../system/system_communication.h"
  233. #include "../system/system_executor.h"
  234. void message_test()
  235. {
  236. nnxx::socket socket{nnxx::SP, nnxx::BUS};
  237. // socket.bind("tcp://127.0.0.1:7000");
  238. socket.connect("tcp://192.168.2.113:30010");
  239. int n = 0;
  240. message::Base_msg base_msg;
  241. message::Ground_detect_request_msg t_ground_detect_request;
  242. message::Base_info t_base_info;
  243. t_base_info.set_msg_type(message::Message_type::eGround_detect_request_msg);
  244. t_base_info.set_timeout_ms(4000);
  245. t_base_info.set_sender(message::Communicator::eEmpty);
  246. t_base_info.set_receiver(message::Communicator::eGround_measurer);
  247. t_ground_detect_request.mutable_base_info()->CopyFrom(t_base_info);
  248. t_ground_detect_request.set_command_key("key for test only");
  249. t_ground_detect_request.set_terminal_id(0);
  250. usleep(1000 * 1000);
  251. std::cout << "try to send" << std::endl;
  252. socket.send(t_ground_detect_request.SerializeAsString());
  253. usleep(1000 * 100);
  254. while (true)
  255. {
  256. // for (size_t i = 0; i < 10; i++)
  257. // {
  258. // 接收消息
  259. std::string t_receive_string = socket.recv<std::string>(1);
  260. if (t_receive_string.length() > 0)
  261. {
  262. bool result = base_msg.ParseFromString(t_receive_string);
  263. // 接收并打印车位状态信息
  264. std::cout << "====check result====================" << result << "============================" << std::endl;
  265. std::cout << "cycle " << n << std::endl;
  266. if (base_msg.base_info().msg_type() == message::Message_type::eGround_detect_response_msg)
  267. {
  268. message::Ground_detect_response_msg t_ground_detect_response;
  269. std::cout << "----------------- check result -----------------" << std::endl;
  270. t_ground_detect_response.ParseFromString(t_receive_string);
  271. std::cout << "result: "<<t_ground_detect_response.DebugString()<< std::endl;
  272. // std::cout << sift_response.DebugString() << std::endl;
  273. // continue;
  274. }else if(base_msg.base_info().msg_type() == message::Message_type::eGround_status_msg)
  275. {
  276. message::Ground_status_msg t_status_msg;
  277. std::cout << "----------------- heartbeat -----------------" << std::endl;
  278. t_status_msg.ParseFromString(t_receive_string);
  279. std::cout << "heartbeat: "<<t_status_msg.DebugString()<< std::endl;
  280. }
  281. }
  282. // }
  283. // std::this_thread::yield();
  284. n++;
  285. usleep(1000 * 1);
  286. }
  287. }
  288. int main()
  289. {
  290. // velo_driver_test();
  291. // device_test();
  292. // region_detect();
  293. // velo_manager_test();
  294. message_test();
  295. return 0;
  296. }