51uwb.cn

标题: 【蓝点开源】UWB 运动传感器融合定位 [打印本页]

作者: 蓝点无限    时间: 2021-9-5 12:13
标题: 【蓝点开源】UWB 运动传感器融合定位
论坛开源项目,不作为淘宝订单资料,任何疑问不走淘宝旺旺交流。有问题直接发帖

【蓝点开源】UWB 运动传感器融合定位项目,基于TWR 算法和MPU9250 运动传感器,实现简单数据融合。
目录:
    引言
    硬件
    固件
       固件-读取MPU9250 9轴数据
      固件- wake-on-Motion模式
      固件 - UWB集成MPU9250
    上位机


引言:
UWB定位,不论是TWR 还是TDOA,实质都是基于电磁信号空中飞行时间(TOF),然后换算成距离,通过软件算法获取被定位坐标。
电磁信号,收到干扰和遮挡等会出现定位误差再说难免。
而结合运动传感器进行数据融合则是对UWB定位误差的一个动态补偿。 目前运动传感器封装小,易于集成,已经很多实际项目采用UWB+运动传感器方式进行定位。
但是这些资料很少,往往只能见于某篇论文或者某个商品的介绍。
这里,我们做抛砖引玉,做一些基础功能,供各位开发者参考。
我们这里使用的是MPU9250 9轴传感器。传感器介绍各位可以参考官方介绍:
https://invensense.tdk.com/products/motion-tracking/9-axis/mpu-9250/
MPU9250 支持I2C 和 SPI接口,我们板子使用的I2C接口,我们这里使用STM32F4 软件方式I2C 驱动,并获取9轴数据。

UWB数据融合,我们打算一共做分三部分
1 MPU9250 驱动,主要是使用STM32 成功读取MPU9250 内部数据, 数据是融合的前提。
2 UWB固件,将MPU9250 集成到 UWB 程序内,我们打算把这部分功能集成到之前开源的多标签多基站固件,做到彻底开源。
3 上位机解析,修改我们之前开源上位机,上位机可以解析获取MPU9250 原始数据。
我们打算在上位机中实现UWB定位和加速度二者简单融合,更为复杂的功能算法大家可以自行研究。

硬件:

基站使用我们现有定位套件的BP30或者BP400,而标签需要使用一个集成运动传感器的板子,我们目前有一批商用模块。
这部些模块有完整的外壳,内置600ma锂电池,PCB包括UWB+PA功放,MPU9250加速度传感器以及振动小电机等。
标签外形:
(, 下载次数: 2211)

MPU9250部分原理图:
(, 下载次数: 8835)

固件:
固件部分主要通过STM32实现驱动MPU9250模块,硬件实现部分,我们分为了三部分,第一部分实现读取9轴数据,第二部分实现wake-up-motion中断,第三部分将MPU9250 全部代码集成到现有UWB固件中。
固件-读取MPU9250 9轴数据

i2c_sw.c  配置软件I2C
mpu9250.c MPU9250初始化以及寄存器操作
代码配置I2C 对应接口
  1. #define   GPIO_SW_I2C1_SCL                        GPIOA
  2. #define   GPIO_SW_I2C1_SDA                        GPIOB
  3. #define   GPIO_SW_I2C1_SCL_PIN                GPIO_PIN_8
  4. #define   GPIO_SW_I2C1_SDA_PIN                GPIO_PIN_4</font></b></font></font>
复制代码
测试接口代码:
  1. #include "i2c_sw.h"
  2. void Sw_I2C_Init()        
  3. {
  4.           SW_I2C_initial();
  5.     i2c_port_initial(SW_I2C1);
  6. }

  7. #include "mpu9250.h"

  8. /* Sensor Handler */
  9. MPU9250_t mpu9250;
  10. HAL_StatusTypeDef whoAmI_Check(MPU9250_t *mpu9250);

  11. int Mpu9250_Test(void)
  12. {
  13.         Sw_I2C_Init();
  14.         MPU9250_Init(&mpu9250, MPU9250_Device_0, ACCEL_SCALE_16G, GYRO_SCALE_2000dps, MAG_SCALE_16bit);
  15.         while (1)
  16.         {
  17.                 MPU9250_ReadAcc(&mpu9250);
  18.                 printf("acc.x = %0.2f acc.y = %0.2f acc.z= %0.2f\n",mpu9250.acc[0],mpu9250.acc[1],mpu9250.acc[2]);
  19.                 MPU9250_ReadGyro(&mpu9250);
  20.                 HAL_Delay(300);

  21.                 printf("gyro.x = %0.2f gyro.y = %0.2f gyro.z= %0.2f\n",mpu9250.gyro[0],mpu9250.gyro[1],mpu9250.gyro[2]);
  22.                
  23.                 MPU9250_ReadMag(&mpu9250);
  24.                 printf("mag.x = %0.2f mag.y = %0.2f mag.z = %0.2f\n",mpu9250.mag[0],mpu9250.mag[1],mpu9250.mag[2]);
  25.                
  26.                 HAL_Delay(300);
  27.                 MPU9250_ReadTemperature(&mpu9250);
  28.                 printf("Temp = %0.2f\n",mpu9250.temp);
  29.                 HAL_Delay(300);

  30.         }
  31. }
