DataAcq.m 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. clc;
  2. clear;
  3. close('all');
  4. %% 连接设备
  5. % 获取摄像头列表
  6. VCI_USBCAN2 = 4;
  7. if CAN_CONNECT(1000) ~= 1
  8. return;
  9. end
  10. listCamera = webcamlist;
  11. if isempty(listCamera)
  12. error('未连接摄像头');
  13. else
  14. for idx = 1:length(listCamera)
  15. fprintf('[%d] %s\n', idx, listCamera{idx});
  16. end
  17. end
  18. % 连接摄像头
  19. cameraId = 1;
  20. deviceCamera = webcam(cameraId);
  21. deviceCamera.Resolution = '1280x720';
  22. % 连接雷达
  23. deviceRadar = tcpclient('192.168.31.88', 5000);
  24. empty_cnt = 0;
  25. %% 生成figure
  26. figure;
  27. hDataImage = imagesc(nan(480, 640, 3));
  28. axis image;
  29. set(gca, 'XTick', [], 'YTick', []);
  30. hTitle = title('', 'Interpreter', 'none', 'FontSize', 16);
  31. %% 采集数据
  32. pathData = fullfile('D:', 'RadarEye', string(datetime, 'yyyyMMdd_HHmmss_SSS'));
  33. mkdir(pathData);
  34. while isvalid(deviceRadar)
  35. pause(0.1);
  36. % 获取雷达数据
  37. numByte = deviceRadar.NumBytesAvailable;
  38. if numByte > 0
  39. dataRadar = uint8(read(deviceRadar, numByte, 'uint8'));
  40. empty_cnt = 0;
  41. else
  42. empty_cnt = empty_cnt + 1;
  43. end
  44. if empty_cnt > 3
  45. figure('Color', 'white'); % 创建白色背景的图形窗口
  46. plot(0,0,'k.'); % 绘制一个黑色点作为参考点
  47. text(0,0,'网络连接异常','FontSize',20,'HorizontalAlignment','center','Color','red'); % 添加文字
  48. break;
  49. end
  50. % 获取摄像头数据
  51. dataImage = snapshot(deviceCamera);
  52. %获取飞控数据
  53. [id,data,num] = Can_Rx(5);
  54. % 初始化为 NaN
  55. q0 = NaN; q1 = NaN; q2 = NaN; q3 = NaN;
  56. x = NaN; y = NaN; z = NaN; valid = NaN;
  57. foundIDs = false(1,4); % 用于标记四个 ID 是否已收到
  58. % 遍历接收到的帧
  59. for i = 1:num
  60. switch id(i)
  61. case hex2dec('2345') % q0 q1
  62. vals = typecast(uint8(data(i,:)), 'single');
  63. q0 = vals(1);
  64. q1 = vals(2);
  65. foundIDs(1) = true;
  66. case hex2dec('2346') % q2 q3
  67. vals = typecast(uint8(data(i,:)), 'single');
  68. q2 = vals(1);
  69. q3 = vals(2);
  70. foundIDs(2) = true;
  71. case hex2dec('2347') % x y
  72. vals = typecast(uint8(data(i,:)), 'single');
  73. x = vals(1);
  74. y = vals(2);
  75. foundIDs(3) = true;
  76. case hex2dec('2348') % z valid
  77. vals = typecast(uint8(data(i,:)), 'single');
  78. z = vals(1);
  79. valid = vals(2);
  80. foundIDs(4) = true;
  81. end
  82. % 如果四个 ID 都收到了,就结束循环
  83. if all(foundIDs)
  84. break;
  85. end
  86. end
  87. poseData = single([q0, q1, q2, q3, x, y, z, valid]);
  88. poseBytes = typecast(poseData, 'uint8'); % 转为字节流
  89. dataAll = [dataRadar(:); poseBytes(:)];
  90. % 保存数据
  91. name = string(datetime, 'yyyyMMdd_HHmmss_SSS');
  92. imwrite(dataImage, fullfile(pathData, sprintf('%s.jpg', name)));
  93. fileRadar = fopen(fullfile(pathData, sprintf('%s.bin', name)), 'wb+');
  94. fwrite(fileRadar, dataAll, 'uint8');
  95. fclose(fileRadar);
  96. %% 绘图显示
  97. hDataImage.CData = dataImage;
  98. hTitle.String = sprintf('%s: %d Byte', name, numByte);
  99. drawnow;
  100. end
  101. function [id,data,num] = Can_Rx(time_out_ms)
  102. num = 0;
  103. id = [];
  104. data = [];
  105. VCI_USBCAN2 = 4;
  106. len = VCI_GetReceiveNum(VCI_USBCAN2,0,0);
  107. if len
  108. [GetLength,Frames]=VCI_Receive(VCI_USBCAN2,0,0,2500,30);
  109. if GetLength
  110. id(1:GetLength) = Frames(1:GetLength,1);
  111. num = GetLength;
  112. for i = 1:GetLength
  113. % 将每个字节转换为十六进制字符串并存储在元胞中
  114. byteData = Frames(i,8:15);
  115. data(i,1:8) = byteData;
  116. end
  117. end
  118. end
  119. end
  120. function InitConfig = VCI_INIT_CONFIG(baudrate)
  121. AccCode = hex2dec('0x80000008');
  122. AccMask =hex2dec('0xFFFFFFFF');
  123. Reserved = 0;
  124. Filter= 0;
  125. Timing0 =hex2dec('0x00');
  126. if (baudrate == 500)
  127. Timing1 =hex2dec('0x1c');
  128. else
  129. Timing1 =hex2dec('0x14');
  130. end
  131. Mode =0;
  132. InitConfig=[AccCode AccMask Reserved Filter Timing0 Timing1 Mode];
  133. end
  134. function isOK = CAN_CONNECT(baudrate)
  135. isOK = 1;
  136. VCI_USBCAN2 = 4;
  137. if VCI_OpenDevice(VCI_USBCAN2,0,0)
  138. fprintf("VCI_OpenDevice successed \r\n");
  139. vci_initconfig = VCI_INIT_CONFIG(baudrate); %波特率500k,正常模式
  140. ret = VCI_InitCAN(VCI_USBCAN2, 0, 0, vci_initconfig);
  141. if ret == 1
  142. fprintf('call VCI_InitCAN1 successed \r\n');
  143. else
  144. fprintf('call VCI_InitCAN1 error \r\n');
  145. isOK = 0;
  146. end
  147. ret = VCI_StartCAN(VCI_USBCAN2, 0, 0);
  148. if ret == 1
  149. fprintf('call VCI_StartCAN successed \r\n');
  150. else
  151. fprintf('call VCI_StartCAN error \r\n');
  152. isOK = 0;
  153. end
  154. pause(0.1);
  155. else
  156. fprintf("VCI_OpenDevice failed \r\n");
  157. isOK = 0;
  158. end
  159. end
  160. delete(deviceRadar);
  161. clear deviceRadar;
  162. clear('cam');