Visual Servoing Platform
version 3.7.0
Toggle main menu visibility
Loading...
Searching...
No Matches
vpRobotWireFrameSimulator.cpp
1
/*
2
* ViSP, open source Visual Servoing Platform software.
3
* Copyright (C) 2005 - 2025 by Inria. All rights reserved.
4
*
5
* This software is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
9
* See the file LICENSE.txt at the root directory of this source
10
* distribution for additional information about the GNU GPL.
11
*
12
* For using ViSP with software that can not be combined with the GNU
13
* GPL, please contact Inria about acquiring a ViSP Professional
14
* Edition License.
15
*
16
* See https://visp.inria.fr for more information.
17
*
18
* This software was developed at:
19
* Inria Rennes - Bretagne Atlantique
20
* Campus Universitaire de Beaulieu
21
* 35042 Rennes Cedex
22
* France
23
*
24
* If you have questions regarding the use of this file, please contact
25
* Inria at visp@inria.fr
26
*
27
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29
*
30
* Description:
31
* Basic class used to make robot simulators.
32
*/
33
34
#include <visp3/core/vpConfig.h>
35
36
#if defined(VISP_HAVE_MODULE_GUI) && defined(VISP_HAVE_THREADS)
37
#include <visp3/robot/vpRobotWireFrameSimulator.h>
38
#include <visp3/robot/vpSimulatorViper850.h>
39
40
#include "../wireframe-simulator/vpBound.h"
41
#include "../wireframe-simulator/vpScene.h"
42
#include "../wireframe-simulator/vpVwstack.h"
43
44
BEGIN_VISP_NAMESPACE
48
vpRobotWireFrameSimulator::vpRobotWireFrameSimulator
()
49
:
vpWireFrameSimulator
(),
vpRobotSimulator
(),
I
(),
tcur
(0),
tprev
(0),
robotArms
(nullptr),
size_fMi
(8),
fMi
(nullptr),
50
artCoord
(),
artVel
(),
velocity
(),
m_thread
(),
m_mutex_fMi
(),
m_mutex_eMc
(),
m_mutex_artVel
(),
m_mutex_artCoord
(),
51
m_mutex_velocity
(),
m_mutex_display
(),
m_mutex_robotStop
(),
m_mutex_frame
(),
m_mutex_setVelocityCalled
(),
52
m_mutex_scene
(),
displayBusy
(false),
robotStop
(false),
jointLimit
(false),
jointLimitArt
(false),
53
singularityManagement
(true),
cameraParam
(),
54
#if defined(VISP_HAVE_DISPLAY)
55
display
(),
56
#endif
57
displayType
(
MODEL_3D
),
displayAllowed
(true),
constantSamplingTimeMode
(false),
setVelocityCalled
(false)
58
{
59
setSamplingTime
(0.010);
60
velocity
.resize(6);
61
I
.resize(480, 640);
62
I
=
vpRGBa
(255);
63
#if defined(VISP_HAVE_DISPLAY)
64
display
.init(
I
, 0, 0,
"The External view"
);
65
#endif
66
}
67
72
vpRobotWireFrameSimulator::vpRobotWireFrameSimulator
(
bool
do_display)
73
:
vpWireFrameSimulator
(),
vpRobotSimulator
(),
I
(),
tcur
(0),
tprev
(0),
robotArms
(nullptr),
size_fMi
(8),
fMi
(nullptr),
74
artCoord
(),
artVel
(),
velocity
(),
m_thread
(),
m_mutex_fMi
(),
m_mutex_eMc
(),
m_mutex_artVel
(),
m_mutex_artCoord
(),
75
m_mutex_velocity
(),
m_mutex_display
(),
m_mutex_robotStop
(),
m_mutex_frame
(),
m_mutex_setVelocityCalled
(),
m_mutex_scene
(),
76
displayBusy
(false),
robotStop
(false),
jointLimit
(false),
jointLimitArt
(false),
singularityManagement
(true),
77
cameraParam
(),
78
#if defined(VISP_HAVE_DISPLAY)
79
display
(),
80
#endif
81
displayType
(
MODEL_3D
),
displayAllowed
(do_display),
constantSamplingTimeMode
(false),
setVelocityCalled
(false)
82
{
83
setSamplingTime
(0.010);
84
velocity
.resize(6);
85
I
.resize(480, 640);
86
I
=
vpRGBa
(255);
87
88
#if defined(VISP_HAVE_DISPLAY)
89
if
(do_display)
90
this->
display
.init(
I
, 0, 0,
"The External view"
);
91
#endif
92
}
93
108
void
vpRobotWireFrameSimulator::initScene
(
const
vpSceneObject
&obj,
const
vpSceneDesiredObject
&desired_object)
109
{
110
m_mutex_scene
.lock();
111
if
(
displayCamera
) {
112
free_Bound_scene(&(this->
camera
));
113
}
114
vpWireFrameSimulator::initScene
(obj, desired_object);
115
if
(
displayCamera
) {
116
free_Bound_scene(&(this->
camera
));
117
}
118
displayCamera
=
false
;
119
m_mutex_scene
.unlock();
120
}
121
133
void
vpRobotWireFrameSimulator::initScene
(
const
char
*obj,
const
char
*desired_object)
134
{
135
if
(
displayCamera
) {
136
free_Bound_scene(&(this->
camera
));
137
}
138
vpWireFrameSimulator::initScene
(obj, desired_object);
139
if
(
displayCamera
) {
140
free_Bound_scene(&(this->
camera
));
141
}
142
displayCamera
=
false
;
143
}
144
157
void
vpRobotWireFrameSimulator::initScene
(
const
vpSceneObject
&obj)
158
{
159
if
(
displayCamera
) {
160
free_Bound_scene(&(this->
camera
));
161
}
162
vpWireFrameSimulator::initScene
(obj);
163
if
(
displayCamera
) {
164
free_Bound_scene(&(this->
camera
));
165
}
166
displayCamera
=
false
;
167
}
168
179
void
vpRobotWireFrameSimulator::initScene
(
const
char
*obj)
180
{
181
if
(
displayCamera
) {
182
free_Bound_scene(&(this->
camera
));
183
}
184
vpWireFrameSimulator::initScene
(obj);
185
if
(
displayCamera
) {
186
free_Bound_scene(&(this->
camera
));
187
}
188
displayCamera
=
false
;
189
}
190
202
void
vpRobotWireFrameSimulator::getInternalView
(
vpImage<vpRGBa>
&I_)
203
{
204
205
if
(!
sceneInitialized
)
206
throw
;
207
208
double
u;
209
double
v;
210
// if(px_int != 1 && py_int != 1)
211
// we assume px_int and py_int > 0
212
if
((std::fabs(
px_int
- 1.) >
vpMath::maximum
(
px_int
, 1.) * std::numeric_limits<double>::epsilon()) &&
213
(std::fabs(
py_int
- 1) >
vpMath::maximum
(
py_int
, 1.) * std::numeric_limits<double>::epsilon())) {
214
u =
static_cast<
double
>
(I_.
getWidth
()) / (2 *
px_int
);
215
v =
static_cast<
double
>
(I_.
getHeight
()) / (2 *
py_int
);
216
}
217
else
{
218
u =
static_cast<
double
>
(I_.
getWidth
()) / (
vpMath::minimum
(I_.
getWidth
(), I_.
getHeight
()));
219
v =
static_cast<
double
>
(I_.
getHeight
()) / (
vpMath::minimum
(I_.
getWidth
(), I_.
getHeight
()));
220
}
221
222
float
o44c[4][4], o44cd[4][4], x, y, z;
223
Matrix
id
= IDENTITY_MATRIX;
224
225
vpHomogeneousMatrix
*fMit =
new
vpHomogeneousMatrix
[
size_fMi
];
226
get_fMi
(fMit);
227
this->
cMo
= fMit[
size_fMi
- 1].
inverse
() *
fMo
;
228
this->
cMo
=
rotz
*
cMo
;
229
230
vp2jlc_matrix(
cMo
.inverse(), o44c);
231
vp2jlc_matrix(
cdMo
.inverse(), o44cd);
232
233
while
(
get_displayBusy
())
234
vpTime::wait
(2);
235
236
add_vwstack(
"start"
,
"cop"
, o44c[3][0], o44c[3][1], o44c[3][2]);
237
x = o44c[2][0] + o44c[3][0];
238
y = o44c[2][1] + o44c[3][1];
239
z = o44c[2][2] + o44c[3][2];
240
add_vwstack(
"start"
,
"vrp"
, x, y, z);
241
add_vwstack(
"start"
,
"vpn"
, o44c[2][0], o44c[2][1], o44c[2][2]);
242
add_vwstack(
"start"
,
"vup"
, o44c[1][0], o44c[1][1], o44c[1][2]);
243
add_vwstack(
"start"
,
"window"
, -u, u, -v, v);
244
if
(
displayObject
)
245
display_scene
(
id
, this->
scene
, I_,
curColor
);
246
247
add_vwstack(
"start"
,
"cop"
, o44cd[3][0], o44cd[3][1], o44cd[3][2]);
248
x = o44cd[2][0] + o44cd[3][0];
249
y = o44cd[2][1] + o44cd[3][1];
250
z = o44cd[2][2] + o44cd[3][2];
251
add_vwstack(
"start"
,
"vrp"
, x, y, z);
252
add_vwstack(
"start"
,
"vpn"
, o44cd[2][0], o44cd[2][1], o44cd[2][2]);
253
add_vwstack(
"start"
,
"vup"
, o44cd[1][0], o44cd[1][1], o44cd[1][2]);
254
add_vwstack(
"start"
,
"window"
, -u, u, -v, v);
255
if
(
displayDesiredObject
) {
256
if
(
desiredObject
==
D_TOOL
)
257
display_scene
(o44cd,
desiredScene
, I_,
vpColor::red
);
258
else
259
display_scene
(
id
,
desiredScene
, I_,
desColor
);
260
}
261
delete
[] fMit;
262
set_displayBusy
(
false
);
263
}
264
276
void
vpRobotWireFrameSimulator::getInternalView
(
vpImage<unsigned char>
&I_)
277
{
278
279
if
(!
sceneInitialized
)
280
throw
;
281
282
double
u;
283
double
v;
284
// if(px_int != 1 && py_int != 1)
285
// we assume px_int and py_int > 0
286
if
((std::fabs(
px_int
- 1.) >
vpMath::maximum
(
px_int
, 1.) * std::numeric_limits<double>::epsilon()) &&
287
(std::fabs(
py_int
- 1) >
vpMath::maximum
(
py_int
, 1.) * std::numeric_limits<double>::epsilon())) {
288
u =
static_cast<
double
>
(
I
.getWidth()) / (2 *
px_int
);
289
v =
static_cast<
double
>
(
I
.getHeight()) / (2 *
py_int
);
290
}
291
else
{
292
u =
static_cast<
double
>
(I_.
getWidth
()) / (
vpMath::minimum
(I_.
getWidth
(), I_.
getHeight
()));
293
v =
static_cast<
double
>
(I_.
getHeight
()) / (
vpMath::minimum
(I_.
getWidth
(), I_.
getHeight
()));
294
}
295
296
float
o44c[4][4], o44cd[4][4], x, y, z;
297
Matrix
id
= IDENTITY_MATRIX;
298
299
vpHomogeneousMatrix
*fMit =
new
vpHomogeneousMatrix
[
size_fMi
];
300
get_fMi
(fMit);
301
this->
cMo
= fMit[
size_fMi
- 1].
inverse
() *
fMo
;
302
this->
cMo
=
rotz
*
cMo
;
303
304
vp2jlc_matrix(
cMo
.inverse(), o44c);
305
vp2jlc_matrix(
cdMo
.inverse(), o44cd);
306
307
while
(
get_displayBusy
())
308
vpTime::wait
(2);
309
310
add_vwstack(
"start"
,
"cop"
, o44c[3][0], o44c[3][1], o44c[3][2]);
311
x = o44c[2][0] + o44c[3][0];
312
y = o44c[2][1] + o44c[3][1];
313
z = o44c[2][2] + o44c[3][2];
314
add_vwstack(
"start"
,
"vrp"
, x, y, z);
315
add_vwstack(
"start"
,
"vpn"
, o44c[2][0], o44c[2][1], o44c[2][2]);
316
add_vwstack(
"start"
,
"vup"
, o44c[1][0], o44c[1][1], o44c[1][2]);
317
add_vwstack(
"start"
,
"window"
, -u, u, -v, v);
318
if
(
displayObject
) {
319
display_scene
(
id
, this->
scene
, I_,
curColor
);
320
}
321
322
add_vwstack(
"start"
,
"cop"
, o44cd[3][0], o44cd[3][1], o44cd[3][2]);
323
x = o44cd[2][0] + o44cd[3][0];
324
y = o44cd[2][1] + o44cd[3][1];
325
z = o44cd[2][2] + o44cd[3][2];
326
add_vwstack(
"start"
,
"vrp"
, x, y, z);
327
add_vwstack(
"start"
,
"vpn"
, o44cd[2][0], o44cd[2][1], o44cd[2][2]);
328
add_vwstack(
"start"
,
"vup"
, o44cd[1][0], o44cd[1][1], o44cd[1][2]);
329
add_vwstack(
"start"
,
"window"
, -u, u, -v, v);
330
if
(
displayDesiredObject
) {
331
if
(
desiredObject
==
D_TOOL
)
332
display_scene
(o44cd,
desiredScene
, I_,
vpColor::red
);
333
else
334
display_scene
(
id
,
desiredScene
, I_,
desColor
);
335
}
336
delete
[] fMit;
337
set_displayBusy
(
false
);
338
}
339
345
vpHomogeneousMatrix
vpRobotWireFrameSimulator::get_cMo
()
346
{
347
vpHomogeneousMatrix
cMoTemp;
348
vpHomogeneousMatrix
*fMit =
new
vpHomogeneousMatrix
[
size_fMi
];
349
get_fMi
(fMit);
350
cMoTemp = fMit[
size_fMi
- 1].
inverse
() *
fMo
;
351
delete
[] fMit;
352
return
cMoTemp;
353
}
354
END_VISP_NAMESPACE
355
#elif !defined(VISP_BUILD_SHARED_LIBS)
356
// Work around to avoid warning:
357
// libvisp_robot.a(vpRobotWireFrameSimulator.cpp.o) has no symbols
358
void
dummy_vpRobotWireFrameSimulator() { }
359
#endif
vpColor::red
static const vpColor red
Definition
vpColor.h:198
vpHomogeneousMatrix
Implementation of an homogeneous matrix and operations on such kind of matrices.
Definition
vpHomogeneousMatrix.h:221
vpHomogeneousMatrix::inverse
vpHomogeneousMatrix inverse() const
Definition
vpHomogeneousMatrix.cpp:1016
vpImage
Definition of the vpImage class member functions.
Definition
vpImage.h:131
vpImage::getWidth
unsigned int getWidth() const
Definition
vpImage.h:242
vpImage::getHeight
unsigned int getHeight() const
Definition
vpImage.h:181
vpMath::maximum
static Type maximum(const Type &a, const Type &b)
Definition
vpMath.h:257
vpMath::minimum
static Type minimum(const Type &a, const Type &b)
Definition
vpMath.h:265
vpRGBa
Definition
vpRGBa.h:74
vpRobotSimulator::vpRobotSimulator
vpRobotSimulator()
Definition
vpRobotSimulator.cpp:42
vpRobotWireFrameSimulator::tcur
double tcur
Definition
vpRobotWireFrameSimulator.h:88
vpRobotWireFrameSimulator::setSamplingTime
void setSamplingTime(const double &delta_t) VP_OVERRIDE
Definition
vpRobotWireFrameSimulator.h:295
vpRobotWireFrameSimulator::m_mutex_velocity
std::mutex m_mutex_velocity
Definition
vpRobotWireFrameSimulator.h:118
vpRobotWireFrameSimulator::jointLimit
bool jointLimit
Definition
vpRobotWireFrameSimulator.h:130
vpRobotWireFrameSimulator::get_cMo
vpHomogeneousMatrix get_cMo()
Definition
vpRobotWireFrameSimulator.cpp:345
vpRobotWireFrameSimulator::velocity
vpColVector velocity
Definition
vpRobotWireFrameSimulator.h:110
vpRobotWireFrameSimulator::artCoord
vpColVector artCoord
Definition
vpRobotWireFrameSimulator.h:106
vpRobotWireFrameSimulator::displayBusy
bool displayBusy
Definition
vpRobotWireFrameSimulator.h:125
vpRobotWireFrameSimulator::displayAllowed
bool displayAllowed
Definition
vpRobotWireFrameSimulator.h:153
vpRobotWireFrameSimulator::initScene
void initScene(const vpSceneObject &obj, const vpSceneDesiredObject &desiredObject)
Definition
vpRobotWireFrameSimulator.cpp:108
vpRobotWireFrameSimulator::set_displayBusy
void set_displayBusy(const bool &status)
Definition
vpRobotWireFrameSimulator.h:392
vpRobotWireFrameSimulator::m_mutex_fMi
std::mutex m_mutex_fMi
Definition
vpRobotWireFrameSimulator.h:114
vpRobotWireFrameSimulator::m_mutex_frame
std::mutex m_mutex_frame
Definition
vpRobotWireFrameSimulator.h:121
vpRobotWireFrameSimulator::I
vpImage< vpRGBa > I
Definition
vpRobotWireFrameSimulator.h:82
vpRobotWireFrameSimulator::m_mutex_artVel
std::mutex m_mutex_artVel
Definition
vpRobotWireFrameSimulator.h:116
vpRobotWireFrameSimulator::m_mutex_eMc
std::mutex m_mutex_eMc
Definition
vpRobotWireFrameSimulator.h:115
vpRobotWireFrameSimulator::fMi
vpHomogeneousMatrix * fMi
Definition
vpRobotWireFrameSimulator.h:103
vpRobotWireFrameSimulator::getInternalView
void getInternalView(vpImage< vpRGBa > &I)
Definition
vpRobotWireFrameSimulator.cpp:202
vpRobotWireFrameSimulator::cameraParam
vpCameraParameters cameraParam
Definition
vpRobotWireFrameSimulator.h:137
vpRobotWireFrameSimulator::m_mutex_robotStop
std::mutex m_mutex_robotStop
Definition
vpRobotWireFrameSimulator.h:120
vpRobotWireFrameSimulator::setVelocityCalled
bool setVelocityCalled
Definition
vpRobotWireFrameSimulator.h:162
vpRobotWireFrameSimulator::m_mutex_display
std::mutex m_mutex_display
Definition
vpRobotWireFrameSimulator.h:119
vpRobotWireFrameSimulator::displayType
vpDisplayRobotType displayType
Definition
vpRobotWireFrameSimulator.h:151
vpRobotWireFrameSimulator::vpRobotWireFrameSimulator
vpRobotWireFrameSimulator()
Definition
vpRobotWireFrameSimulator.cpp:48
vpRobotWireFrameSimulator::get_displayBusy
bool get_displayBusy()
Definition
vpRobotWireFrameSimulator.h:398
vpRobotWireFrameSimulator::tprev
double tprev
Definition
vpRobotWireFrameSimulator.h:90
vpRobotWireFrameSimulator::jointLimitArt
unsigned int jointLimitArt
Definition
vpRobotWireFrameSimulator.h:132
vpRobotWireFrameSimulator::m_mutex_artCoord
std::mutex m_mutex_artCoord
Definition
vpRobotWireFrameSimulator.h:117
vpRobotWireFrameSimulator::robotStop
bool robotStop
Definition
vpRobotWireFrameSimulator.h:128
vpRobotWireFrameSimulator::MODEL_3D
@ MODEL_3D
Definition
vpRobotWireFrameSimulator.h:84
vpRobotWireFrameSimulator::display
vpDisplayX display
Definition
vpRobotWireFrameSimulator.h:140
vpRobotWireFrameSimulator::size_fMi
unsigned int size_fMi
Definition
vpRobotWireFrameSimulator.h:96
vpRobotWireFrameSimulator::artVel
vpColVector artVel
Definition
vpRobotWireFrameSimulator.h:108
vpRobotWireFrameSimulator::m_thread
std::thread * m_thread
Definition
vpRobotWireFrameSimulator.h:112
vpRobotWireFrameSimulator::constantSamplingTimeMode
bool constantSamplingTimeMode
Definition
vpRobotWireFrameSimulator.h:158
vpRobotWireFrameSimulator::m_mutex_scene
std::mutex m_mutex_scene
Definition
vpRobotWireFrameSimulator.h:123
vpRobotWireFrameSimulator::get_fMi
virtual void get_fMi(vpHomogeneousMatrix *fMit)=0
vpRobotWireFrameSimulator::robotArms
Bound_scene * robotArms
Definition
vpRobotWireFrameSimulator.h:93
vpRobotWireFrameSimulator::m_mutex_setVelocityCalled
std::mutex m_mutex_setVelocityCalled
Definition
vpRobotWireFrameSimulator.h:122
vpRobotWireFrameSimulator::singularityManagement
bool singularityManagement
Definition
vpRobotWireFrameSimulator.h:134
vpWireFrameSimulator::desiredObject
vpSceneDesiredObject desiredObject
Definition
vpWireFrameSimulator.h:244
vpWireFrameSimulator::vpSceneDesiredObject
vpSceneDesiredObject
Definition
vpWireFrameSimulator.h:221
vpWireFrameSimulator::D_TOOL
@ D_TOOL
A cylindrical tool is attached to the camera.
Definition
vpWireFrameSimulator.h:225
vpWireFrameSimulator::desColor
vpColor desColor
Definition
vpWireFrameSimulator.h:249
vpWireFrameSimulator::displayCamera
bool displayCamera
Definition
vpWireFrameSimulator.h:277
vpWireFrameSimulator::displayObject
bool displayObject
Definition
vpWireFrameSimulator.h:275
vpWireFrameSimulator::sceneInitialized
bool sceneInitialized
Definition
vpWireFrameSimulator.h:251
vpWireFrameSimulator::desiredScene
Bound_scene desiredScene
Definition
vpWireFrameSimulator.h:232
vpWireFrameSimulator::initScene
void initScene(const vpSceneObject &obj, const vpSceneDesiredObject &desiredObject)
Definition
vpWireFrameSimulator.cpp:257
vpWireFrameSimulator::vpWireFrameSimulator
vpWireFrameSimulator()
Definition
vpWireFrameSimulator.cpp:170
vpWireFrameSimulator::display_scene
void display_scene(Matrix mat, Bound_scene &sc, const vpImage< vpRGBa > &I, const vpColor &color)
Definition
vpWireFrameSimulator.cpp:75
vpWireFrameSimulator::fMo
vpHomogeneousMatrix fMo
Definition
vpWireFrameSimulator.h:236
vpWireFrameSimulator::cMo
vpHomogeneousMatrix cMo
Definition
vpWireFrameSimulator.h:240
vpWireFrameSimulator::displayDesiredObject
bool displayDesiredObject
Definition
vpWireFrameSimulator.h:276
vpWireFrameSimulator::py_int
double py_int
Definition
vpWireFrameSimulator.h:271
vpWireFrameSimulator::px_int
double px_int
Definition
vpWireFrameSimulator.h:270
vpWireFrameSimulator::vpSceneObject
vpSceneObject
Definition
vpWireFrameSimulator.h:169
vpWireFrameSimulator::rotz
vpHomogeneousMatrix rotz
Definition
vpWireFrameSimulator.h:286
vpWireFrameSimulator::curColor
vpColor curColor
Definition
vpWireFrameSimulator.h:248
vpWireFrameSimulator::camera
Bound_scene camera
Definition
vpWireFrameSimulator.h:233
vpWireFrameSimulator::cdMo
vpHomogeneousMatrix cdMo
Definition
vpWireFrameSimulator.h:241
vpWireFrameSimulator::scene
Bound_scene scene
Definition
vpWireFrameSimulator.h:231
BEGIN_VISP_NAMESPACE
Definition
vpMbtDistanceCircle.cpp:55
vpTime::wait
VISP_EXPORT int wait(double t0, double t)
modules
robot
src
robot-simulator
vpRobotWireFrameSimulator.cpp
Generated by
1.17.0