复制代码
测试结果:
(, 下载次数: 2192)

固件- wake-on-Motion模式
使用MPU9250 通常会读取9轴数据,或者DMP 四元数据,而我们这里使用的是一个运动检测功能, Wake-on-Motion 模式。
这个模式也是MPU9250 自带的一个功能。
大概功能描述:
设定一个加速度变化阈值,当MPU9250 检测到加速度超过这个阈值后,可以发送一个中断信息给主控。
官方文档说明:
(, 下载次数: 2194)

UWB定位,尤其给人定位,其实人的行走都不是一个匀速过程,存在微小的加速度,适当调整MPU9250 加速度阈值,即可实现人的运动检测功能。再结合UWB本身完成数据融合。
测试代码实现:
按照MPU9250 流程图,实现Wake-on-Motion ,并拉STM32中断,在中断里点亮LED。
1. Wake-on-Motion 配置函数
  1. void Enable_MPU9250_MovetionDetection(MPU9250_t *MPU9250)
  2. {
  3.         //0x6b, 0b00000001
  4.         writeByte(&hi2c1, MPU9250->I2C_Addr, PWR_MGMT_1, 0x01);
  5.         //0x6c, 0b00000111
  6.         writeByte(&hi2c1, MPU9250->I2C_Addr, PWR_MGMT_2, 0x07);
  7.         //0x1d, 0b00000101
  8.         writeByte(&hi2c1, MPU9250->I2C_Addr, ACCEL_CONFIG_2, 0x05);
  9.         
  10.         //0x37, 0b0011 0000 -- 只有读取值才clear 中断
  11.         //writeByte(&hi2c1, MPU9250->I2C_Addr, INT_PIN_CFG, 0x00);
  12.                
  13.         //0x69, 0b11000000
  14.         writeByte(&hi2c1, MPU9250->I2C_Addr, MOT_DETECT_CTRL, 0xC0);
  15.         //0x1f, 0x7f
  16.         writeByte(&hi2c1, MPU9250->I2C_Addr, WOM_THR, 0x01);
  17.           //0x38, 0x40
  18.         writeByte(&hi2c1, MPU9250->I2C_Addr, INT_ENABLE, 0x40);
  19.         //0x1e, 0b00000100
  20.         writeByte(&hi2c1, MPU9250->I2C_Addr, LP_ACCEL_ODR, 0x04);
  21.         //0x6b, 0b0010 0000
  22.         writeByte(&hi2c1, MPU9250->I2C_Addr, PWR_MGMT_1, 0x20);

  23. //        writeByte(&hi2c1, MPU9250->I2C_Addr, INT_STATUS, 0xFF);
  24. }
复制代码
2. STM32 中断配置
我们提供了MPU9250 和 STM32 的链接图,MPU9250 输出中断链接到STM32 PB15,中断配置代码如下

  1.   GPIO_InitStruct.Pin = GPIO_PIN_15;
  2.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  3.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  4.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  5.   HAL_NVIC_SetPriority(EXTI15_10_IRQn,
  6.   HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
复制代码
3 中断处理函数
中断处理函数中,实习点亮LED
  1. void EXTI15_10_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN EXTI15_10_IRQn 0 */
  4.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); //PB7 = 1 LED_ON

  5.   /* USER CODE END EXTI15_10_IRQn 0 */
  6.   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
  7.   /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  8.   /* USER CODE END EXTI15_10_IRQn 1 */
  9. }</font></b></font></font>
复制代码
4 顶层测试函数
初始化MPU9250 后,配置Wake-on-Motion,在while循环中,关闭由中断点亮的LED,从而实现当运动时LED亮,1S内没有运动LED熄灭。
  1. int Mpu9250_Test(void)
  2. {
  3.     Sw_I2C_Init();
  4.     MPU9250_Init(&mpu9250, MPU9250_Device_0, ACCEL_SCALE_16G, GYRO_SCALE_2000dps, MAG_SCALE_16bit);
  5.     Enable_MPU9250_MovetionDetection(&mpu9250);
  6.     HAL_Delay(1000);

  7.     while (1)
  8.     {
  9.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, !GPIO_PIN_SET); //PB7 = 1 LED_ON
  10.         HAL_Delay(1000);

  11.     }
  12. }
