James Hoi's Blog

Robomaster能量机关复现

Word count: 2.1kReading time: 8 min
2023/08/01 Share

装甲板复现

由于规则的修改,现在击打能量机关的装甲板改为圆形,对击打的环数进行判断,越准越高分,所以我们打算对其进行复现

每个环都是宽15mm,整体再外最外圈有多5mm,厚度14.3,弹丸直径17mm

定位射击子弹

当然关键的问题就是定位,要定位弹丸的击打位置,最先想的方案是通过应变片的形变大小定位,但安装上必定误差特别大,不好实现,因为面板前面还需要有一圈一圈的灯。

方案一

前面预想的应变片不好实现,转换一下思路,在淘宝找到了阵列式的柔性压力传感器,但若买商家现成产品大小会不符合,定制的话,开模设计打样费2万起,20个样品。其次还是上一个提到的问题,这个传感器不透光,放在PCB和灯条后面大几率击打效果不好

方案二

方案二为通过多个tof激光雷达测距定位弹丸,了解过GNSS定位的都应该听过三点定位方法,通过已知和多个卫星的距离解方程得到设备的位置。

tof激光雷达原理

主要可选的传感器为VL6180X,VL53L0X,VL53L1X,主要区别如下图

tof sensor portfolio

综上所述,量程需要在30cm以上,最后选择VL53L0X

VL53L0X

发射fov为35°,接收为25°,根据资料关于VL53L0X测距的一点分享-OpenEdv-开源电子网盲区大致为30至40mm

当传感器个数n=4时,可检测范围大致就是下图彩色范围(注:当时没画好,将就吧)

算法基本参考TDOA,参考文章

使用RANSAC的鲁棒TDOA Chan定位算法_姜小明同学的博客-CSDN博客_最小残差加权算法chan tdoa

TDOA算法综述(An overview of TDOA algorithm)–(1)_笨牛慢耕的博客-CSDN博客_tdoa算法

[最小二乘法] 多边定位–求解未知点坐标_geodoer的博客-CSDN博客_最小二乘法定位

基于K-means聚类和数据一致性的WSN多边定位算法-手机知网

TDOA定位方法的Fang算法的程序实现(二维)_qq_21291397的博客-CSDN博客_fang算法

Chan 定位算法_本帅哥屏蔽了凡人的博客-CSDN博客_chan定位算法,wls 和wl的区别

基本思路即最小二乘法,应用时编写矩阵运算函数即可

Matlab仿真

仿真的主要目的为:

  1. 进行误差分析,计算若安装误差在±1cm内,检测误差为多少?

  2. 计算最合理传感器个数

  3. 使用最小二乘法是否会出现不可逆矩阵?实际应用该如何解决

其中第二点可见上图,由于该传感器接收的fov为25°,当传感器数量n=4时甚至不能覆盖到某些地方的六环。

传感器个数和失误率的关系

按道理来讲可以进行数学推导计算出最佳的传感器个数,但过程可能稍微复杂,且工程实际应用时能接受一定的误差。最后采用统计的方式得到,下图是40000次测试的结果

失误率:无法计算出打击位置的几率

这图z轴是检测不到打击位置的几率(失误率),0到25是传感器个数,1到10是环数

Matlab代码如下,orientation返回的point是:

1
2
3
4
5
6
7
8
9
10
11
12
13
clear;
test_time = 40000;
c = zeros(25,10);
count = zeros(25,10);
for n=4:25
for i=1:test_time
[point,point1,point2,num] = orientation(n);
c(n,point) = c(n,point)+(num<3);
count(n,point) = count(n,point)+1;
end
end
c = c./count*100;
bar3(c);

orientation.m代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
function [point,num] = orientation(n)
r = 150; %装甲板半径,单位mm
err = 2; %传感器精度为2mm,盲区为30~40mm
err_install = 20; %安装误差2cm内
% 画圆
th = 0:pi/50:2*pi;
xunit = r.*cos(th);
yunit = r.*sin(th);
plot(xunit, yunit,"r");
axis equal
hold on

% 画传感器所在的位置
angles = (1/n:1/n:1)*2*pi;
xdata = r.*cos(angles);
ydata = r.*sin(angles);
plot(xdata,ydata,"b*");
hold on

% 生成随机一点
theta = rand*(2*pi);
r0 = rand*r;
x = r0.*cos(theta);
y = r0.*sin(theta);
plot(x,y,"bo");
hold on

% 计算测量到的距离
d = zeros(n,1);
d1 = zeros(n,1);
for i=1:n
err_x = -err_install + 2*err_install*rand(1); % +-安装误差
err_y = -err_install + 2*err_install*rand(1);
a = [xdata(i)+err_x ydata(i)+err_y];
b = [x y];
d(i) = fix(norm(a-b)+err*rand);
d1(i) = d(i)-d(1);
end

% 方法一泰勒展开取一次项,降维转线性,计算参数l和m
d0 = zeros(n,1);
l = zeros(n,1);
m = zeros(n,1);
for i=1:n
a = [xdata(i) ydata(i)];
d0(i) = r;
l(i) = xdata(i)/d0(i);
m(i) = ydata(i)/d0(i);
end
A = [l m];
L = d0-d;
X = (A'*A)\(A'*L);
plot(X(1),X(2),"g*");

% 方法二
% 计算到基站一的距离
x1 = zeros(n,1);
y1 = zeros(n,1);
c = zeros(n,1);
K = zeros(n,1);
for i=1:n
K(i) = xdata(i)^2+ydata(i)^2;
x1(i) = xdata(i)-xdata(1);
y1(i) = ydata(i)-ydata(1);
c(i) = (K(i)-K(1))-(d1(i)^2+2*d1(i)*d(1));
c(i) = c(i)/2;
end
A = [x1 y1];
A = A(2:end,:);
L = c(2:end);
X = (A'*A)\(A'*L);
plot(X(1),X(2),"r*");

% 检测fov25°传感器个数
c = zeros(1,n);
e = zeros(1,n);
for i=1:n
a = [xdata(i) ydata(i)];
b = [xdata(i)-x ydata(i)-y];
c(i) = acos(dot(a,b)/norm(a)/norm(b));
end
point = 10-floor(norm([x y])/15);
num = sum((c<(12.5/180*pi))&(d'>40)); % 加上盲区判断,最大盲区值为40mm
s = sprintf("识别到的传感器个数:%d,环数:%d",num,point);
disp(s);

如何仿真计算出传感器是否在fov范围内?

orientation.m的最后一段代码其实已经给出,已知目标位置和传感器位置,通过点乘除以向量模长就可以得到两点间夹角,再加上c<25/2的判断,结合盲区,得到该传感器是否能检测到物体。

1
2
3
4
5
6
7
8
9
10
11
12
% 检测fov25°传感器个数
c = zeros(1,n);
e = zeros(1,n);
for i=1:n
a = [xdata(i) ydata(i)];
b = [xdata(i)-x ydata(i)-y];
c(i) = acos(dot(a,b)/norm(a)/norm(b));
end
point = 10-floor(norm([x y])/15);
num = sum((c<(12.5/180*pi))&(d'>40)); % 加上盲区判断,最大盲区值为40mm
s = sprintf("识别到的传感器个数:%d,环数:%d",num,point);
disp(s);

定位

蓝色圆圈为目标实际位置

方法一(绿色星号)参考文章[最小二乘法] 多边定位–求解未知点坐标_最小二乘法求坐标_geodoer的博客-CSDN博客

方法二(红色星号)参考文章Chan 定位算法_chan uwb_本帅哥屏蔽了凡人的博客-CSDN博客

实际两种方法都是转换为线性方程组再用最小二乘法求坐标点

实际上仿真代码有问题,需确定能识别到再进行定位,但由于此方法最后废弃,代码不再改进。

最终效果

n=20,err_install = 0,可见当无安装误差时,环数越小方法一越不准

测试环数准确率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
clear;
test_time = 40000;
n = 20;
c = zeros(10,2);
count = zeros(10,1);
for i=1:test_time
[point,point1,point2,num] = orientation(n);
count(point) = count(point) + 1;
c(point,1) = c(point,1) + (point~=point1);
c(point,2) = c(point,2) + (point~=point2);
end
tmp = c./count.*100;
bar3(tmp);
_time.*100

当error_install = 0时,环数准确度的统计,1为方法一,2为方法2

当error_install = 10,即安装误差为正负1cm时,环数准确度如下

当error_install = 20时

问题一

由于传感器离柔光板很近,且发射的激光为圆锥形,有几率发射到柔光板上反射到传感器上,实际机械尺寸设计时得留一定的空间。

问题二

实际测试时该激光测距传感器采样率很低,弹丸速度很快,传感器完全无法检测到弹丸,该方案废弃。

红外屏

当前的方法是红外屏,但红外屏采样率也有限,基本检测到的击打都为反弹,若反弹速度太快则会检测不到。实际安装位置需要测试,淘宝有现成产品

或365元定制尺寸,正方形。有串口,可二次开发

电阻屏

貌似官方用的电阻屏,但是定制成本太高,数量还需要五个

CATALOG
  1. 1. 装甲板复现
  2. 2. 定位射击子弹
    1. 2.1. 方案一
    2. 2.2. 方案二
      1. 2.2.1. VL53L0X
      2. 2.2.2. Matlab仿真
      3. 2.2.3. 传感器个数和失误率的关系
      4. 2.2.4. 如何仿真计算出传感器是否在fov范围内?
      5. 2.2.5. 定位
      6. 2.2.6. 最终效果
      7. 2.2.7. 问题一
      8. 2.2.8. 问题二
    3. 2.3. 红外屏
    4. 2.4. 电阻屏