57 #include <visp3/core/vpDebug.h>
58 #include <visp3/core/vpDisplay.h>
59 #include <visp3/core/vpImage.h>
60 #include <visp3/core/vpImagePoint.h>
61 #include <visp3/io/vpImageIo.h>
62 #include <visp3/sensor/vpSickLDMRS.h>
63 #ifdef VISP_HAVE_MODULE_GUI
64 #include <visp3/gui/vpDisplayGTK.h>
65 #include <visp3/gui/vpDisplayX.h>
67 #include <visp3/core/vpIoTools.h>
68 #include <visp3/io/vpParseArgv.h>
69 #include <visp3/sensor/vp1394TwoGrabber.h>
71 #if (!defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))) && \
72 (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK)) && defined(VISP_HAVE_THREADS)
78 static int layerToDisplay = 0xF;
80 double time_offset = 0;
82 std::string output_path;
84 void laser_display_and_save_loop()
88 unsigned int width = map.getWidth();
89 unsigned int height = map.getHeight();
95 char filename[FILENAME_MAX];
99 for (
int layer = 0; layer < 4; layer++) {
117 #ifdef VISP_HAVE_MODULE_GUI
118 #if defined(VISP_HAVE_X11)
120 #elif defined(VISP_HAVE_GTK)
123 display->init(map, 10, 10,
"Laser scan");
126 unsigned int iter = 0;
129 #if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_GTK))
134 for (
int layer = 0; layer < 4; layer++) {
135 laserscan[layer] = shm_laserscan[layer];
140 for (
int layer = 0; layer < 4; layer++) {
141 if (!((0x1 << layer) & layerToDisplay)) {
142 std::cout <<
"Layer " << layer + 1 <<
" is not displayed" << std::endl;
146 std::vector<vpScanPoint> pointsLayer = laserscan[layer].
getScanPoints();
150 snprintf(filename, FILENAME_MAX,
"%s/scan%04u-layer%d.txt", output_path.c_str(), iter, layer + 1);
151 fdscan.open(filename);
154 fdscan <<
"# Scan layer [1 to 4] : " << layer + 1 << std::endl
155 <<
"# Start timestamp (s) : " << laserscan[layer].
getStartTimestamp() - time_offset << std::endl
156 <<
"# End timestamp (s) : " << laserscan[layer].
getEndTimestamp() - time_offset << std::endl
157 <<
"# Data : \"radial distance (m)\" \"horizontal angle "
158 "(rad)\" \"vertical angle (rad)\" \"X (m)\" \"Y (m)\" \"Z "
164 double resolution = 5;
166 for (
unsigned int i = 0; i < pointsLayer.size(); i++) {
171 #if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_GTK))
176 fdscan << p << std::endl;
183 #if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_GTK))
193 void laser_acq_loop()
195 std::string ip =
"131.254.12.119";
204 if (laser.
measure(laserscan) ==
false)
208 for (
int layer = 0; layer < 4; layer++) {
209 shm_laserscan[layer] = laserscan[layer];
217 void camera_acq_and_display_loop()
219 #ifdef VISP_HAVE_DC1394
238 #ifdef VISP_HAVE_MODULE_GUI
239 #if defined(VISP_HAVE_X11)
241 #elif defined(VISP_HAVE_GTK)
244 display->init(Q, 320, 10,
"Camera");
248 std::ofstream fdimage_ts;
250 std::string filename = output_path +
"/image_timestamp.txt";
251 fdimage_ts.open(filename.c_str());
252 fdimage_ts <<
"# [image name] [time stamp in second]" << std::endl;
255 char filename[FILENAME_MAX];
259 dc1394video_frame_t *frame = g.
dequeue(I, timestamp,
id);
261 double image_timestamp = timestamp / 1000000. - time_offset;
262 std::cout <<
"camera timestamp: " << image_timestamp <<
" s " << std::endl;
265 snprintf(filename, FILENAME_MAX,
"%s/image%04u.png", output_path.c_str(), iter);
267 fdimage_ts << filename <<
" " << image_timestamp << std::endl;
269 #if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_GTK))
287 int main(
int argc,
const char **argv)
290 output_path =
"data";
298 std::cout <<
"Cannot create " << output_path <<
" directory" << std::endl;
304 vpParseArgv::vpArgvInfo argTable[] = {
306 "The layer to display:\n"
307 "\t\t. 0x1 for layer 1.\n"
308 "\t\t. 0x2 for layer 2.\n"
309 "\t\t. 0x4 for layer 3.\n"
310 "\t\t. 0x8 for layer 4.\n"
311 "\t\tTo display all the layers you should set 0xF value."},
312 {
"-save",
vpParseArgv::ARGV_INT, (
char *)
nullptr, (
char *)&save,
"Turn to 1 in order to save data."},
314 "Display one or more measured layers form a Sick LD-MRS laser "
322 return (EXIT_FAILURE);
326 std::thread thread_camera_acq(&camera_acq_and_display_loop);
327 std::thread thread_laser_acq(&laser_acq_loop);
328 std::thread thread_laser_display(&laser_display_and_save_loop);
329 thread_camera_acq.join();
330 thread_laser_acq.join();
331 thread_laser_display.join();
336 std::cout <<
"Catch an exception: " << e << std::endl;
341 #elif !(defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK))
344 std::cout <<
"You do not have X11, or GTK functionalities to display images..." << std::endl;
345 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
346 std::cout <<
"- Install X11, configure again ViSP using cmake and build again this example" << std::endl;
347 std::cout <<
"Tip if you are on a windows-like system:" << std::endl;
348 std::cout <<
"- Install GTK, configure again ViSP using cmake and build again this example" << std::endl;
355 std::cout <<
"This example is only working on unix-like platforms \n"
356 <<
"since the Sick LD-MRS driver was not ported to Windows." << std::endl;
Class for firewire ieee1394 video devices using libdc1394-2.x api.
void acquire(vpImage< unsigned char > &I)
void enqueue(dc1394video_frame_t *frame)
dc1394video_frame_t * dequeue()
void getNumCameras(unsigned int &ncameras) const
Class to define RGB colors available for display functionalities.
static const vpColor blue
static const vpColor yellow
static const vpColor green
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Class that defines generic functionalities for display.
static void display(const vpImage< unsigned char > &I)
static void displayLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1, bool segment=true)
static void flush(const vpImage< unsigned char > &I)
error that can be emitted by ViSP classes.
static void write(const vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void quarterSizeImage(vpImage< Type > &res) const
Implements a laser scan data structure that contains especially the list of scanned points that have ...
double getStartTimestamp()
std::vector< vpScanPoint > getScanPoints()
void setIpAddress(std::string ip_address)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
@ ARGV_NO_DEFAULTS
No default options like -help.
@ ARGV_NO_LEFTOVERS
Print an error message if an option is not in the argument list.
@ ARGV_INT
Argument is associated to an int.
@ ARGV_END
End of the argument list.
@ ARGV_HELP
Argument is for help displaying.
Class that defines a single laser scanner point.
double getRadialDist() const
Driver for the Sick LD-MRS laser scanner.
bool setup(const std::string &ip, int port)
bool measure(vpLaserScan laserscan[4])
void display(vpImage< unsigned char > &I, const std::string &title)
Display a gray-scale image.
VISP_EXPORT double measureTimeSecond()
VISP_EXPORT double measureTimeMs()