复制代码
5 关于阈值设定说明
加速度阈值设定如下语句实现,这里设定值为1. 实际测试,当设定为1,人体微动可以检测。设置2-3,摆手可以检测,如果设置为F,用力甩臂可以检测。
  1. writeByte(&hi2c1, MPU9250->I2C_Addr, WOM_THR, 0x01);
复制代码
固件 - UWB集成MPU9250
现固件代码,代码git 链接参见本文末尾。
我们的固件实现基础是之前的《TWR算法-多基站多标签固件》,
再此基础上将PU9250 Wake-on-Motion 模式 MPU9250 相关内容进行整合。
具体改动
1. 将MPU9250 相关驱动和初始化移植
2 定义全局变量isMpu9250_moved 用来保存是否在该定位周期内模块发生运动
  1. if(Count_Anthor() < 4)
  2.             {
  3.                 gProcess_Dis = 0;
  4.                 BPhero_TAG_Broadcast();
  5.                 gSend_index = 0;
  6.                  // HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
  7.                 isMpu9250_moved = 0;
  8.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, !GPIO_PIN_SET); //PB7 = 1 LED_ON

  9.             }
  10.             else
  11.             {
  12.                 if(gSend_index ==Count_Anthor())
  13.                 {
  14.                     gSend_index= 0;
  15.                     Send_Dis_To_Anthor0();
  16.                     isMpu9250_moved = 0;
  17.                     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, !GPIO_PIN_SET); //PB7 = 1 LED_ON

  18.                 } else
  19.                 {
  20.                     gProcess_Dis = 1;
  21.                     BPhero_Distance_Measure_Specail_ANTHOR();// 从1 2 3 4发送
  22.                   //        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);

  23.                 }
复制代码
2 标签将isMpu9250_moved 打包并以广播的形式发送给各个模块
  1. static void Send_Dis_To_Anthor0(void)
  2. {
  3.     static int framenum = 0 ;
  4.     char crc_byte = 0;
  5.     //only send this message to anthor0:short address equal 0x0001
  6.     msg_f_send.destAddr[0] = 0xFF;
  7.     msg_f_send.destAddr[1] = 0xFF;

  8.     msg_f_send.seqNum = distance_seqnum;

  9.     msg_f_send.messageData[0]='M';
  10.         msg_f_send.messageData[1] = 0;//数据包长度
  11.         
  12.     uint8 *pAnthor_Str = &msg_f_send.messageData[2];
  13.     int str_len = 0x20;
  14.         sprintf(pAnthor_Str, "&&&:%02X$%04X:%d:%02X,str_len,SHORT_ADDR,isMpu9250_moved,msg_f_send.seqNum);//AA55 ANTHORID
  15.    
  16.         pAnthor_Str = pAnthor_Str + 15+2;
  17.         isMpu9250_moved = 0;
  18.     for(uint8 index = 0 ; index < MAX_ANTHOR; index++)
  19.     {
  20.         if(anthor_info[index].alive == 1)
  21.         {
  22.             sprintf(pAnthor_Str, "%04X:%04X:%02X#",anthor_info[index].short_address,anthor_info[index].distance,anthor_info[index].rssi_info);
  23.             pAnthor_Str = pAnthor_Str + 13;
  24.         }
  25.     }
  26.     pAnthor_Str = pAnthor_Str - 1;
  27.     sprintf(pAnthor_Str, "$AA##\r\n");

  28.     while(msg_f_send.messageData[str_len] != '\n')
  29.     {
  30.         crc_byte =crc_byte^msg_f_send.messageData[str_len];
  31.         str_len++;
  32.     }
  33.     str_len++;//字符串最后追加'\n'
  34.     printf(&msg_f_send.messageData[2]);
  35.     msg_f_send.messageData[1] = str_len - 2;//有用数据,其他模块需要传输到串口的数据
  36.                
  37.     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, !GPIO_PIN_RESET);//PA node ,enable pa
  38.     dwt_writetxdata(11 + str_len,(uint8 *)&msg_f_send, 0) ;  // write the frame data
  39.     dwt_writetxfctrl(11 + str_len, 0);
  40.     dwt_starttx(DWT_START_TX_IMMEDIATE);
  41.     while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))
  42.     { };
  43.                 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);
  44.     framenum++;
  45.     LCD_Display_Distance();
  46. }
