Celem zadania jest zapoznanie się z przetwarzaniem danych ze skanera laserowego, a następnie implementacja wybranej metody wykrywania linii i na jej podstawie lokalizacji robota.
subscriber_scan.py
.
Uwaga: Dla uproszczenia zadania można ograniczyć zakres analizowanych danych ze skanera przez zawężenie obserwowanego kąta i ograniczenie maksymalnej odległości.
Uwaga: oceny poprawności wyników dla danych odczytanych z robota można dokonać przez pomiar rzeczywistego położenia robota.
#!/usr/bin/env python
# run: python subscriber_scan.py 5 (where 5 is robot number)
import sys
import rospy
from sensor_msgs.msg import LaserScan
#import tf
def callback_scan(msg):
## extract ranges from message
scan=list(msg.ranges)
#print(" angle min %f max %f" % (msg.angle_min, msg.angle_max)
#print(" Scan min: %f front: %f" % ( min(scan),scan[256]))
print(scan)
def listener():
rospy.init_node('atr', anonymous=True)
# Subscribe topics and bind with callback functions
rospy.Subscriber("/PIONIER"+nr+"/scan", LaserScan, callback_scan)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
if __name__ == '__main__':
if len(sys.argv) < 2:
sys.stderr.write('Usage: sys.argv[0] \n')
sys.exit(1)
nr=sys.argv[1]
listener()
import json
##wczytanie danych z pliku
json_data = open('line_detection_1.json')
data = json.load(json_data)
### wykres danych ze skanera w ukladzie biegunowym
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0,512)
theta = (np.pi/512 )*(x-256) # kat w radianach
# Wczytanie skanu z pierwszego zestawu danych
skan=data[0]["scan"]
fig1 = plt.figure()
ax1 = fig1.add_axes([0.1,0.1,0.8,0.8],polar=True)
line, = ax1.plot(theta,skan,lw=2.5)
ax1.set_ylim(0,2) # zakres odleglosci
plt.show()
import numpy as np
import pylab as pl
from matplotlib import collections as mc
lines = [[(0, 1), (1, 1)], [(2, 3), (3, 3)], [(1, 2), (1, 3)]]
c = np.array([(1, 0, 0, 1), (0, 1, 0, 1), (0, 0, 1, 1)])
lc = mc.LineCollection(lines, colors=c, linewidths=2)
lines2 = [[(0.1, 1.1), (1.1, 1.1)], [(2.1, 3.1), (3.1, 3.1)], [(1.1, 2.1), (1.1, 3.1)]]
lc2 = mc.LineCollection(lines2, colors=[0,0,0],linewidths=1)
fig, ax = pl.subplots()
ax.add_collection(lc)
ax.add_collection(lc2)
ax.autoscale()
ax.margins(0.1)
pl.show()