基于顶配版阿克曼常规型摆式悬挂ROS小车
1、python编写串口通信,使用pyserial库,串口读取编码器和MPU6050 imu数据
数据读取的问题
read_all()
readline()
readlines()
read(24) 最终使用此函数,stm32以20Hz频率发送数据,一帧数据为24字节。
使用read(24)函数可以避免在控制电机转动的时候,再加以转向控制时数据暂停接收的情况。
数据转换的问题
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航迹推算程序定位数据采集_哔哩哔哩_bilibili
https://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和摄像头位姿校正 三个模块联合计算延时的问题。