Guest User

Untitled

a guest
Oct 18th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.47 KB | None | 0 0
  1. #include "ardrone/ardrone.h"
  2.  
  3.  
  4. int main(int argc, char *argv[])
  5.  
  6. {
  7.  
  8. // AR.Drone class
  9.  
  10. ARDrone ardrone;
  11.  
  12.  
  13.  
  14. // Initialize
  15.  
  16. if (!ardrone.open()) {
  17.  
  18. std::cout << "Failed to initialize." << std::endl;
  19.  
  20. return -1;
  21.  
  22. }
  23.  
  24.  
  25.  
  26. // Thresholds
  27.  
  28. int minH = 0, maxH = 255;
  29.  
  30. int minS = 0, maxS = 255;
  31.  
  32. int minV = 0, maxV = 255;
  33.  
  34.  
  35.  
  36. // XML save data
  37.  
  38. std::string filename("thresholds.xml");
  39.  
  40. cv::FileStorage fs(filename, cv::FileStorage::READ);
  41.  
  42.  
  43.  
  44. // If there is a save file then read it
  45.  
  46. if (fs.isOpened()) {
  47.  
  48. maxH = fs["H_MAX"];
  49.  
  50. minH = fs["H_MIN"];
  51.  
  52. maxS = fs["S_MAX"];
  53.  
  54. minS = fs["S_MIN"];
  55.  
  56. maxV = fs["V_MAX"];
  57.  
  58. minV = fs["V_MIN"];
  59.  
  60. fs.release();
  61.  
  62. }
  63.  
  64.  
  65.  
  66. // Create a window
  67.  
  68. cv::namedWindow("binalized");
  69.  
  70. cv::createTrackbar("H max", "binalized", &maxH, 255);
  71.  
  72. cv::createTrackbar("H min", "binalized", &minH, 255);
  73.  
  74. cv::createTrackbar("S max", "binalized", &maxS, 255);
  75.  
  76. cv::createTrackbar("S min", "binalized", &minS, 255);
  77.  
  78. cv::createTrackbar("V max", "binalized", &maxV, 255);
  79.  
  80. cv::createTrackbar("V min", "binalized", &minV, 255);
  81.  
  82. cv::resizeWindow("binalized", 0, 0);
  83.  
  84.  
  85.  
  86. // Kalman filter
  87.  
  88. cv::KalmanFilter kalman(4, 2, 0);
  89.  
  90.  
  91.  
  92. // Sampling time [s]
  93.  
  94. const double dt = 1.0;
  95.  
  96.  
  97.  
  98. // Transition matrix (x, y, vx, vy)
  99.  
  100. cv::Mat1f A(4, 4);
  101.  
  102. A << 1.0, 0.0, dt, 0.0,
  103.  
  104. 0.0, 1.0, 0.0, dt,
  105.  
  106. 0.0, 0.0, 1.0, 0.0,
  107.  
  108. 0.0, 0.0, 0.0, 1.0;
  109.  
  110. kalman.transitionMatrix = A;
  111.  
  112.  
  113.  
  114. // Measurement matrix (x, y)
  115.  
  116. cv::Mat1f H(2, 4);
  117.  
  118. H << 1, 0, 0, 0,
  119.  
  120. 0, 1, 0, 0;
  121.  
  122. kalman.measurementMatrix = H;
  123.  
  124.  
  125.  
  126. // Process noise covairance (x, y, vx, vy)
  127.  
  128. cv::Mat1f Q(4, 4);
  129.  
  130. Q << 1e-5, 0.0, 0.0, 0.0,
  131.  
  132. 0.0, 1e-5, 0.0, 0.0,
  133.  
  134. 0.0, 0.0, 1e-5, 0.0,
  135.  
  136. 0.0, 0.0, 0.0, 1e-5;
  137.  
  138. kalman.processNoiseCov = Q;
  139.  
  140.  
  141.  
  142. // Measurement noise covariance (x, y)
  143.  
  144. cv::Mat1f R(2, 2);
  145.  
  146. R << 1e-1, 0.0,
  147.  
  148. 0.0, 1e-1;
  149.  
  150. kalman.measurementNoiseCov = R;
  151.  
  152.  
  153.  
  154. char textBuffer[80];
  155.  
  156. cv::Scalar green = CV_RGB(0,255,0);
  157.  
  158. float speed = 0.0;
  159.  
  160. bool learnMode = false;
  161.  
  162.  
  163.  
  164. // Main loop
  165.  
  166. while (1) {
  167.  
  168. // Key input
  169.  
  170. int key = cv::waitKey(33);
  171.  
  172. if (key == 0x1b) break;
  173.  
  174.  
  175.  
  176. // Get an image
  177.  
  178. cv::Mat image = ardrone.getImage();
  179.  
  180.  
  181.  
  182. // HSV image
  183.  
  184. cv::Mat hsv;
  185.  
  186. cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV_FULL);
  187.  
  188.  
  189.  
  190. // Binalize
  191.  
  192. cv::Mat binalized;
  193.  
  194. cv::Scalar lower(minH, minS, minV);
  195.  
  196. cv::Scalar upper(maxH, maxS, maxV);
  197.  
  198. cv::inRange(hsv, lower, upper, binalized);
  199.  
  200.  
  201.  
  202. // Show result
  203.  
  204. cv::imshow("binalized", binalized);
  205.  
  206.  
  207.  
  208. // De-noising
  209.  
  210. cv::Mat kernel = getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
  211.  
  212. cv::morphologyEx(binalized, binalized, cv::MORPH_CLOSE, kernel);
  213.  
  214. //cv::imshow("morphologyEx", binalized);
  215.  
  216.  
  217.  
  218. // Detect contours
  219.  
  220. std::vector<std::vector<cv::Point>> contours;
  221.  
  222. cv::findContours(binalized.clone(), contours, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);
  223.  
  224.  
  225.  
  226. // Find largest contour
  227.  
  228. int contour_index = -1;
  229.  
  230. double max_area = 0.0;
  231.  
  232. for (size_t i = 0; i < contours.size(); i++) {
  233.  
  234. double area = fabs(cv::contourArea(contours[i]));
  235.  
  236. if (area > max_area) {
  237.  
  238. contour_index = i;
  239.  
  240. max_area = area;
  241.  
  242. }
  243.  
  244. }
  245.  
  246.  
  247.  
  248. // Object detected
  249.  
  250. if (contour_index >= 0) {
  251.  
  252. // Moments
  253.  
  254. cv::Moments moments = cv::moments(contours[contour_index], true);
  255.  
  256. double marker_y = (int)(moments.m01 / moments.m00);
  257.  
  258. double marker_x = (int)(moments.m10 / moments.m00);
  259.  
  260.  
  261.  
  262. // Measurements
  263.  
  264. cv::Mat measurement = (cv::Mat1f(2, 1) << marker_x, marker_y);
  265.  
  266.  
  267.  
  268. // Correction
  269.  
  270. cv::Mat estimated = kalman.correct(measurement);
  271.  
  272.  
  273.  
  274. // Show result
  275.  
  276. cv::Rect rect = cv::boundingRect(contours[contour_index]);
  277.  
  278. cv::rectangle(image, rect, cv::Scalar(0, 255, 0));
  279.  
  280. }
  281.  
  282.  
  283.  
  284. // Prediction
  285.  
  286. cv::Mat1f prediction = kalman.predict();
  287.  
  288. int radius = 1e+3 * kalman.errorCovPre.at<float>(0, 0);
  289.  
  290.  
  291.  
  292. // Calculate object heading fraction
  293.  
  294. float heading = -((image.cols/2)-prediction(0, 0))/(image.cols/2);
  295.  
  296. sprintf(textBuffer, "heading = %+3.2f", heading);
  297.  
  298. putText(image, textBuffer, cvPoint(30,30), cv::FONT_HERSHEY_COMPLEX_SMALL, 0.8, green, 1, CV_AA);
  299.  
  300.  
  301.  
  302. // Show predicted position
  303.  
  304. cv::circle(image, cv::Point(prediction(0, 0), prediction(0, 1)), radius, green, 2);
  305.  
  306.  
  307.  
  308. //Speed
  309.  
  310. if ((key >= '0') && (key <= '9'))
  311.  
  312. {
  313.  
  314. speed = (key-'0')*0.1;
  315.  
  316. //printf("speed = %3.2fn", speed);
  317.  
  318. }
  319.  
  320. sprintf(textBuffer, "speed = %3.2f", speed);
  321.  
  322. putText(image, textBuffer, cvPoint(30,60), cv::FONT_HERSHEY_COMPLEX_SMALL, 0.8, green, 1, CV_AA);
  323.  
  324. // Drone control
  325.  
  326. double vx = 0.0, vy = 0.0, vz = 0.0, vr = 0.0;
  327.  
  328.  
  329.  
  330. // Auto-follow
  331.  
  332. vx = speed;
  333.  
  334. vr = -heading;
  335.  
  336. if (key == 0x260000) vx = 1.0;
  337.  
  338. if (key == 0x280000) vx = -1.0;
  339.  
  340. if (key == 0x250000) vr = 1.0;
  341.  
  342. if (key == 0x270000) vr = -1.0;
  343.  
  344. if (key == 'q') vz = 1.0;
  345.  
  346. if (key == 'a') vz = -1.0;
  347. ardrone.move3D(vx, vy, vz, vr);
  348.  
  349.  
  350.  
  351. // See you
  352.  
  353. ardrone.close();
  354.  
  355.  
  356.  
  357. return 0;
  358.  
  359. }
Add Comment
Please, Sign In to add comment