聚丰项目 > 基于RSSI的室内AGV定位系统开发
项目目的:通过测量接收信号强度(RSSI)来实现AGV在室内的定位。 主要技术:接收信号强度(RSSI)与距离的精确转化、三点定位算法、多元方程组的无解、唯一解、多解判定、误差处理等; 进度介绍:当前已经实现RSSI与距离的精确转换,在不同使用环境下需要对相关参数进行现场调整,以提高精确度。三点定位算法,多远方程组的求解找到相对简单解法,目前还未实现(精确定位).
274632473
分享274632473
团队成员
蒙萌 测试
STM32 NucleoF401RE开发板
让用户可以从各种性能、功耗和功能组合中进行选择,为用户实现新创意、用任何STM32微控器产品建立产品原型提供了一种成本低廉且灵活便捷的途径。
Arduino™ 连接支持和ST Morpho排针提供广泛的专用屏蔽罩选件,便于扩展STM32 Nucleo开放式开发平台的功能。STM32 Nucleo板无需单独的探测器,因其已集成了ST-LINK/V2-1调试器/编程器。
STM32 Nucleo板自带STM32全面的软件 HAL 库以及各种打包的软件示例,并能直接访问mbed在线资源。
产品特色STM32微控制器,采用LQFP64封装两类扩展资源Arduino Uno R3连接STMicroelectronics Morpho扩展排针,用于全面访问所有STM32 I/O板载ST-LINK/V2-1调试器/编程器,采用SWD连接器选择模式开关,可使用套件作为独立ST-LINK/V2-1灵活的板电源USB VBUS或外接电源(3.3V、5V、7 - 12V)电源管理接入点可使用mbed (mbed.org)三个LEDUSB通信(LD1)、用户LED(LD2)、电源LED(LD3)两个按钮:USER和RESETUSB重新列举功能:USB 支持三个不同的接口虚拟COM端口大容量存储调试端口全面的免费软件HAL库,包括各种软件示例受各种集成开发环境(IDE)支持,如IAR、Keil、基于GCC的IDE等.
ESP8266 贴片式 Wi-Fi 模组
基于 ESP8266EX 芯片设计开发的物联网无线模组。它集成了 TCP/IP 网络协议栈,32 位低功耗 MCU,10 比特精度 ADC,并带有 HSPI、UART、PWM、I2C 和 I2S 等接口。ESP-WROOM-S2 模组 2 MB SPI Flash,接在 HSPI 上。作为 SDIO 中的 SPI 从机模式工作时,传输速率可达 8 Mbps。
EMW3080是单3.3V供电的、集成Wi-Fi和Cortex-M4F MCU的嵌入式Wi-Fi模块,最高支持133M主频和256K RAM,强大的浮点运算,分为A(硬件加密版)/B(标准版)2个版本。
EMW3080(A):内部集成加密芯片,为客户固件的完整性、合法性,以及与云端通信的安全性提供硬件加密保障。
EMW3080(B):无内部加密芯片,Memory、外设接口资源丰富,能满足大部分应用需求和多云的要求。
科庆EMW3080
加密芯片特性:
(1)对客户固件加密,防止被破解;
(2)对客户固件进行数字签名,保证其完整性和合法性,防止被篡改或OTA过程中被替换;
(3)自动产生私钥,保存从云端签发的设备证书,云端可以识别设备的合法性,防止非法、仿冒、非安全的设备接入云端。
WiFi相关特性
支持802.11b/g/n标准HT-40
支持Station, SoftAP, SoftAP+Station 模式
支持EasyLink,Alink,Joinlink等多种配网,加密安全的OTA升级
工作电压:3.0V-3.6V
主接口:UART,I2C,PWM,GPIO
尺寸:18.0*33mm
工作温度:-20℃ to +85℃
天线:PCB天线,或外接天线连接器
软件平台:win10 64位操作系统
开发工具:Keil MDK5.17 友善串口调试助手
原理介绍:
1.RSSI与距离的转换
由于无线信号的传输具有环境损耗、多径效应等特点,采用以下近似计算公式。
RSSI与距离转换的计算公式:
d = 10^((abs(RSSI) - A) / (10 * n))
其中:
d - 计算所得距离
RSSI - 接收信号强度(负值)
A - 发射端和接收端相隔1米时的信号强度
n - 环境衰减因子
传入RSSI值,返回距离(单位:米)通过实验,A值的最佳范围为45—49,n值最佳范围为3.25—4.5。
由于所处环境不同,每台发射源(无线设备)对应参数值都不一样。按道理,公式里的每项参数都应该做实验(校准)获得。
当你不知道周围的无线设备准确位置时,只能给A和n赋经验值。
如果对于静止或者低速的运动物理的时,可用平均值滤波来提高测量精度或者IIR滤波执行利递归解得平均值处理的,典型的α取0.75--0.95 :
如果对于高速运动的物体可用卡尔曼滤波。
2.三角定位的原理
条件:已知三个点的坐标A(x1 ,y1),B( x2 ,y2 ),C( x3 ,y3) ,以及未知点Q( x ,y)到三个点的距离RA ,RB ,RC
那么就有方程组:
(x1 – x)^2 + (y1-y)^2 =RA^2
(x2 – x)^2 + (y2-y)^2= RB^2
(x3 – x)^2 + (y3-y)^2= RC^2
无解:
唯一解:
多解:
实际使用中主要解决有多解的情况,需要采取相应的容差,误差处理才能得到一个比较好的定位精准度。目前对容差以及误差处理部分还没有一个良好的解决办法,希望在后续时间能够得到相应的处理。
3.部分代码展示
1. static float RssiToDista(int rssi)
2. {
3. uint8 A = 59;
4. float n = 3.0;
5.
6. int iRssi = abs(rssi);
7. float power = (iRssi-A)/(10*n);
8 。 return pow(10, power);
9. }
1. void uart_init(u32 bound)
2. {
3. GPIO_InitTypeDef GPIO_InitStructure;
4. USART_InitTypeDef USART_InitStructure;
5. NVIC_InitTypeDef NVIC_InitStructure;
6.
7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
8. //USART1_TX GPIOA.9
9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
12. GPIO_Init(GPIOA, &GPIO_InitStructure);
13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
15. GPIO_Init(GPIOA, &GPIO_InitStructure);
16. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
17. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3
18. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
19. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
20. NVIC_Init(&NVIC_InitStructure);
21. USART_InitStructure.USART_BaudRate = bound;
22. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
23. USART_InitStructure.USART_StopBits = USART_StopBits_1;
24. USART_InitStructure.USART_Parity = USART_Parity_No;
25. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
26. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
27.
28. USART_Init(USART1, &USART_InitStructure); //
29. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
30. USART_Cmd(USART1, ENABLE);
31.
32. }
33. void USART1_IRQHandler(void)
34. {
35. u8 Res;
36. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
37. {
38. Res =USART_ReceiveData(USART1);
39.
40. if((USART_RX_STA&0x8000)==0)
41. {
42. if(USART_RX_STA&0x4000)
43. {
44. if(Res!=0x0a)USART_RX_STA=0;
45. else USART_RX_STA|=0x8000;
46. }
47. else
48. {
49. if(Res==0x0d)USART_RX_STA|=0x4000;
50. else
51. {
52. USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
53. USART_RX_STA++;
54. if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
55. }
56. }
57. }
58. }
59. }
60. #endif
ieeesss001: 请问stm作用是啥?
回复
ieeesss001: 能不能不用STM?我不太懂
回复
h1654155745.6760: 你好。我们公司需要这个技术,可以花钱购买,我的微信18301926265,您也可以留下您的联系方式。
回复