复制代码
3 基站收到‘M’信息,通过串口送出
  1. case 'M':
  2.                 //将收到的距离信息通过串口发送给电脑上位机
  3.                 USART_puts(&msg_f->messageData[2],msg_f->messageData[1]);
  4.                 break;
复制代码
标签发送‘M’信息,第一个字节是‘M’,第二个字节保存了数据长度,在处理‘M’信息,直接使用msg_f->messageData[1] 定义送到串口的数据长度。
上位机测试效果:
(, 下载次数: 2151)

源码链接:
固件源码已经放到git上,V1.0 版本开发完成,请详细看下面的描述
https://tuzhuke@bitbucket.org/tuzhuke/bp30_multianthor.git
Hash:3ec3d27cabc914365549fb0d907e034f3caa21ec

上位机:
这个部分实现上位机代码,上位机使用我们之前开源Python版本TWR上位机,代码可以在末尾论坛链接下载

直接上代码,代码主要是在《[开源项目] 蓝点无限 UWB Python版本上位机》基础上修改,这里列出代码更改部分。
1 解析数据包中的运动变量'acc',并存放到字典中
  1. result_dict = {'tag': 0x1005, 'acc':0, 'seq': 7, 'time': 1234, 'anthor_count': 4,'anthor': []}
  2. # 数据包以&&& 开头
  3. res = re.findall(r'&&&', string)
  4. flag = 1
  5. if len(res) > 0:
  6.     # step1 print message length,ex 76
  7.     temp_string = string.split(":")[0]  # &&&:80$
  8.     data_len = int(temp_string.split(":")[1], 16)
  9.     # tag info
  10.     temp_string = string.split()[1]  # 000A:20
  11.     tag_id = int(temp_string.split(":")[0], 16)  # 000A
  12.     tag_acc = int(temp_string.split(":")[1], 16)
  13.     tag_seq = int(temp_string.split(":")[2], 16)  # 20
  14.     # print("标签ID: %02X  Seq: %X" % (tag_id, tag_seq))
  15.     result_dict['tag'] = tag_id
  16.     result_dict['acc'] = tag_acc
  17.     result_dict['seq'] = tag_seq
复制代码
2 在返回结果中,将运动信息一并返回给上层
  1. def twr_main(input_string):
  2.     print(input_string)
  3.     error_flag, result_dic = Process_String_Before_Udp(input_string)
  4.     if error_flag == 0:
  5.         [location_result, location_seq, location_addr, location_x, location_y] = Compute_Location(result_dic)
  6.         return location_result, location_seq, location_addr, location_x, location_y, result_dic['acc']
  7.     return 0, 0, 0, 0, 0, 0
复制代码
3 顶层收到定位结果和运动信息,打印结果,并发送给处理函数
  1.        [location_result, location_seq, location_addr, location_x, location_y, tag_acc] = twr_main(msg)
  2.                 print(tag_acc)
  3.                 if location_result == 1:
  4.                     self.data_result.emit(
  5.                         '%d %d %0.2f %0.2f %d' % (location_seq, location_addr, location_x, location_y, tag_acc))
复制代码
4 UWB和运动信息进行简单融合,当模块静止,不更新坐标信息
  1. def insert_result(self, input_str):
  2.      strlist = input_str.split(' ')
  3.      location_addr = int(strlist[1])
  4.      location_x = float(strlist[2])
  5.      location_y = float(strlist[3])
  6.      tag_acc = int(strlist[4])
  7.      print("acc = %d"%tag_acc)
  8.      print("insert result")
  9.      if tag_acc == 1:#只有模块移动的时候更新坐标
  10.          self.Insert_Tag_Result(location_addr,
  11.                                 {"x": location_x, "y": location_y, "z": 0, "qt": QGraphicsEllipseItem(-10, -10, 10, 10)})
