回答

收藏

[项目提交] 《2024 DigiKey 汽车应用创意挑战赛》周边风险物....

#竞赛 #竞赛 627 人阅读 | 0 人回复 | 2025-02-12

本帖最后由 a76290391 于 2025-2-13 12:13 编辑

1 项目介绍
  本次参加‘第二届“2024 汽车应用创意挑战赛”’,由DigiKey得捷&ADI赞助。本次主要参与的方向是安全技术。
  使用检测器模块时刻检测周边的物体距离和相对速度,并展示到上位机。
  树莓派作为数据中心,用于展示数据,用于风险检测报警。
2 硬件介绍
  距离检测模块,使用激光来回时间差检测距离,测试距离快且准确。具有30°左右的视界,可以测试各个角度的物体距离。内部具有一个arm m0核,用于快速检测距离,并具有一个可信寄存器,用于决定是否取用距离值的可信度。
  树莓派5采用运行频率为2.4GHz的64位四核Arm Cortex-A76处理器,用了新的四核2.4 GHz Cortex-A76 Arm CPU(旧型号最初是Cortex-A72,主频为1.5 GHz,但固件更新将其提升到1.8 GHz),新的南桥承载板承诺提高USB 3的吞吐量,并搭载了新的VideoCore VII GPU(树莓派4上的VideoCore VI主频为500 MHz,而VideoCore VII主频为800 MHz)。整个板子上还有许多小的改进,包括带有安装孔的内置风扇连接器、双摄像头连接器,以及与更高速卡兼容的MicroSD卡读卡器
3 项目框图
  距离检测模块,已按照100ms的时间差,计算距离值,并于上次的距离值进行计算,获取即时速度。
  树莓派作为数据中心,等待网路的数据,用于展示。

4 代码讲解
  连接树莓派服务器
  1. static EventGroupHandle_t s_wifi_event_group;
  2. #define HOST_IP_ADDR                 "192.168.2.137"
  3. #define HOST_PORT                         6666

  4. static int s_retry_num = 0;
  5. static  char payload[256] = "Message from car race: 'hello'!!";
  6. int car_sock  = 0;
  7. void tcp_client_task()
  8. {
  9.     struct sockaddr_in dest_addr;
  10.     inet_pton(AF_INET, HOST_IP_ADDR, &dest_addr.sin_addr);
  11.     dest_addr.sin_family = AF_INET;
  12.     dest_addr.sin_port = htons(HOST_PORT);

  13.     car_sock =  socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
  14.     if (car_sock < 0) {
  15.         printf("[%s.%d] Unable to create socket: errno %d\n",__func__,__LINE__, errno);
  16.         return;
  17.     }

  18.     printf("[%s.%d]Socket created, connecting to %s:%d\n",__func__,__LINE__, HOST_IP_ADDR, HOST_PORT);
  19.         char rx_buffer[128];
  20.     int err = connect(car_sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  21.     if (err != 0) {
  22.         printf("[%s.%d] Socket unable to connect: errno %d\n",__func__,__LINE__, errno);
  23.         return;
  24.     }
  25.     printf("[%s.%d] Successfully connected\n",__func__,__LINE__);
  26.         
  27.     err = send(car_sock, payload, strlen(payload), 0);
  28.     if (err < 0) {
  29.         printf("[%s.%d] Error occurred during sending: errno %d\n",__func__,__LINE__, errno);
  30.         return;
  31.     }

  32.     memset(rx_buffer, 0, sizeof(rx_buffer));
  33.     int len = recv(car_sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
  34.     if (len < 0) {
  35.         printf("[%s.%d]recv failed: errno %d\n",__func__,__LINE__, errno);
  36.     } else {
  37.         printf("[%s.%d]Received %d bytes from %s:\n",__func__,__LINE__, len, HOST_IP_ADDR);
  38.         printf("[%s.%d]data: %s\n",__func__,__LINE__, rx_buffer);
  39.     }
  40. }
复制代码
发送数据给数据中心
  1. void sock_send_data(char *payload,int len)
  2. {
  3.         if(!car_sock) return;
  4.     int err = send(car_sock, payload, len, 0);
  5.     if (err < 0) {
  6.         printf("[%s.%d] Error occurred during sending: errno %d\n",__func__,__LINE__, errno);
  7.     }

  8. }
复制代码

等待客户端连接,并读取数据
  1. while(1){
  2.                 addrlen=sizeof(struct sockaddr_in);
  3.                 connfd = accept(sockfd, (struct sockaddr *)&client_addr,&addrlen);
  4.                 if(connfd < 0){
  5.                         perror("accept:");
  6.                         goto err;
  7.                 }
  8.                 printf("连接的客户端IP地址:%s\n",inet_ntoa(client_addr.sin_addr));
  9.                 printf("连接的客户端端口号:%d\n",ntohs(client_addr.sin_port));
  10.                 write(connfd,"hello you!",10);
  11.                 while(1){
  12.                         memset(buf,0,sizeof(buf));
  13.                         ret = read(connfd,buf,sizeof(buf));
  14.                         if(ret < 0){
  15.                                 perror("read:");
  16.                                 break;
  17.                         }else if(ret == 0){
  18.                                 printf("write close!\n");
  19.                                 break;
  20.                         }else{
  21.                                 printf("recv:%s\n",buf);
  22.                         }
  23.                 }
  24.                 close(connfd);        
  25.         }
复制代码

根据数据计算可用的距离值
  1. uint16_t cal_distance(uint16_t *data)
  2. {
  3.         uint8_t cnts = 0;
  4.         uint8_t max = 0;
  5.         uint16_t valall = 0;
  6.         uint16_t maxval = 0;
  7.         uint16_t minval = 0xffff;
  8.         while(max < 5){
  9.                 if(data[max]){
  10.                         valall+=data[max];
  11.                         if(maxval < data[max]){
  12.                                 maxval = data[max];
  13.                         }
  14.                         if(data[max] < minval){
  15.                                 minval = data[max];
  16.                         }
  17.                         cnts++;
  18.                 }
  19.                 max++;
  20.         }
  21.         if(3 <= cnts){
  22.                 valall = valall-maxval-minval;
  23.                 valall = valall/(cnts-2);
  24.         }else{
  25.                 valall = 0;
  26.         }
  27.         return valall;
  28. }
复制代码
计算速度
  1. double preDis = 0;
  2. double cuDis = 0;
  3. double cuSudu = 0;
  4. cuDis = cal_distance(spadz5);
  5. cuSudu = (preDis - cuDis)*10;
  6. preDis = cuDis;
复制代码

5 效果展示
计算结果 有当前物体与我距离,当前物体的速度数据。


视频地址:2024 汽车应用创意挑战赛-相对物体风险检测_哔哩哔哩_bilibili
6 结言
  非常开心能够参加本次活动,项目设计有点简单,初次使用树莓派,很多细节不太了解,会持续使用树莓派,学习更多知识。
  本次活动学习到了很多知识,群里大佬们的知识很丰富,让人心向往之。祝是非网论坛和得捷合作更多更好,提供更多更好的竞赛活动,再次感谢是非网论坛和得捷。
7 代码
code.zip (51.63 KB, 下载次数: 1)



分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条