55#include <visp3/core/vpConfig.h>
56#include <visp3/core/vpDebug.h>
57#include <visp3/core/vpDisplay.h>
58#include <visp3/core/vpImage.h>
59#include <visp3/core/vpImagePoint.h>
60#include <visp3/io/vpImageIo.h>
61#include <visp3/sensor/vpSickLDMRS.h>
62#ifdef VISP_HAVE_MODULE_GUI
63#include <visp3/gui/vpDisplayFactory.h>
65#include <visp3/core/vpIoTools.h>
66#include <visp3/io/vpParseArgv.h>
67#include <visp3/sensor/vp1394TwoGrabber.h>
69#if (!defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))) && \
70 defined(VISP_HAVE_DISPLAY) && defined(VISP_HAVE_THREADS)
75#ifdef ENABLE_VISP_NAMESPACE
80static int layerToDisplay = 0xF;
82double time_offset = 0;
84std::string output_path;
86void laser_display_and_save_loop()
90 unsigned int width = map.getWidth();
91 unsigned int height = map.getHeight();
101 for (
int layer = 0; layer < 4; layer++) {
118#ifdef VISP_HAVE_MODULE_GUI
119#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
124 display->init(map, 10, 10,
"Laser scan");
127 unsigned int iter = 0;
130#if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_GTK))
135 for (
int layer = 0; layer < 4; layer++) {
136 laserscan[layer] = shm_laserscan[layer];
141 for (
int layer = 0; layer < 4; layer++) {
142 if (!((0x1 << layer) & layerToDisplay)) {
143 std::cout <<
"Layer " << layer + 1 <<
" is not displayed" << std::endl;
147 std::vector<vpScanPoint> pointsLayer = laserscan[layer].
getScanPoints();
151 snprintf(filename, FILENAME_MAX,
"%s/scan%04u-layer%d.txt", output_path.c_str(), iter, layer + 1);
152 fdscan.open(filename);
155 fdscan <<
"# Scan layer [1 to 4] : " << layer + 1 << std::endl
156 <<
"# Start timestamp (s) : " << laserscan[layer].
getStartTimestamp() - time_offset << std::endl
157 <<
"# End timestamp (s) : " << laserscan[layer].
getEndTimestamp() - time_offset << std::endl
158 <<
"# Data : \"radial distance (m)\" \"horizontal angle "
159 "(rad)\" \"vertical angle (rad)\" \"X (m)\" \"Y (m)\" \"Z "
165 double resolution = 5;
167 for (
unsigned int i = 0;
i < pointsLayer.size();
i++) {
169 E.
set_i(height - resolution *
p.getRadialDist() * cos(
p.getHAngle()));
170 E.
set_j(width / 2. - resolution *
p.getRadialDist() * sin(
p.getHAngle()));
172#if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_GTK))
177 fdscan <<
p << std::endl;
184#if defined(VISP_HAVE_DISPLAY)
192#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11) && defined(VISP_HAVE_MODULE_GUI)
193 if (display !=
nullptr) {
201 std::string ip =
"131.254.12.119";
210 if (laser.
measure(laserscan) ==
false)
214 for (
int layer = 0; layer < 4; layer++) {
215 shm_laserscan[layer] = laserscan[layer];
223void camera_acq_and_display_loop()
225#ifdef VISP_HAVE_DC1394
241 I.quarterSizeImage(Q);
243#ifdef VISP_HAVE_MODULE_GUI
244#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
249 display->init(Q, 320, 10,
"Camera");
253 std::ofstream fdimage_ts;
255 std::string
filename = output_path +
"/image_timestamp.txt";
257 fdimage_ts <<
"# [image name] [time stamp in second]" << std::endl;
264 dc1394video_frame_t *frame = g.
dequeue(I, timestamp,
id);
265 I.quarterSizeImage(Q);
266 double image_timestamp = timestamp / 1000000. - time_offset;
267 std::cout <<
"camera timestamp: " << image_timestamp <<
" s " << std::endl;
270 snprintf(filename, FILENAME_MAX,
"%s/image%04u.png", output_path.c_str(), iter);
272 fdimage_ts <<
filename <<
" " << image_timestamp << std::endl;
274#if defined(VISP_HAVE_DISPLAY)
288#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11) && defined(VISP_HAVE_MODULE_GUI)
289 if (display !=
nullptr) {
296int main(
int argc,
const char **argv)
299 output_path =
"data";
307 std::cout <<
"Cannot create " << output_path <<
" directory" << std::endl;
313 vpParseArgv::vpArgvInfo argTable[] = {
315 "The layer to display:\n"
316 "\t\t. 0x1 for layer 1.\n"
317 "\t\t. 0x2 for layer 2.\n"
318 "\t\t. 0x4 for layer 3.\n"
319 "\t\t. 0x8 for layer 4.\n"
320 "\t\tTo display all the layers you should set 0xF value."},
321 {
"-save",
vpParseArgv::ARGV_INT, (
char *)
nullptr, (
char *)&save,
"Turn to 1 in order to save data."},
323 "Display one or more measured layers form a Sick LD-MRS laser "
331 return (EXIT_FAILURE);
335 std::thread thread_camera_acq(&camera_acq_and_display_loop);
336 std::thread thread_laser_acq(&laser_acq_loop);
337 std::thread thread_laser_display(&laser_display_and_save_loop);
338 thread_camera_acq.join();
339 thread_laser_acq.join();
340 thread_laser_display.join();
345 std::cout <<
"Catch an exception: " <<
e << std::endl;
350#elif !(defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK))
353 std::cout <<
"You do not have X11, or GTK functionalities to display images..." << std::endl;
354 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
355 std::cout <<
"- Install X11, configure again ViSP using cmake and build again this example" << std::endl;
356 std::cout <<
"Tip if you are on a windows-like system:" << std::endl;
357 std::cout <<
"- Install GTK, configure again ViSP using cmake and build again this example" << std::endl;
364 std::cout <<
"This example is only working on unix-like platforms \n"
365 <<
"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
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 ...
Definition of the vpImage class member functions.
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.
Driver for the Sick LD-MRS laser scanner.
bool setup(const std::string &ip, int port)
bool measure(vpLaserScan laserscan[4])
std::shared_ptr< vpDisplay > createDisplay()
Return a smart pointer vpDisplay specialization if a GUI library is available or nullptr otherwise.
vpDisplay * allocateDisplay()
Return a newly allocated vpDisplay specialization if a GUI library is available or nullptr otherwise.
VISP_EXPORT double measureTimeMs()
VISP_EXPORT double measureTimeSecond()