复制代码
 其他代码,为了调试方便,在上位机增加了串口接收功能
  1. class ComThread(QtCore.QThread):
  2.     data_result = QtCore.pyqtSignal(object)
  3.     data_draf = QtCore.pyqtSignal(object)

  4.     def __init__(self):
  5.         super(ComThread, self).__init__()
  6.         self.l_serial = None
  7.         self.alive = False
  8.         self.waitEnd = None
  9.         self.ID = None
  10.         self.data = None
  11.         self.port = None

  12.     def set_port(self,port):
  13.         self.port = port
  14.         print(self.port)

  15.     def waiting(self):
  16.         if not self.waitEnd is None:
  17.             self.waitEnd.wait()

  18.     def SetStopEvent(self):
  19.         if not self.waitEnd is None:
  20.             self.waitEnd.set()
  21.         self.alive = False
  22.         self.stop()

  23.     def start(self):
  24.         self.l_serial = serial.Serial()
  25.         self.l_serial.port = self.port
  26.         self.l_serial.baudrate = 115200
  27.         self.l_serial.timeout = 2
  28.         self.l_serial.open()
  29.         if self.l_serial.isOpen():
  30.             self.waitEnd = threading.Event()
  31.             self.alive = True
  32.             self.thread_read = None
  33.             self.thread_read = threading.Thread(target=self.FirstReader)
  34.             self.thread_read.setDaemon(1)
  35.             self.thread_read.start()
  36.             return True
  37.         else:
  38.             return False

  39.     def SendDate(self, i_msg, send):
  40.         lmsg = ''
  41.         isOK = False
  42.         if isinstance(i_msg):
  43.             lmsg = i_msg.encode('gb18030')
  44.         else:
  45.             lmsg = i_msg
  46.         try:
  47.             # 发送数据到相应的处理组件
  48.             self.l_serial.write(send)
  49.         except Exception as ex:
  50.             pass;
  51.         return isOK

  52.     def FirstReader(self):
  53.         while self.alive:
  54.             data = ''
  55.             data = data.encode('utf-8')
  56.             n = self.l_serial.inWaiting()
  57.             if n:
  58.                 data = self.l_serial.readline()
  59.                 print(data)
  60.                 msg =str(data, encoding="utf-8")
  61.                 self.data_draf.emit(msg)  # for debug only

  62.                 [location_result, location_seq, location_addr, location_x, location_y, tag_acc] = twr_main(msg)
  63.                 print(tag_acc)
  64.                 if location_result == 1:
  65.                     self.data_result.emit(
  66.                         '%d %d %0.2f %0.2f %d' % (location_seq, location_addr, location_x, location_y, tag_acc))
  67.         # #                 bphero_dispose(str(data))

  68.         self.waitEnd.set()
  69.         self.alive = False

  70.     def stop(self):
  71.         self.alive = False
  72.         self.thread_read.join()
  73.         if self.l_serial.isOpen():
  74.             self.l_serial.close()
复制代码
数据融合版本上位机源码下载:
(, 下载次数: 140)















作者: 蓝点无限    时间: 2021-9-11 22:49
UWB运动传感器融合相关视频:

视频1:UWB 和 运动传感器 数据融合定位 硬件实现示例



视频2:UWB 和 运动传感器 数据融合定位软件实现以及室内测试




作者: vacabun    时间: 2021-9-29 19:27

感谢分享!!!!!
作者: Rika777    时间: 2021-10-14 20:58
赞一个!!!!
作者: 760371303    时间: 2021-10-15 01:31
感谢大佬分享
作者: sd196821    时间: 2021-10-15 18:12
感谢楼主分享!
作者: xiao郭    时间: 2021-11-8 16:28
带壳标签的内部安装图可以发一下吗?壳太小了有点塞不进去,而且上层壳有6个安装孔,下层只有两个
作者: 蓝点无限    时间: 2021-11-9 08:03
xiao郭 发表于 2021-11-8 16:28
带壳标签的内部安装图可以发一下吗?壳太小了有点塞不进去,而且上层壳有6个安装孔,下层只有两个

由于需要拆开锂电池发货,所以模块都需要拆开。同时我们帮你焊接了下载接口4根线。

如果测试没有问题,需要安装外壳,首先要把四根下载线焊接下去。然后按照如下三个步骤组装

Step1 连接电源线
(, 下载次数: 1804)

Step2 将底板 和上盖通过螺丝固定(提前嵌入开关拨码)
(, 下载次数: 1818)

Step3 将结合的上半部分,和底部通过两个螺丝连接
(, 下载次数: 1813)


作者: xiao郭    时间: 2021-11-9 08:56
蓝点无限 发表于 2021-11-9 08:03
由于需要拆开锂电池发货,所以模块都需要拆开。同时我们帮你焊接了下载接口4根线。

如果测试没有问题 ...

嗯嗯,先下载代码测试,如果没问题,去掉四根焊接线,然后才能顺利组装。这样理解可以吗?
作者: 蓝点无限    时间: 2021-11-9 22:54
xiao郭 发表于 2021-11-9 08:56
嗯嗯,先下载代码测试,如果没问题,去掉四根焊接线,然后才能顺利组装。这样理解可以吗?

