직교 좌표에서 RANSAC를 사용하여 선을 맞추는 방법은 무엇입니까?

작업

2D Lidar를 사용하고 있으며 데이터를 Lidar Position에 대한 각도와 거리로 가져옵니다. Lidar를 사용하여 평면도를 작성해야하며 데이터는 다음과 같이 주어집니다. RANSAC 알고리즘을 사용하여 방의 벽을 찾고 싶습니다. RANSAC에 맞으면 어떻게 든 플로어 플랜을 찾을 수 있다고 믿습니다. 코드를 작성했지만 벽에 맞지 않습니다. 내 방 벽에 맞도록 어떤 수정을해야합니까?

#(angle, distance)
0,942
0.62,3469
1.25,3350
2.5,3410
3.12,3404
3.75,3403
4.37,3464
5,3441
5.62,3445
6.25,3444
6.87,3455
7.5,3464
8.12,3464
8.75,3477
9.37,3470
10,3504
10.62,3505
11.25,3505
11.87,3516
12.5,3529
13.12,3541
13.75,3543
14.37,3552
15,3559
15.62,3565
16.25,3578
16.87,3591
17.5,3607
18.12,3624
18.75,3634
19.37,3630
20,3651
20.62,3673
21.25,3678
21.87,3697
22.5,3711
23.12,3726
23.75,3744
24.37,3765
25,3780
25.62,3796
26.25,3809
26.87,3830
27.5,3867
28.12,3881
28.75,3854
29.37,3751
30,3689
30.62,3637
31.25,3589
31.87,4029
37.5,3483
50,2734
53.75,1686
54.37,1656
55,1631
55.62,1621
56.25,1608
56.87,1600
57.5,1595
58.12,1598
58.75,1596
59.37,1604
60,1611
60.62,1622
61.25,1644
61.87,1673
65,2212
65.62,2221
66.25,1037
66.87,1299
67.5,2086
67.5,130
83.12,2002
83.75,1995
84.37,1993
85.62,2061
86.25,2043
86.87,2046
87.5,2040
89.37,2082
90,2713
90.62,2245
91.25,2046
93.75,2092
102.5,327
109.37,1349
110,4279
110.62,2177
111.25,2175
111.87,2136
113.12,2151
113.75,2170
114.37,2186
123.12,2066
123.75,2080
124.37,2087
125,2110
125.62,1778
126.25,1732
126.87,428
127.5,1650
128.12,1093
128.75,2206
129.37,2219
130,2243
130.62,2276
131.25,2317
131.87,2319
132.5,2305
133.12,2276
133.75,2253
135,2224
135.62,2202
136.25,2181
136.87,2156
137.5,2131
138.12,2108
138.75,2081
139.37,2068
140,2046
140.62,2028
141.25,1982
141.87,2001
142.5,1985
143.12,2030
152.5,1727
153.12,1728
153.75,1722
154.37,1711
155,1700
155.62,1691
156.25,1683
156.87,1672
157.5,1666
158.12,1655
158.75,1645
159.37,1637
160,1633
160.62,1622
161.25,1621
161.87,1611
162.5,1602
163.12,1597
163.75,1592
164.37,1583
165,1579
165.62,1578
166.25,1571
166.87,1564
167.5,1558
168.12,1552
168.75,1551
169.37,1550
170,1545
170.62,1543
171.25,1540
171.87,1537
172.5,1529
173.12,1527
173.75,1527
174.37,1524
175,1522
175.62,1518
176.25,1519
176.87,1517
177.5,1513
178.12,1510
178.75,1514
180,1514
180.62,1511
181.25,1519
181.87,1513
182.5,1514
183.12,1513
183.75,1513
184.37,1514
185,1518
185.62,1517
186.25,1519
186.87,1517
187.5,1526
188.12,1522
188.75,1526
189.37,1527
190,1530
190.62,1536
191.25,1536
191.87,1541
192.5,1544
193.12,1549
193.75,1553
194.37,1555
195,1553
195.62,1563
196.25,1569
196.87,1570
197.5,1581
198.12,1583
198.75,1591
199.37,1597
200,1601
200.62,1606
202.5,1615
203.12,1626
203.75,1625
204.37,1644
205,1646
205.62,1658
206.25,1663
206.87,1674
207.5,1685
208.12,1703
208.75,1703
209.37,1717
210,1732
210.62,1743
211.25,1750
211.87,1766
212.5,1776
213.12,1791
213.75,1808
214.37,1814
215,1835
215.62,1844
216.25,1854
216.87,1870
217.5,1892
218.12,1909
218.75,1918
219.37,1934
220,1952
220.62,1972
221.87,2023
222.5,2039
223.12,2059
223.75,2082
225,2101
225.62,2122
226.25,2148
226.87,2173
227.5,2190
228.12,2214
228.75,2241
229.37,2275
230,2295
230.62,2324
231.25,2348
231.87,2160
232.5,2416
233.12,2445
233.75,2479
234.37,2520
235.62,2607
236.25,2649
236.87,2156
237.5,2726
238.12,2768
238.75,2806
239.37,2865
240,2912
240.62,2962
241.25,3026
241.87,3078
242.5,3147
243.12,3210
243.75,3276
244.37,3315
245,3307
245.62,3288
246.25,3267
246.87,3253
247.5,3153
248.75,4678
249.37,4563
250,4560
250.62,4504
251.25,4523
251.87,4478
252.5,4452
253.12,4465
253.75,4434
254.37,4421
255,4391
255.62,4371
256.25,4361
256.87,4356
257.5,4348
258.12,4326
258.75,4326
259.37,4331
260,4341
260.62,4270
261.25,4263
261.87,4281
262.5,2992
263.12,2984
263.75,2976
264.37,2983
265,2971
265.62,2963
266.25,2963
266.87,2967
267.5,2968
268.12,2951
268.75,2951
270,2959
270.62,2953
271.25,2500
271.87,5514
272.5,2839
273.12,2706
273.75,2721
274.37,2693
288.12,3010
288.75,2999
289.37,2998
290,3020
290.62,3036
291.25,3083
291.87,3169
292.5,3170
293.12,3196
293.75,3212
294.37,3230
295,3234
295.62,3262
296.25,3273
296.87,3298
297.5,3318
298.12,3333
298.75,3356
299.37,3374
300,3394
300.62,3417
301.25,3427
301.87,3453
302.5,3474
303.12,3490
303.75,3516
304.37,3552
305,3571
305.62,3581
307.5,5224
308.12,5271
308.75,5316
309.37,5411
310,3843
310.62,3892
311.25,3907
311.87,3922
312.5,3985
313.12,4016
313.75,4058
315,4081
315.62,4143
316.25,4190
316.87,4230
317.5,4291
318.12,4353
318.75,4406
319.37,4460
320,4512
320.62,4563
321.25,4507
321.87,4473
322.5,4426
323.12,4398
323.75,4371
324.37,4321
325,4274
325.62,4256
326.25,4215
326.87,4194
327.5,4148
328.12,4104
328.75,4077
329.37,4051
330,4024
330.62,3995
331.25,3971
331.87,3932
332.5,3909
333.12,3898
333.75,3884
334.37,3858
335,3840
335.62,3818
336.25,3791
337.5,3765
338.12,3747
338.75,3720
339.37,3715
340,3689
340.62,3687
341.25,3635
341.87,3632
342.5,3624
343.12,3613
343.75,3613
344.37,3594
345,3595
345.62,3560
346.25,3570
346.87,3543
347.5,3555
348.12,3527
348.75,3512
349.37,3512
350,3521
350.62,3486
351.25,3496
351.87,3477
352.5,3487
353.12,3461
353.75,3460
354.37,3458
355,3453
355.62,3460
356.25,3448
357.5,998
358.12,3442

