在报告我的问题之前,我想给你一些背景信息,我在一所提供计算机科学专业课程的高中学习,为了让我获得这门课程的文凭,我必须完成课程总结工作.
我的课程完成工作包括创建一个大声雷达,旨在监测可能对城市特定区域(例如医院)有害的噪音产生。该检查将专门针对机动车辆产生的噪音。
为了开展这个项目,我与我的同事和顾问一起开发了一个 arduino 原型,它具有三个麦克风和一个摄像头。对于我的问题,只需要麦克风的信息。
基本上,我的程序必须根据麦克风提供的数据进行三角测量,以便我们能够识别违规车辆。这就是计算三个圆的交点的程序的用武之地。
每个圆圈的位置将由麦克风的位置给出,半径将由每个麦克风识别有害噪音所花费的时间差给出。收到这些数据后,通过简单的转换,将以秒为单位的值转换为米。
这个项目最大的问题是第一个识别噪音的麦克风会有0秒的时间差,因为这将是其他麦克风的参考。
为了解决这个问题,由rebrid开发并由Jacques Gaudin改进的函数(在python中如何获得三个或多个圆的交点有无错误)将在ans.success变量等于时在while循环中运行为 False,而循环会将每个圆周的半径增加 0.01m,以便在某个时候找到问题的有效解决方案。 话虽如此,我的代码看起来像这样:
import matplotlib.pyplot as plt
from scipy.optimize import least_squares
def intersectionPoint(p1,p2,p3):
x1, y1, dist_1 = (p1[0], p1[1], p1[2])
x2, y2, dist_2 = (p2[0], p2[1], p2[2])
x3, y3, dist_3 = (p3[0], p3[1], p3[2])
def eq(g):
x, y = g
return (
(x - x1)**2 + (y - y1)**2 - dist_1**2,
(x - x2)**2 + (y - y2)**2 - dist_2**2,
(x - x3)**2 + (y - y3)**2 - dist_3**2)
guess = (x1, y1 + dist_1)
ans = least_squares(eq, guess, ftol=None, xtol=None)
return ans
def pltC():
figure, ax = plt.subplots()
C1 = plt.Circle((ca[0], ca[1]), r1, fill = False)
C2 = plt.Circle((cb[0], cb[1]), r2, fill = False)
C3 = plt.Circle((cc[0], cc[1]), r3, fill = False)
Ci = plt.Circle((ans.x[0], ans.x[1]), 0.1)
ax.set_aspect(1)
ax.set_xlim([0, 10])
ax.set_ylim([0, 10])
ax.add_artist(C1)
ax.add_artist(C2)
ax.add_artist(C3)
ax.add_artist(Ci)
plt.title("Exemplo Intersecção de Circluos com o Calculo")
plt.show()
r1 = 2
r2 = 0
r3 = 4
ca = (0, 0)
cb = (0, 6)
cc = (8, 0)
ans = intersectionPoint((ca[0], ca[1], r1), (cb[0], cb[1], r2), (cc[0], cc[1], r3))
while ans.success == False:
r1 = round(r1 + 0.01, 2)
r2 = round(r2 + 0.01, 2)
r3 = round(r3 + 0.01, 2)
ca = (0, 0)
cb = (0, 6)
cc = (8, 0)
ans = intersectionPoint((ca[0], ca[1], r1), (cb[0], cb[1], r2), (cc[0], cc[1], r3))
pltC()
print(ans.success)
print(ans.x)
print(r1, r2, r3)
但是我遇到了问题,因为代码没有返回正确的值。可以在代码中看到第一个圆的半径 (r1) 的值为 2m,r2 的值为 0m,r3 的值为 4m。
当我们开始开发这段代码时,顾问和我进行了数学计算,并意识到根据这些信息的正确结果是位置 x = 3 和 y = 4 的点,其中 r1 = 5,r2 = 3 和 r3 = 7.
但由于某种原因,程序返回给我们一个坐标为 x = 2.50377477 和 y = 3.74999764 的点,其中 r1 = 4.45,r2 = 2.45 和 r3 = 6.45。在这个程序中我也使用了matplotlib库来显示一个图形,从这个图形的分析可以看出圆圈并不相交。
我试图通过改变猜测变量的参数来解决这个问题,但这似乎没有帮助