对的,模块它只有触点,目前发货的是给大家焊接好下载线的。
后期有配套转接板,有需要可以联系客服
作者: xiao郭    时间: 2021-11-14 22:32
本帖最后由 xiao郭 于 2021-11-14 22:34 编辑
蓝点无限 发表于 2021-11-9 22:54
对的,模块它只有触点,目前发货的是给大家焊接好下载线的。
后期有配套转接板,有需要可以联系客服

老师您好,在做普通UWB定位测试时,效果如图1所示,正常
在做融合运动传感器的基站测试时,效果如图2所示,(git上下载的代码,修改了RX_NODE等,如图3所示),可以在手册上补充关于运动传感器的测试过程吗?
作者: 蓝点无限    时间: 2021-11-15 23:02
xiao郭 发表于 2021-11-14 22:32
老师您好,在做普通UWB定位测试时,效果如图1所示,正常
在做融合运动传感器的基站测试时,效果如图2所 ...

你配置下程序里晶振频率吧
带外壳的和无壳晶振不一样,一个12Mhz,一个16Mhz

这个开源项目,是我们一个高阶共享版本,不属于淘宝基础内容,所以不会加到淘宝手册上的
作者: xiao郭    时间: 2021-11-16 09:50
本帖最后由 xiao郭 于 2021-11-16 09:54 编辑
蓝点无限 发表于 2021-11-15 23:02
你配置下程序里晶振频率吧
带外壳的和无壳晶振不一样,一个12Mhz,一个16Mhz

仍然是乱码,图一是我使用的基站,图二是修改的晶振
作者: 蓝点无限    时间: 2021-11-16 21:55
xiao郭 发表于 2021-11-16 09:50
仍然是乱码,图一是我使用的基站,图二是修改的晶振

能发下你使用固件的hash值吗? 我们这边和您做下同步

红色模块,正常16Mhz 不应该打印乱码的
作者: xiao郭    时间: 2021-11-18 09:05
蓝点无限 发表于 2021-11-16 21:55
能发下你使用固件的hash值吗? 我们这边和您做下同步

红色模块,正常16Mhz 不应该打印乱码的

我直接截图吧
作者: 蓝点无限    时间: 2021-11-18 21:52
xiao郭 发表于 2021-11-18 09:05
我直接截图吧

你可能没有理解我的意思。
我们的这个工程用git管理,有两个主要分支,master 分支是多基站多标签。 另外一个分支是数据融合。
把项目clone 下来用git bash 操作进行切换,如果没有基础,可以百度点git基本操作。程序员必备技能。

如果嫌命令行操作麻烦,可以下载sourcetree 这个工具,图形化界面操作。
选用具体那个分支代码,可以与这帖子一楼对齐
作者: xiao郭    时间: 2021-11-19 11:11
蓝点无限 发表于 2021-11-18 21:52
你可能没有理解我的意思。
我们的这个工程用git管理,有两个主要分支,master 分支是多基站多标签。 另 ...

您看一下,这个跟hash版本是对上的(图1)
作者: DW1000    时间: 2021-11-19 15:35
学习了,感谢分享!
作者: DW1000    时间: 2021-11-19 15:43
用9轴传感器,进行定位融合,真的是一个好的方案。可以弥补因为滤波异常定位数据,而导致的跳点现象。
作者: 蓝点无限    时间: 2021-11-20 21:24
xiao郭 发表于 2021-11-19 11:11
您看一下,这个跟hash版本是对上的(图1)

是的,双击可以切换到对应hash代码。 你找到我们这个帖子说的对应hash测试。
作者: xiao郭    时间: 2021-11-25 11:23
本帖最后由 xiao郭 于 2021-11-25 14:12 编辑
蓝点无限 发表于 2021-11-20 21:24
是的,双击可以切换到对应hash代码。 你找到我们这个帖子说的对应hash测试。

您好,更换版本后连接串口助手,输出的仍然是乱码(基站),下面是我的操作步骤,还请您检查一下

作者: 蓝点无限    时间: 2021-11-25 21:45
xiao郭 发表于 2021-11-25 11:23
您好,更换版本后连接串口助手,输出的仍然是乱码(基站),下面是我的操作步骤,还请您检查一下

(, 下载次数: 862)
这一步,需要改一下底板的晶振。修改为16*

12* 是黑色外壳小板的晶振。




作者: xiao郭    时间: 2021-11-26 14:33
本帖最后由 xiao郭 于 2021-11-26 14:37 编辑
蓝点无限 发表于 2021-11-25 21:45
这一步,需要改一下底板的晶振。修改为16*

12* 是黑色外壳小板的晶振。

您好,经过修改测试,目前4个基站中有3个正确显示了,第4个基站连乱码都没有,是否有可能是这个基站硬件本身存在问题;
此外,我先使用3个基站做第2个视频中的运动融合验证,三个基站通电,通过串口连接电脑(图1),上位机情况如图2所示。请问从基站通电到开启上位机,这中间是否还存在其他的基本操作?
作者: yjxwyyve    时间: 2021-11-26 17:17
PYQT代码DOWN后,直接可以打开运行,果真开源。要是有QT的UI文件就无敌了
(, 下载次数: 5965)
作者: 蓝点无限    时间: 2021-11-26 22:20
xiao郭 发表于 2021-11-26 14:33
您好,经过修改测试,目前4个基站中有3个正确显示了,第4个基站连乱码都没有,是否有可能是这个基站硬件 ...

关于问题1, 可以用我们百度云测试HEX测试,确认是否串口有显示
关于问题2, 首先可以先用串口助手看下是否有原始数据,如果有原始数据,再打开Python上位机
作者: xiao郭    时间: 2021-11-26 23:02
蓝点无限 发表于 2021-11-26 22:20
关于问题1, 可以用我们百度云测试HEX测试,确认是否串口有显示
关于问题2, 首先可以先用串口助手看下 ...

两个都没有显示数据
备注:第4个基站通过液晶屏显示正常,但串口调试助手是没法接收数据的

作者: 蓝点无限    时间: 2021-11-28 20:49
xiao郭 发表于 2021-11-26 23:02
两个都没有显示数据
备注:第4个基站通过液晶屏显示正常,但串口调试助手是没法接收数据的

(, 下载次数: 895)
重新增加了一个分支,你可以试试这个,里面还有个imu工程说明




作者: Aimmie    时间: 2021-12-5 00:28
蓝点无限 发表于 2021-11-28 20:49
重新增加了一个分支,你可以试试这个,里面还有个imu工程说明

这个分支下载了串口调试也是乱码,上位机没有显示数据D:\YANJIUSHENG\Indoor Positioning\1205.png
作者: Aimmie    时间: 2021-12-5 00:54
Aimmie 发表于 2021-12-5 00:28
这个分支下载了串口调试也是乱码,上位机没有显示数据

我调了晶振频率之后串口数据不乱码了。但是我有一个有液晶的基站,作为一号基站,但是液晶屏无显示,请问大家有这样的问题吗
#ifdef RX_NODE
#define SHORT_ADDR 0x0001
#define LCD_ENABLE
#endif
作者: 蓝点无限    时间: 2021-12-5 08:11
Aimmie 发表于 2021-12-5 00:54
我调了晶振频率之后串口数据不乱码了。但是我有一个有液晶的基站,作为一号基站,但是液晶屏无显示,请问 ...

感谢反馈,这个是一个软件bug,已经修复并提交到git,请拉去最新的代码测试。
  1. 提交: c278e3b4b21d118e31b76870d48a6292c727512f [c278e3b]
  2. 父级: 5ac5fde2a0
  3. 作者: tuzhuke <tuzhuke@gmail.com>
  4. 日期: 2021年12月5日 8:10:25
  5. 提交者: tuzhuke
  6. 解决RX 基站节点液晶无法显示问题。
  7. 原因:IMU 模块中断和LCD液晶同时使用PB15,解决方法,增加宏判断,TX节点时启用外部中断,否则按照之前方式用作液晶显示
复制代码




作者: xiao郭    时间: 2021-12-11 09:55
本帖最后由 xiao郭 于 2021-12-11 12:54 编辑

您好,图1、2是读取加速度的情况,跟正常数据相比相差过大(静止),请问是需要修改哪些参数或者配置吗?(第一种方法,直接在Send_Dis_Anthor0函数中添加 读取加速度的代码)

作者: 蓝点无限    时间: 2021-12-13 07:42
xiao郭 发表于 2021-12-11 09:55
您好,图1、2是读取加速度的情况,跟正常数据相比相差过大(静止),请问是需要修改哪些参数或者配置吗?( ...

静止的时候会有重力加速度
重力加速度会分到各个轴上,所有各个轴上可以看到加速度值。
不是模块静止放置,各个轴的加速度就是0
作者: 蓝点无限    时间: 2021-12-13 07:44
xiao郭 发表于 2021-12-11 10:21
您好,请问单独对标签进行加速度、角速度的测试需要焊接哪些点?(第二种方法,标签连接串口,直接读取加速 ...

串口输出是标签的TX引脚,你焊接方法是正确的。

原装效果是什么意思?你图中“原装效果”看起来输出是正常的
后面的串口助手图片数据异常
作者: xiao郭    时间: 2021-12-13 08:38
蓝点无限 发表于 2021-12-13 07:42
静止的时候会有重力加速度
重力加速度会分到各个轴上,所有各个轴上可以看到加速度值。
不是模块静止放 ...

您好,三个轴算出来的结果并没约等于重力加速度,正常的不应该是接近0.98吗?
作者: Aimmie    时间: 2021-12-13 15:08
请问python版本的上位机是否可以实现导出数据的功能呢?
之后想分析误差,需要导出实时串口数据和标签基站的坐标点
作者: xiao郭    时间: 2021-12-13 16:20
Aimmie 发表于 2021-12-13 15:08
请问python版本的上位机是否可以实现导出数据的功能呢?
之后想分析误差,需要导出实时串口数据和标签基站 ...

没有数据导出,需要自己写
作者: xiao郭    时间: 2021-12-13 16:48
您好,加速度计分辨率数字写错了
作者: 蓝点无限    时间: 2021-12-13 22:16
xiao郭 发表于 2021-12-13 08:38
您好,三个轴算出来的结果并没约等于重力加速度,正常的不应该是接近0.98吗?

三个方向属于矢量运算,最好将模块放平,其他两个值为0 的情况,看另外一个独立的值
作者: 蓝点无限    时间: 2021-12-13 22:16
xiao郭 发表于 2021-12-13 16:48
您好,加速度计分辨率数字写错了

感谢指正,你可以帮忙直接更新到git吗?
作者: xiao郭    时间: 2021-12-14 09:13
蓝点无限 发表于 2021-12-13 22:16
感谢指正,你可以帮忙直接更新到git吗?

抱歉,我还根据需要改了其他地方
作者: xiao郭    时间: 2021-12-14 11:06
蓝点无限 发表于 2021-12-13 22:16
三个方向属于矢量运算,最好将模块放平,其他两个值为0 的情况,看另外一个独立的值

找到问题了,将运动检测功能屏蔽即可读取正确数据
作者: 咕哒子    时间: 2021-12-28 11:59
运动传感器会漂移影响大吗
作者: sage    时间: 2022-2-9 14:39
感谢楼主大佬分享!!
作者: yoyo    时间: 2022-2-15 11:29
为什么不能下载附件哇
作者: yoyo    时间: 2022-2-15 11:30
这个rar附件怎么下载下来呢?下载报错
作者: wennnnie    时间: 2022-3-16 17:26
感谢感谢,解决了很大的问题
作者: sdfsf    时间: 2022-3-29 19:43
感谢分享!!!!!!
作者: carpe.tan    时间: 2022-4-21 09:17
9轴用来唤醒
作者: zzz0012    时间: 2022-7-4 18:17
谢谢分享!
作者: nzshuai    时间: 2022-7-10 22:56
对传感器来说,确实需要做到不同传感器的数据融合,找到各自优势,然后互补
作者: nzshuai    时间: 2022-7-10 22:57
感谢大佬无私分享
作者: 291171991    时间: 2022-10-6 17:06

谢谢楼主分享
作者: 763273250    时间: 2022-10-24 16:16
可以和视觉融合定位嘛
作者: fxb    时间: 2022-10-26 22:55
谢谢楼主分享
作者: tsy666    时间: 2023-3-11 13:57
666!!!!!!!
作者: z936931869    时间: 2023-4-6 09:16

感谢,感谢
作者: sunlei    时间: 2023-4-27 17:22
感谢分享,真难得啊
作者: njjbhv    时间: 2023-5-10 10:53

真大佬,感谢分享!
作者: tatu1988    时间: 2023-6-15 14:56

感谢分享!!!!!
作者: h4132003    时间: 2023-10-10 14:02
感谢分享!
作者: HUAXIAJI    时间: 2023-10-20 11:34
厉害!融合算法太需要了
作者: xgxg    时间: 2023-11-23 11:18
1111111111111
作者: thanaloid    时间: 2024-1-15 19:21
谢谢楼主分享
作者: txj168    时间: 2024-1-18 05:32
学习学习。。。。。。
作者: liuyue    时间: 2024-1-31 18:12
回帖子,攒积分
作者: llhvip2011    时间: 2024-2-22 17:09
学习学习……
作者: YikZ    时间: 2024-6-11 18:29
感谢分享!!!!!
作者: 逝去的金乌    时间: 2024-7-8 09:41
多谢分享!!!




欢迎光临 51uwb.cn (http://51uwb.cn/) Powered by Discuz! X3.3