이 데이터를 데카르트로 변환하고 Matplotlib를 사용하여 플로팅했습니다.

여기에 이미지 설명 입력

RANSAC을 수행 한 후 사진에서 벽을 제대로 감지하지 못하는 파란색 선이 표시됩니다. 4 개의 벽을 찾아야합니다. 내 코드에서 어떤 수정을해야하는지 모르겠습니다. 다음은 코드입니다.

import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
from sklearn import linear_model, datasets
import math

# scan data is stored in a txt file and getting data from that text file

df = pd.read_csv('scanData.txt',delimiter=',')
angle = df.values[:,0]
distance = df.values[:,1]
cartesian = [(r*math.cos(phi*math.pi/180), r*math.sin(phi*math.pi/180)) for r, phi in zip(distance, angle)]
x, y = map(list, zip(*cartesian))
#print(x)


# coverting this into 2d array
x=  np.array(x)
y=  np.array(y)

x=x.reshape(-1, 1)
y=y.reshape(-1, 1)

lr = linear_model.LinearRegression()
lr.fit(x, y)
ransac = linear_model.RANSACRegressor(max_trials=1000,min_samples=300)
ransac.fit(x, y)

# Predict data of estimated models
line_X = np.arange(x.min(), x.max())[:, np.newaxis]
print(line_X)
line_y = lr.predict(line_X)
line_y_ransac = ransac.predict(line_X)
print(line_y_ransac)
plt.scatter(x,y, color='yellowgreen', marker='.',
            label='Inliers')
