4from visp.core
import ColVector, Point, Color, PixelMeterConversion, Display
5from visp.core
import CameraParameters, HomogeneousMatrix , ExponentialMap, PoseVector
7from visp.core
import ImageRGBa
8from visp.robot
import ImageSimulator
9from visp.visual_features
import BasicFeature, FeaturePoint
10from visp.vs
import Servo
15 from ultralytics
import YOLO
17 print(
'This example requires yoloV8: pip install ultralytics')
22import matplotlib.pyplot
as plt
23from matplotlib
import animation
26plt.rcParams[
'text.usetex'] =
True
29 scene_image = np.asarray(Image.open(scene_path).convert(
'RGBA'))
30 scene_image = ImageRGBa(scene_image)
31 simulator = ImageSimulator()
34 [-l, -L, 0.0], [l, -L, 0.0],
35 [l, L, 0.0], [-l, L, 0.0],
37 simulator.init(scene_image, list(map(
lambda X: Point(X), scene_3d)))
38 simulator.setCleanPreviousImage(
True, color=Color.black)
39 simulator.setInterpolationType(ImageSimulator.InterpolationType.BILINEAR_INTERPOLATION)
49 def on_iter(self, Idisp: ImageRGBa, v: ColVector, error: ColVector, cTw: HomogeneousMatrix) ->
None:
50 self.
I.append(Idisp.numpy().copy())
51 self.
v.append(v.numpy()[3:5].flatten())
52 self.
error.append(error.numpy().flatten())
53 self.
r.append(PoseVector(cTw).numpy()[3:5].flatten())
57 self.
v = np.asarray(self.
v)[1:]
58 self.
r = np.asarray(self.
r)[1:]
61 fig, axs = plt.subplots(2, 2, figsize=(15, 15 * (self.
I[0].shape[0] / self.
I[0].shape[1])))
62 axs = [axs[0][0], axs[0][1], axs[1][0],axs[1][1]]
63 titles = [
'I',
'Feature error',
'Velocity',
'Pose']
67 [
r"$\mathbf{\upsilon}_x$",
r"$\mathbf{\upsilon}_y$"],
68 [
r"$\theta\mathbf{u}_x$",
r"$\theta\mathbf{u}_y$"],
70 data = [
None, self.
error, self.
v, self.
r]
72 for i
in range(len(axs)):
73 axs[i].set_title(titles[i])
74 if data[i]
is not None:
75 axs[i].set_xlabel(
'Iteration')
77 axs[i].set_xlim(0, len(self.
v))
78 min_val, max_val = np.min(data[i]), np.max(data[i])
79 margin = (max_val - min_val) * 0.05
80 axs[i].set_ylim(min_val - margin, max_val + margin)
81 artists.append(axs[i].plot(data[i]))
82 axs[i].legend(legends[i])
84 artists.append(axs[i].imshow(self.
I[0]))
89 artists[0].set_data(self.
I[i])
91 artists[1][j].set_data(xs, self.
error[:i, j])
92 artists[2][j].set_data(xs, self.
v[:i, j])
93 artists[3][j].set_data(xs, self.
r[:i, j])
96 anim = animation.FuncAnimation(fig, animate, frames=len(self.
v), blit=
False, repeat=
False)
97 writervideo = animation.FFMpegWriter(fps=20)
98 anim.save(
'exp.mp4', writer=writervideo)
99 plt.savefig(
'exp.pdf')
102if __name__ ==
'__main__':
103 parser = argparse.ArgumentParser(
'Centering task using a YOLO network')
104 parser.add_argument(
'--scene', type=str, help=
'Path to the scene')
105 parser.add_argument(
'--class-id', type=int, help=
'COCO class id of the object to track (e.g, 2 for a car)')
106 args = parser.parse_args()
108 detection_model = YOLO(
'yolov8n.pt')
112 cam = CameraParameters(px=600, py=600, u0=w / 2.0, v0=h / 2.0)
119 cTw = HomogeneousMatrix(-0.1, 0.1, Z, 0.0, 0.0, 0.0)
121 Idisp = ImageRGBa(h, w)
122 simulator.setCameraPosition(cTw)
123 simulator.getImage(I, cam)
126 xd, yd = PixelMeterConversion.convertPoint(cam, w / 2.0, h / 2.0)
128 sd.buildFrom(xd, yd, Z)
131 s.buildFrom(0.0, 0.0, Z)
134 task.addFeature(s, sd)
136 task.setCameraDoF(ColVector([0, 0, 0, 1, 1, 0]))
137 task.setServo(Servo.ServoType.EYEINHAND_CAMERA)
138 task.setInteractionMatrixType(Servo.ServoIteractionMatrixType.CURRENT)
139 target_class = args.class_id
142 prev_v = ColVector(6, 0.0)
143 v = ColVector(6, 0.0)
152 while error_norm > 5e-7:
153 print(
'Error norm is', error_norm)
154 print(
'AAAAAAAAAAAAAA')
157 simulator.getImage(I, cam)
159 return box.cls
is not None and len(box.cls) > 0
and box.cls[0]
163 boxes = results.boxes
167 for i
in range(len(boxes.conf)):
168 if boxes.cls[i] == target_class
and boxes.conf[i] > max_conf:
171 max_conf = boxes.conf[i]
172 bb = boxes.xywh[i].cpu().numpy()
179 x, y = PixelMeterConversion.convertPoint(cam, u, v)
181 v = task.computeControlLaw()
184 task.computeControlLaw()
186 error: ColVector = task.getError()
187 error_norm = error.sumSquare()
191 sd.display(cam, I, Color.darkBlue, thickness=2)
192 s.display(cam, I, Color.darkRed, thickness=2)
194 Display.getImage(I, Idisp)
197 plotter.on_iter(Idisp, v, error, cTw)
200 cTcn = ExponentialMap.direct(v, time.time() - start)
201 cTw = cTcn.inverse() * cTw
202 simulator.setCameraPosition(cTw)
204 plotter.generate_anim()
None on_iter(self, ImageRGBa Idisp, ColVector v, ColVector error, HomogeneousMatrix cTw)
ImageSimulator get_simulator(str scene_path)