Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.16 KB | None | 0 0
  1. #include "arpa/inet.h"
  2. #include "boost/filesystem.hpp"
  3. #include "boost/thread/mutex.hpp"
  4. #include "cv_bridge/cv_bridge.h"
  5. #include "image_transport/image_transport.h"
  6. #include "opencv2/opencv.hpp"
  7. #include "ros/ros.h"
  8. #include "sys/socket.h"
  9. #include "time.h"
  10.  
  11. using namespace std;
  12. using namespace cv;
  13.  
  14. #define font CV_FONT_HERSHEY_SIMPLEX
  15. #define color Scalar(0, 255, 0)
  16.  
  17. //-----Parameter
  18. string capture_directory;
  19. string lidar_ip;
  20. int video_width;
  21. int video_height;
  22. //-----Timer
  23. ros::Timer tim_15hz;
  24. ros::Timer tim_30hz;
  25. //-----Subscriber
  26. image_transport::Subscriber sub_frame_bgr[3];
  27. //-----Mutex
  28. boost::mutex mutex_frame_bgr[3];
  29.  
  30. //Keperluan koneksi UDP
  31. int sockfd;
  32. struct sockaddr_in client_addr;
  33. struct sockaddr_in dummy_addr;
  34. socklen_t dummy_socklen;
  35. //Panjang data dan buffer UDP
  36. uint8_t tx_len, tx_buffer[512];
  37. uint8_t rx_len, rx_buffer[512];
  38. //Container frame
  39. Mat frame_bgr[3];
  40. //Status algoritma
  41. uint8_t capture_ready = 0;
  42. uint64_t capture_number = 0;
  43. //Struktur data LiDAR
  44. typedef struct
  45. {
  46. uint32_t VC;
  47. uint32_t SN;
  48. uint8_t Class;
  49. uint8_t nAxleGroup;
  50. uint8_t AxleGroup[5];
  51. uint8_t Type;
  52. } vehicle;
  53. typedef struct
  54. {
  55. uint32_t STAT;
  56. uint32_t NSN;
  57. uint32_t nVeh;
  58. vector<vehicle> Vehicle;
  59. } lidar;
  60.  
  61. //-----Protype
  62. bool checkFile(string filePath);
  63. bool checkDirectory(string filePath);
  64. void createDirectory(string filePath);
  65. string date();
  66. string time();
  67.  
  68. void cllbck_tim_15hz(const ros::TimerEvent &event)
  69. {
  70. *(uint32_t *)&tx_buffer[0] = 0xDDCCBBAA;
  71. *(uint32_t *)&tx_buffer[4] = 0x00000001;
  72. *(uint32_t *)&tx_buffer[8] = 0x00000000;
  73. tx_len = sendto(sockfd, tx_buffer, 12, MSG_DONTWAIT, (struct sockaddr *)&client_addr, sizeof(client_addr));
  74. }
  75.  
  76. void cllbck_tim_30hz(const ros::TimerEvent &event)
  77. {
  78. static Mat canvas;
  79.  
  80. static vehicle last_Vehicle;
  81.  
  82. static uint8_t lidarPassingStatus = 0;
  83. static uint8_t prev_lidarPassingStatus = 0;
  84.  
  85. string datetime_entry;
  86. string datetime_exit;
  87.  
  88. rx_len = recvfrom(sockfd, rx_buffer, 512, MSG_DONTWAIT, (struct sockaddr *)&dummy_addr, &dummy_socklen);
  89.  
  90. if (capture_ready == 0x07)
  91. {
  92. if (*(uint32_t *)&rx_buffer[0] == 0xDDCCBBAA)
  93. {
  94. prev_lidarPassingStatus = lidarPassingStatus;
  95.  
  96. lidar Lidar;
  97. memcpy(&Lidar.STAT, rx_buffer + 4, 4);
  98. memcpy(&Lidar.NSN, rx_buffer + 8, 4);
  99. memcpy(&Lidar.nVeh, rx_buffer + 12, 4);
  100. for (int i = 0; i < Lidar.nVeh; i++)
  101. {
  102. vehicle Vehicle;
  103. memcpy(&Vehicle.VC, rx_buffer + i * 8 + 16, 4);
  104. memcpy(&Vehicle.SN, rx_buffer + i * 8 + 20, 4);
  105. Vehicle.Class = (Vehicle.VC & 0x0000000F) >> 0;
  106. Vehicle.nAxleGroup = (Vehicle.VC & 0x000000F0) >> 4;
  107. Vehicle.AxleGroup[0] = (Vehicle.VC & 0x00000F00) >> 8;
  108. Vehicle.AxleGroup[1] = (Vehicle.VC & 0x0000F000) >> 12;
  109. Vehicle.AxleGroup[2] = (Vehicle.VC & 0x000F0000) >> 16;
  110. Vehicle.AxleGroup[3] = (Vehicle.VC & 0x00F00000) >> 20;
  111. Vehicle.AxleGroup[4] = (Vehicle.VC & 0x0F000000) >> 24;
  112. Vehicle.Type = (Vehicle.VC & 0xF0000000) >> 28;
  113. Lidar.Vehicle.push_back(Vehicle);
  114.  
  115. last_Vehicle = Vehicle;
  116. }
  117.  
  118. lidarPassingStatus = (Lidar.STAT & 0x00000001) >> 0;
  119. }
  120.  
  121. if (lidarPassingStatus == 1 && prev_lidarPassingStatus == 0)
  122. {
  123. //Mengahapus buffer canvas sebelumnya
  124. canvas = Mat::zeros(Size(3 * video_width, 2 * video_height), CV_8UC3);
  125.  
  126. //Memasang gambar saat rising edge lidar
  127. for (int i = 0; i < 3; i++)
  128. canvas(Rect(i * video_width, 0 * video_height, video_height, video_height)) = frame_bgr[i];
  129.  
  130. //Mencatat tanggal dan jam kendaraan masuk LiDAR
  131. datetime_entry = date() + " " + time();
  132. }
  133.  
  134. if (lidarPassingStatus == 0 && prev_lidarPassingStatus == 1)
  135. {
  136. //Memasang gambar saat falling edge lidar
  137. for (int i = 0; i < 3; i++)
  138. canvas(Rect(i * video_width, 1 * video_height, video_height, video_height)) = frame_bgr[i];
  139.  
  140. //Mencatat tanggal dan jam kendaraan keluar LiDAR
  141. datetime_exit = date() + " " + time();
  142.  
  143. putText(canvas, format("Image #{0:05d}", capture_number), Point(20, 20), font, 0.5, color, 1);
  144. putText(canvas, format("Golongan {0:01d}", last_Vehicle.Class), Point(20, 55), font, 1, color, 2);
  145. putText(canvas, format("-> {0}", datetime_entry), Point(20, 80), font, 0.5, color, 1);
  146. putText(canvas, format("<- {0}", datetime_exit), Point(20, 100), font, 0.5, color, 1);
  147.  
  148. //Membuat direktori baru jika belum tersedia
  149. if (checkDirectory(capture_directory + '/' + date()) == false)
  150. createDirectory(capture_directory + '/' + date());
  151.  
  152. //Mem-parsing nama file gambar
  153. char filename[128];
  154. sprintf(filename, "%s/%s/%06d.jpg", capture_directory.c_str(), date().c_str(), capture_number++);
  155. }
  156. }
  157. }
  158.  
  159. void cllbck_sub_frame_bgr_cctv0(const sensor_msgs::ImageConstPtr &msg)
  160. {
  161. mutex_frame_bgr[0].lock();
  162. frame_bgr[0] = cv_bridge::toCvCopy(msg, "bgr8")->image;
  163. mutex_frame_bgr[0].unlock();
  164.  
  165. capture_ready |= 0x01;
  166. }
  167.  
  168. void cllbck_sub_frame_bgr_cctv1(const sensor_msgs::ImageConstPtr &msg)
  169. {
  170. mutex_frame_bgr[1].lock();
  171. frame_bgr[1] = cv_bridge::toCvCopy(msg, "bgr8")->image;
  172. mutex_frame_bgr[1].unlock();
  173.  
  174. capture_ready |= 0x02;
  175. }
  176.  
  177. void cllbck_sub_frame_bgr_cctv2(const sensor_msgs::ImageConstPtr &msg)
  178. {
  179. mutex_frame_bgr[2].lock();
  180. frame_bgr[2] = cv_bridge::toCvCopy(msg, "bgr8")->image;
  181. mutex_frame_bgr[2].unlock();
  182.  
  183. capture_ready |= 0x04;
  184. }
  185.  
  186. bool checkFile(std::string filePath)
  187. {
  188. boost::filesystem::path pathObj(filePath);
  189. if (boost::filesystem::exists(pathObj) && boost::filesystem::is_regular_file(pathObj))
  190. return true;
  191. return false;
  192. }
  193.  
  194. bool checkDirectory(std::string filePath)
  195. {
  196. boost::filesystem::path pathObj(filePath);
  197. if (boost::filesystem::exists(pathObj) && boost::filesystem::is_directory(pathObj))
  198. return true;
  199. return false;
  200. }
  201.  
  202. void createDirectory(string filePath)
  203. {
  204. boost::filesystem::create_directory(filePath);
  205. }
  206.  
  207. string date()
  208. {
  209. time_t Time = time(NULL);
  210. struct tm Tm = *localtime(&Time);
  211.  
  212. char buffer[11];
  213. sprintf(buffer, "%04d-%02d-%02d", Tm.tm_year + 1900, Tm.tm_mon + 1, Tm.tm_mday);
  214. return buffer;
  215. }
  216.  
  217. string time()
  218. {
  219. time_t Time = time(NULL);
  220. struct tm Tm = *localtime(&Time);
  221.  
  222. char buffer[11];
  223. sprintf(buffer, "%02d-%02d-%02d", Tm.tm_hour, Tm.tm_min, Tm.tm_sec);
  224. return buffer;
  225. }
  226.  
  227. int main(int argc, char **argv)
  228. {
  229. ros::init(argc, argv, "lidar");
  230.  
  231. ros::NodeHandle NH;
  232. image_transport::ImageTransport IT(NH);
  233. ros::MultiThreadedSpinner MTS;
  234.  
  235. //-----Parameter
  236. NH.getParam("/capture_directory", capture_directory);
  237. NH.getParam("/lidar_ip", lidar_ip);
  238. NH.getParam("/video/width", video_width);
  239. NH.getParam("/video/height", video_height);
  240. //-----Timer
  241. tim_15hz = NH.createTimer(ros::Duration(0.067), cllbck_tim_15hz);
  242. tim_30hz = NH.createTimer(ros::Duration(0.033), cllbck_tim_30hz);
  243. //-----Subscriber
  244. sub_frame_bgr[0] = IT.subscribe("cctv0/frame_bgr", 1, cllbck_sub_frame_bgr_cctv0);
  245. sub_frame_bgr[1] = IT.subscribe("cctv1/frame_bgr", 1, cllbck_sub_frame_bgr_cctv1);
  246. sub_frame_bgr[2] = IT.subscribe("cctv2/frame_bgr", 1, cllbck_sub_frame_bgr_cctv2);
  247.  
  248. //Menghentikan timer sebelum membuka koneksi UDP
  249. tim_15hz.stop();
  250. tim_30hz.stop();
  251. //Inisialisasi koneksi UDP ke LiDAR
  252. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  253. client_addr.sin_family = AF_INET;
  254. client_addr.sin_addr.s_addr = inet_addr(lidar_ip.c_str());
  255. client_addr.sin_port = htons(3018);
  256. //Memulai timer setelah membuka koneksi UDP
  257. tim_15hz.start();
  258. tim_30hz.start();
  259.  
  260. ROS_WARN("%s", lidar_ip.c_str());
  261. ROS_WARN("%d", sockfd);
  262.  
  263. MTS.spin();
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement