项目-移动机器人的定位与导航

基于顶配版阿克曼常规型摆式悬挂ROS小车

1、python编写串口通信,使用pyserial库,串口读取编码器和MPU6050 imu数据

数据读取的问题

read_all()

readline()

readlines() 

read(24)    最终使用此函数,stm32以20Hz频率发送数据,一帧数据为24字节。

使用read(24)函数可以避免在控制电机转动的时候,再加以转向控制时数据暂停接收的情况。

Python serial串口通信read(24)函数解决给予转向命令时数据返回暂停问题_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1ve4y1R7xu?spm_id_from=333.999.0.0&vd_source=a57e0057bc2f5f2f63b6b1d473bed0e2

数据转换的问题

msg变量数据:  <class 'bytes'>  数据类型

解决:

for key in msg:
    a = hex(key)

2、航迹推算通过python实现

数据计算的问题

提取到的16进制字符串(0x _ _)会出现长度不为4的情况,要做一个数据补齐,统一长度为4,否则后面数据计算及方向判断时,计算会出问题。易忽略。

if len(a) != 4:
    a = a[0:2] + "0" + a[2]
a_list.append(a)

通过上面读取的每一帧数据做航迹计算,未加数据优化,直接对原始数据进行计算,视频结果演示

航迹推算定位无人车实拍_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1pa411n7Po?spm_id_from=333.999.0.0航迹推算程序定位数据采集_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV16B4y1e7XJ?spm_id_from=333.999.0.0&vd_source=a57e0057bc2f5f2f63b6b1d473bed0e2一些数据: 

3、更换N100 IMU计算角速度

遇到的一些问题:

——读取的数据按手册中介绍的将 4 个字节合并起来组合为一个数(HEX),再转换为 IEEE 754 标 准的浮点数,结果在静止状态下读取的z轴角速度会出现跳大值。并且校验此帧数据,并无错误。

 

 

校验: 

 

 

——所以测验N100 IMU是否有问题,连接自带的上位机软件,画图并查看数据后发现惯导本身的数据并没有产生跳大值。也就是说,还是在数据转换中有纰漏。

 ——找到原因:数据顺序反了,模块输出是的小端存储,低位在前高位在后

 

 修改部分代码,16进制单精度浮点数转10进制:

        # x = a_list[15][2:] + a_list[16][2:] + a_list[17][2:] + a_list[18][2:]  # 错,提取4字节16进制字符串
        x = a_list[18][2:] + a_list[17][2:] + a_list[16][2:] + a_list[15][2:]  # 对,提取4字节16进制字符串
        y = int(x, 16)
        z = struct.unpack('<f', struct.pack('<I', y))  # 元组,取第0个元素为10进制整型
        return z[0]

修改后静止状态下不在跳大值。

 

 左转弯状态

——输出数据中有干扰数据 ,有效数据中参杂心跳包数据FCF0,用于上位机软件通信,要做剔除。

  msg = ser.read(64)
    if msg[0] == 252 and msg[1] == 240:  # 原始数据中有干扰数据,1Hz的心跳包数据FC(252)、F0(240)用于上位机通信,在这里做剔除
        msg = msg[25:] + ser.read(25)

 ——但是输出的数据包太大,里面有许多无用数据,所以更换输出内容 

 先前数据包为:

更换为:

 上位机设置,以20Hz输出:(MSG_IMU 64字节,MSG ANGULAR VEL  20字节  20Hz输出

 同样要剔除无用镇数据:

    msg = ser.read(20)
    if msg[0] == 252 and msg[1] == 240:  # 原始数据中有干扰数据,1Hz的心跳包数据FC(252)、F0(240)用于上位机通信,在这里做剔除
        msg = ser.read(25)[5:]

——N100_IMU数据和编码其数据联合后计算,采用线程的处理两个模块

    # t1 = threading.Thread(target=pipei.read_qrcode(), args=())     # 摄像头校正数据用,target是要执行的函数名(不是函数),args是函数对应的参数,以元组的形式存在
    t2 = threading.Thread(target=dr_calculate())
    t3 = threading.Thread(target=n100_imu.calculate_angular_velocity())
    # t1.start()
    t2.start()
    t3.start()

4、与摄像头联合计算,校准位姿值,摄像头模块与其他编码器或n100 imu联合起来时,总是出现延迟。

(放上二维码后或更换二维码后,一定时间后屏幕上才更新二维码获得的位姿数据,希望立即更新)

通过udp通信读取摄像头数据 

——使用调用其他模块函数方法实现联合,有延时

——尝试使用python多线程联合,仍然有延时

由于摄像头读取模块不是我写的代码,所以找了很久原因,只能一步一步缩小,一步一步排查问题大概位置,大概感觉时摄像头频率的问题,后网上搜索有没有类似的情况,果然碰到了,由于该网站的解决方案提示,成功解决延时问题,感谢!

附此网站连接:在Python中实时接收UDP数据包时的延迟 - VoidCChttp://cn.voidcc.com/question/p-zhkdazmb-bnh.html

作者加入该行代码:

self.s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1) 

防止网址失效,附上截图:

 

 

 *现在程序运行时,放上二维码后或更换二维码后,屏幕上立即更新二维码获得的位姿数据

至此,解决了编码器数据、更换n100 imu和摄像头位姿校正 三个模块联合计算延时的问题。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值