plt.plot(line_X, line_y_ransac, color='cornflowerblue', linewidth=1,
         label='RANSAC regressor')
plt.legend(loc='lower right')
plt.xlabel("Input")
plt.ylabel("Response")
plt.show()

바닥면과 표면적을 달성하도록 제안 해 주시면 기쁩니다. 질문이 있으시면 댓글 섹션에 남겨주세요.

작업

에 대한 해결책을 찾을 수 sklearn없었지만 고맙게도 다른 라이브러리가 있습니다 sci-image. 그리고 Ski-image선을 제대로 감지합니다. 내가 찾고 있던 해결책은 다음과 같습니다.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from skimage.measure import ransac, LineModelND, CircleModel
import math  


df = pd.read_csv('scanData.txt',delimiter=',')
angle = df.values[:,0]
distance = df.values[:,1]

x= angle
y= distance

cartesian = [(r*math.cos(phi*math.pi/180), r*math.sin(phi*math.pi/180)) for r, 
             phi in zip(distance, angle)]

x, y = map(list, zip(*cartesian))

# coverting this into 2d array
x=  np.array(x)
y=  np.array(y)

x=x.reshape(-1, 1)
y=y.reshape(-1, 1)

data = np.column_stack([x, y])

model = LineModelND()
model.estimate(data)
# robustly fit line only using inlier data with RANSAC algorithm
model_robust, inliers = ransac(data, LineModelND, min_samples=2,
                               residual_threshold=10, max_trials=1000)
outliers = inliers == False

# generate coordinates of estimated models
line_x = np.arange(x.min(),x.max())  #[:, np.newaxis]
line_y = model.predict_y(line_x)
line_y_robust = model_robust.predict_y(line_x)

fig, ax = plt.subplots()
ax.plot(data[outliers, 0], data[outliers, 1], '.r', alpha=0.6,
        label='Outlier data')
ax.plot(data[inliers, 0], data[inliers, 1], '.b', alpha=0.6,
        label='Inlier data')
print("data: ", data)
print(data[inliers, 0], data[inliers, 1])
#ax.plot(line_x, line_y, '-k', label='Line model from all data')
#ax.plot(line_x, line_y_robust, '-b', label='Robust line model')
#ax.legend(loc='lower left')
plt.show()

그리고 내가 얻는 결과 이미지는 다음과 같습니다.

여기에 이미지 설명 입력

이 답변을 수정하거나 편집 할 수 있습니다. 다른 답변을 받고 싶습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Java를 사용하여 Selenium WebDriver에서 마우스를 움직일 때 요소에 초점을 맞추는 방법은 무엇입니까?

분류에서Dev

주어진 위도에 대해 파이썬에서 적도 좌표를 사용하여 천구의 직교 투영을 그리는 방법은 무엇입니까?

분류에서Dev

Graphics2D에서 변환을 적용한 후 선 좌표를 얻는 방법은 무엇입니까?

분류에서Dev

파이썬을 사용하여 그리드의 선에서 위쪽 및 아래쪽 부분의 좌표를 얻는 방법은 무엇입니까?

분류에서Dev

ggplot2와 같은 것을 사용하여 R의 특정 X 좌표에서 수평 직사각형을 만드는 방법은 무엇입니까?

분류에서Dev

수직선을 카드 뷰에 맞추는 방법은 무엇입니까?

분류에서Dev

Python을 사용하여 좌표를 추출하고 병합하는 방법은 무엇입니까?

분류에서Dev

HighStocks 또는 HighCharts를 사용하여 그래프에 수직선을 추가하는 방법은 무엇입니까?

분류에서Dev

사용자 입력을 사용하여 bash에서 변수를 선택하는 방법은 무엇입니까?

분류에서Dev

Yii에서 CDBCRITERIA를 사용하여 문자열을 비교하는 방법은 무엇입니까?

분류에서Dev

여러 테이블을 사용하여 좌표에서 계산 된 거리를 쿼리하는 방법은 무엇입니까?

분류에서Dev

R에서 고르지 않은 간격의 좌표를 사용하여 고해상도 온도 맵을 생성하는 방법은 무엇입니까?

분류에서Dev

numpy.linalg.solve 주어진 포인트 좌표를 사용하여 두 선이 교차하는 위치를 찾는 방법은 무엇입니까?

분류에서Dev

렌더링 함수에서 HTML을 사용할 때 정렬하기 위해 DataTables에서 직교 데이터를 사용하는 방법은 무엇입니까?

분류에서Dev

렌더링 함수에서 HTML을 사용할 때 정렬하기 위해 DataTables에서 직교 데이터를 사용하는 방법은 무엇입니까?

분류에서Dev

Bootstrap을 사용하여 직사각형을 중앙에 맞추고 반응하는 방법은 무엇입니까?

분류에서Dev

직사각형 모양을 표 셀 테두리에 맞추는 방법은 무엇입니까?

분류에서Dev

Highcharts를 사용하여 차트에 마우스 커서가있을 때 수직선을 렌더링하는 방법은 무엇입니까?

분류에서Dev

Shiny : Plotly를 사용하여 상자 플롯에 중앙선을 추가하는 방법은 무엇입니까?

분류에서Dev

react 및 typescript를 사용하여 event.feature.getGeometry에서 좌표를 읽는 방법은 무엇입니까?

분류에서Dev

kotlin을 사용하여 콘솔에서 x, y 좌표로 문자를 인쇄하는 방법은 무엇입니까?

분류에서Dev

Pandas에서 정규 표현식을 사용하여 날짜를 추출하는 방법은 무엇입니까?

분류에서Dev

LAN / 이더넷을 사용하여 NAS를 PC에 직접 연결하는 방법은 무엇입니까?

분류에서Dev

querySelector를 사용하여 다음 직계 자식을 선택하는 방법은 무엇입니까?

분류에서Dev

R을 사용하여 data.frame에서 고유 요소의 좌표를 찾는 방법은 무엇입니까?

분류에서Dev

Arduino에서 ESP8266과 함께 AT 명령을 사용하여 직렬 모니터에 IP를 표시하는 방법은 무엇입니까?

분류에서Dev

matplotlib를 사용하여 점선으로 교대 색상을 얻는 방법은 무엇입니까?

분류에서Dev

R에서 좌표 계산을 위해 for 루프를 벡터화하는 방법은 무엇입니까?

분류에서Dev

Bootstrap을 사용하여 div에 텍스트 입력을 맞추는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Java를 사용하여 Selenium WebDriver에서 마우스를 움직일 때 요소에 초점을 맞추는 방법은 무엇입니까?

  2. 2

    주어진 위도에 대해 파이썬에서 적도 좌표를 사용하여 천구의 직교 투영을 그리는 방법은 무엇입니까?

  3. 3

    Graphics2D에서 변환을 적용한 후 선 좌표를 얻는 방법은 무엇입니까?

  4. 4

    파이썬을 사용하여 그리드의 선에서 위쪽 및 아래쪽 부분의 좌표를 얻는 방법은 무엇입니까?

  5. 5

    ggplot2와 같은 것을 사용하여 R의 특정 X 좌표에서 수평 직사각형을 만드는 방법은 무엇입니까?

  6. 6

    수직선을 카드 뷰에 맞추는 방법은 무엇입니까?

  7. 7

    Python을 사용하여 좌표를 추출하고 병합하는 방법은 무엇입니까?

  8. 8

    HighStocks 또는 HighCharts를 사용하여 그래프에 수직선을 추가하는 방법은 무엇입니까?

  9. 9

    사용자 입력을 사용하여 bash에서 변수를 선택하는 방법은 무엇입니까?

  10. 10

    Yii에서 CDBCRITERIA를 사용하여 문자열을 비교하는 방법은 무엇입니까?

  11. 11

    여러 테이블을 사용하여 좌표에서 계산 된 거리를 쿼리하는 방법은 무엇입니까?

  12. 12

    R에서 고르지 않은 간격의 좌표를 사용하여 고해상도 온도 맵을 생성하는 방법은 무엇입니까?

  13. 13

    numpy.linalg.solve 주어진 포인트 좌표를 사용하여 두 선이 교차하는 위치를 찾는 방법은 무엇입니까?

  14. 14

    렌더링 함수에서 HTML을 사용할 때 정렬하기 위해 DataTables에서 직교 데이터를 사용하는 방법은 무엇입니까?

  15. 15

    렌더링 함수에서 HTML을 사용할 때 정렬하기 위해 DataTables에서 직교 데이터를 사용하는 방법은 무엇입니까?

  16. 16

    Bootstrap을 사용하여 직사각형을 중앙에 맞추고 반응하는 방법은 무엇입니까?

  17. 17

    직사각형 모양을 표 셀 테두리에 맞추는 방법은 무엇입니까?

  18. 18

    Highcharts를 사용하여 차트에 마우스 커서가있을 때 수직선을 렌더링하는 방법은 무엇입니까?

  19. 19

    Shiny : Plotly를 사용하여 상자 플롯에 중앙선을 추가하는 방법은 무엇입니까?

  20. 20

    react 및 typescript를 사용하여 event.feature.getGeometry에서 좌표를 읽는 방법은 무엇입니까?

  21. 21

    kotlin을 사용하여 콘솔에서 x, y 좌표로 문자를 인쇄하는 방법은 무엇입니까?

  22. 22

    Pandas에서 정규 표현식을 사용하여 날짜를 추출하는 방법은 무엇입니까?

  23. 23

    LAN / 이더넷을 사용하여 NAS를 PC에 직접 연결하는 방법은 무엇입니까?

  24. 24

    querySelector를 사용하여 다음 직계 자식을 선택하는 방법은 무엇입니까?

  25. 25

    R을 사용하여 data.frame에서 고유 요소의 좌표를 찾는 방법은 무엇입니까?

  26. 26

    Arduino에서 ESP8266과 함께 AT 명령을 사용하여 직렬 모니터에 IP를 표시하는 방법은 무엇입니까?

  27. 27

    matplotlib를 사용하여 점선으로 교대 색상을 얻는 방법은 무엇입니까?

  28. 28

    R에서 좌표 계산을 위해 for 루프를 벡터화하는 방법은 무엇입니까?

  29. 29

    Bootstrap을 사용하여 div에 텍스트 입력을 맞추는 방법은 무엇입니까?

뜨겁다태그

보관