From 1cbf75b86e0d35bd3d889cbaf9a795ea039538b5 Mon Sep 17 00:00:00 2001 From: Michael Lehning Date: Wed, 10 May 2023 15:07:44 +0200 Subject: [PATCH 1/4] Remarks about interlacing and curved lines on a flat plane --- FAQ.md | 37 ++++++++++++++++++++++++++++++++++++- cone_section.png | Bin 0 -> 26812 bytes 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 cone_section.png diff --git a/FAQ.md b/FAQ.md index be001313..8cf1cb90 100644 --- a/FAQ.md +++ b/FAQ.md @@ -265,7 +265,7 @@ In the example the ip address 192.168.0.4 is the laserscanner MRS1104 and the ip ```bash ifconfig|grep 192.168.0.22 ``` -## IP Address of Laser Scanner +## IP Address of Lidar :question: Question: My scanner does not use the default ip address. What shall I do? @@ -345,3 +345,38 @@ How can I debug sick_generic_caller on ROS-1? :white_check_mark: Answer: Build with compiler option `-g` and run sick_generic_caller as described using a launchfile. Stop sick_generic_caller (Ctrl-C or kill) and save the current ros parameter using `rosparam dump .yaml`. Load these parameter with `rosparam load .yaml` and restart sick_generic_caller in gdb or in your IDE. + +## Curved lines on a straight wall + +:question: Question: +The X,Y points of the lidar show a curved line even though the lidar is scanning a straight wall. How can this be? + +:white_check_mark: Answer: +This effect occurs when the lidar has multiple planes that are tilted up or down. In this case, the laser beams of this plane do not lie on a flat plane. Rather, the beams lie on a cone. If the laser beams then hit a wall, the result is a curved course of the lidar points. If the lidar is horizontal and the wall is vertical, this is a hyperbola (see following figure): + +![cone_section](doc/cone_section.png) + + + +This image is generated using the website https://www.intmath.com/plane-analytic-geometry/conic-sections-summary-interactive.php + +Thus, the mathematical laws for a conic section apply, as they are explained e.g. at Wikipedia at https://en.wikipedia.org/wiki/Conic_section. + +## Interlacing + +:question: Question: +How should I interpret the scan rate and lidar resolution from the manual? What is the relationship between ROS point cloud publishing rate and scan frequency here? + +:white_check_mark: Answer: + +The angular resolution and scan frequency is configurable in many lidars such as the LRS-4xxx or MRS-1xxx. Depending on the lidar type, angular resolution and scan frequency can be set in the launch file either via the parameter "scan_cfg_list_entry" or the parameters "ang_res" and "scan_freq". Angular resolution and scan frequency are not independent of each other. If no default settings are used, the values must be selected according to the manual for the respective lidar and set in launch file. + +An increase in resolution is achieved by interlacing by a factor of N. This means that N consecutive scans are rotated by a constant angular offset. Each scan in itself still has the physically given angular resolution and frequency. By concatenating N interlaced scans, the angular resolution is increased by the factor N. + +Example: The default setting of an MRS-1xxx is 0.25 degrees horizontal angular resolution at 50 Hz scan frequency without interlacing and an angular range of 275 degrees in total. I.e. each scan measures the distance at the hor. angles [ ..., 0.000, 0.250, 0.500, 0.750, ... ]. + +If 0.125 degrees horizontal angular resolution is configured at 25 Hz scan frequency, the scans are performed with 2 times interlacing (N=2). Every 2nd scan is horizontally shifted by 0.125 degrees. I.e. each scan measures alternately at the hor. angles [ ..., 0.000, 0.250, 0.500, 0.750, ... ] and [ ... , 0.125, 0.375, 0.625, 0.875 ... ]. 50 single scans per second resp. 25 interlaced scans per second are sent. + +If 0.0625 degrees horizontal angular resolution at 12.5 Hz scan frequency is configured, the scans are performed with 4 times interlacing (N=4). Successive scans are shifted horizontally by 0.0625 degrees each. That is, each scan measures alternately at the hor. angles [ ..., 0.000, 0.250, 0.500, 0.750, ... ], [... , 0.0625, 0.3125, 0.5625, 0.8125 ... ], [... , 0.125, 0.375, 0.625, 0.875 ... ] and [... , 0.1875, 0.4375, 0.6875, 0.9375 ... ]. 50 single scans per second resp. 12 interlaced scans per second are sent. + +In interlacing mode, laser scan and point cloud messages are published interlaced, too. In rviz, the higher angular resolution is clearly visible when the decay time is increased. diff --git a/cone_section.png b/cone_section.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1d39022a8f1714f5e53b389e34ef342c4d5753 GIT binary patch literal 26812 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 qwj@oyo=IR^@&9d4{%0DzB5QwEHuHn}%OjkGrM#>%tW?H0`2PSCiF!8x literal 0 HcmV?d00001 From 0ac5eb584a96ecd10a0db0e5594a0a57978004c9 Mon Sep 17 00:00:00 2001 From: Michael Lehning Date: Wed, 10 May 2023 15:45:35 +0200 Subject: [PATCH 2/4] cone_section moved and interlacing mode explanation extended --- FAQ.md | 7 +++++-- cone_section.png => doc/cone_section.png | Bin 2 files changed, 5 insertions(+), 2 deletions(-) rename cone_section.png => doc/cone_section.png (100%) diff --git a/FAQ.md b/FAQ.md index 8cf1cb90..d7134b93 100644 --- a/FAQ.md +++ b/FAQ.md @@ -377,6 +377,9 @@ Example: The default setting of an MRS-1xxx is 0.25 degrees horizontal angular r If 0.125 degrees horizontal angular resolution is configured at 25 Hz scan frequency, the scans are performed with 2 times interlacing (N=2). Every 2nd scan is horizontally shifted by 0.125 degrees. I.e. each scan measures alternately at the hor. angles [ ..., 0.000, 0.250, 0.500, 0.750, ... ] and [ ... , 0.125, 0.375, 0.625, 0.875 ... ]. 50 single scans per second resp. 25 interlaced scans per second are sent. -If 0.0625 degrees horizontal angular resolution at 12.5 Hz scan frequency is configured, the scans are performed with 4 times interlacing (N=4). Successive scans are shifted horizontally by 0.0625 degrees each. That is, each scan measures alternately at the hor. angles [ ..., 0.000, 0.250, 0.500, 0.750, ... ], [... , 0.0625, 0.3125, 0.5625, 0.8125 ... ], [... , 0.125, 0.375, 0.625, 0.875 ... ] and [... , 0.1875, 0.4375, 0.6875, 0.9375 ... ]. 50 single scans per second resp. 12 interlaced scans per second are sent. +If 0.0625 degrees horizontal angular resolution at 12.5 Hz scan frequency is configured, the scans are performed with 4 times interlacing (N=4). Successive scans are shifted horizontally by 0.0625 degrees each. That is, each scan measures alternately at the hor. angles [ ..., 0.000, 0.250, 0.500, 0.750, ... ], [... , 0.0625, 0.3125, 0.5625, 0.8125 ... ], [... , 0.125, 0.375, 0.625, 0.875 ... ] and [... , 0.1875, 0.4375, 0.6875, 0.9375 ... ]. 50 single scans per second resp. 12.5 interlaced scans per second are sent. + +In interlacing mode, laser scan and point cloud messages are published interlaced, too. In rviz, the higher angular resolution is clearly visible when the decay time is increased. +If you check the publishing rate of the point cloud messages, you will measure 50 Hz, since 50 interlace messages are sent per second. +But the resolution of each single message is 0.125 [deg]. Only by interleaving 4 consecutive messages you get the high resolution of 0.0625 [deg]. -In interlacing mode, laser scan and point cloud messages are published interlaced, too. In rviz, the higher angular resolution is clearly visible when the decay time is increased. diff --git a/cone_section.png b/doc/cone_section.png similarity index 100% rename from cone_section.png rename to doc/cone_section.png From 6c92eb2bc8ccf96670e580c70bd459f83158b8c4 Mon Sep 17 00:00:00 2001 From: rostest Date: Fri, 12 May 2023 09:15:33 +0200 Subject: [PATCH 3/4] Update angle correction #166 --- CHANGELOG.md | 4 + driver/src/sick_generic_laser.cpp | 2 +- driver/src/sick_lmd_scandata_parser.cpp | 7 +- driver/src/sick_scan_common.cpp | 5 +- test/emulator/config/rviz_tim240.rviz | 184 ++++++++++++++++++ test/emulator/launch/emulator_tim240.launch | 15 ++ test/emulator/src/test_server_thread.cpp | 5 +- test/emulator/yaml/emulator_port2111.yaml | 14 ++ .../pcap_json_converter.cmd | 1 + test/scripts/run_linux_ros1_simu_tim240.bash | 46 +++++ 10 files changed, 277 insertions(+), 6 deletions(-) create mode 100644 test/emulator/config/rviz_tim240.rviz create mode 100644 test/emulator/launch/emulator_tim240.launch create mode 100644 test/emulator/yaml/emulator_port2111.yaml create mode 100644 test/scripts/run_linux_ros1_simu_tim240.bash diff --git a/CHANGELOG.md b/CHANGELOG.md index 37f74051..8d1e071f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ features that will be removed in future versions **Removed** for deprecated feat ## Released ## +### v2.9.1 - Angle correction + - **Fix** Angle correction (min/max angle settings), fix #166 + - **Fix** TiM240 initialization (start measurement) + ### v2.9.0 - RMSxxxx support and NAV350 support - **Added** RMSxxxx support, unification of RMS-1xxx and RMS-2xxx Note: RMSxxxx supports ASCII-communication mode only (Cola-A). - **Update** #159 (nav310 angle setting compability), merge with NAV310 angle settings branch https://github.com/SICKAG/sick_scan_xd/tree/159-nav310-angle-setting-compability diff --git a/driver/src/sick_generic_laser.cpp b/driver/src/sick_generic_laser.cpp index 0453adcc..b8693fbd 100644 --- a/driver/src/sick_generic_laser.cpp +++ b/driver/src/sick_generic_laser.cpp @@ -93,7 +93,7 @@ #define SICK_GENERIC_MAJOR_VER "2" #define SICK_GENERIC_MINOR_VER "9" -#define SICK_GENERIC_PATCH_LEVEL "0" +#define SICK_GENERIC_PATCH_LEVEL "1" #define DELETE_PTR(p) if(p){delete(p);p=0;} diff --git a/driver/src/sick_lmd_scandata_parser.cpp b/driver/src/sick_lmd_scandata_parser.cpp index 30098d01..ffe2d82a 100644 --- a/driver/src/sick_lmd_scandata_parser.cpp +++ b/driver/src/sick_lmd_scandata_parser.cpp @@ -110,9 +110,10 @@ namespace sick_scan { bool angle_slightly_modified = false; float pi_multiplier = *angle_val/M_PI; - float check_deviation_to_abs_one = fabs(pi_multiplier) - 1.0; + // float check_deviation_to_abs_one = fabs(pi_multiplier) - 1.0; // check for a small deviation - if (check_deviation_to_abs_one < 10.0 * FLT_EPSILON ) + // if (check_deviation_to_abs_one < 10.0 * FLT_EPSILON ) + if (pi_multiplier > 1.0 - 10.0 * FLT_EPSILON || pi_multiplier < -1.0 + 10.0 * FLT_EPSILON) { float factor = (*angle_val < 0.0) ? (-1.0) : (1.0); *angle_val = factor * (1.0 - FLT_EPSILON) * M_PI; @@ -526,6 +527,7 @@ namespace sick_scan msg.angle_max *= -1.0; } + ROS_DEBUG_STREAM("msg.angle_min=" << (msg.angle_min*180/M_PI) << ", msg.angle_max=" << (msg.angle_max*180/M_PI) << ", msg.angle_increment=" << (msg.angle_increment*180/M_PI)); // Avoid 2*PI wrap around, if (msg.angle_max - msg.angle_min - 2*PI) is slightly above 0.0 due to floating point arithmetics bool wrap_avoid = false; @@ -546,6 +548,7 @@ namespace sick_scan { msg.angle_increment = (msg.angle_max - msg.angle_min) / (numberOfItems - 1); } + ROS_DEBUG_STREAM("msg.angle_min=" << (msg.angle_min*180/M_PI) << ", msg.angle_max=" << (msg.angle_max*180/M_PI) << ", msg.angle_increment=" << (msg.angle_increment*180/M_PI)); float *rangePtr = NULL; diff --git a/driver/src/sick_scan_common.cpp b/driver/src/sick_scan_common.cpp index 02dee22d..f562be75 100644 --- a/driver/src/sick_scan_common.cpp +++ b/driver/src/sick_scan_common.cpp @@ -3613,6 +3613,8 @@ namespace sick_scan { // the TiM240 operates directly in the ros coordinate system // do nothing for a TiM240 + startProtocolSequence.push_back(CMD_RUN); // leave user level + startProtocolSequence.push_back(CMD_START_SCANDATA); } else if (this->parser_->getCurrentParamPtr()->getScannerName().compare(SICK_SCANNER_NAV_350_NAME) == 0) { @@ -4858,7 +4860,8 @@ namespace sick_scan { float angle = (float)config_.min_ang; - if(this->parser_->getCurrentParamPtr()->getScannerName().compare(SICK_SCANNER_LMS_1XXX_NAME) == 0 // Check and todo: Can we use msg.angle_min for all lidars? + if(this->parser_->getCurrentParamPtr()->getScannerName().compare(SICK_SCANNER_TIM_240_NAME) == 0 + || this->parser_->getCurrentParamPtr()->getScannerName().compare(SICK_SCANNER_LMS_1XXX_NAME) == 0 // Check and todo: Can we use msg.angle_min for all lidars? || this->parser_->getCurrentParamPtr()->getScannerName().compare(SICK_SCANNER_MRS_1XXX_NAME) == 0) // Can we use this for all lidars where msg.angle_min is not 0? { angle = msg.angle_min - angleShift; // LMS-1xxx and MRS-1xxx have 4 interlaced layer with different start angle in each layer, start angle parsed from LMDscandata and set in msg.angle_min diff --git a/test/emulator/config/rviz_tim240.rviz b/test/emulator/config/rviz_tim240.rviz new file mode 100644 index 00000000..bd23ecd8 --- /dev/null +++ b/test/emulator/config/rviz_tim240.rviz @@ -0,0 +1,184 @@ +Panels: + - Class: rviz/Displays + Help Height: 78 + Name: Displays + Property Tree Widget: + Expanded: + - /Global Options1 + - /PointCloud21 + Splitter Ratio: 0.5 + Tree Height: 549 + - Class: rviz/Selection + Name: Selection + - Class: rviz/Tool Properties + Expanded: + - /2D Pose Estimate1 + - /2D Nav Goal1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.5886790156364441 + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz/Time + Name: Time + SyncMode: 0 + SyncSource: PointCloud2 +Preferences: + PromptSaveOnExit: true +Toolbars: + toolButtonStyle: 2 +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.029999999329447746 + Value: Lines + Name: Grid + Normal Cell Count: 0 + Offset: + X: 0 + Y: 0 + Z: 0 + Plane: XY + Plane Cell Count: 10 + Reference Frame: + Value: true + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/PointCloud2 + Color: 255; 255; 255 + Color Transformer: Intensity + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Min Color: 0; 0; 0 + Name: PointCloud2 + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.009999999776482582 + Style: Points + Topic: /cloud + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: true + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/LaserScan + Color: 255; 255; 255 + Color Transformer: Intensity + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Min Color: 0; 0; 0 + Name: LaserScan + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.009999999776482582 + Style: Points + Topic: /sick_tim_240/scan + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: true + - Alpha: 1 + Class: rviz/Axes + Enabled: true + Length: 1 + Name: Axes + Radius: 0.05000000074505806 + Reference Frame: + Show Trail: false + Value: true + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Default Light: true + Fixed Frame: cloud + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + - Class: rviz/FocusCamera + - Class: rviz/Measure + - Class: rviz/SetInitialPose + Theta std deviation: 0.2617993950843811 + Topic: /initialpose + X std deviation: 0.5 + Y std deviation: 0.5 + - Class: rviz/SetGoal + Topic: /move_base_simple/goal + - Class: rviz/PublishPoint + Single click: true + Topic: /clicked_point + Value: true + Views: + Current: + Class: rviz/Orbit + Distance: 10 + Enable Stereo Rendering: + Stereo Eye Separation: 0.05999999865889549 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Field of View: 0.7853981852531433 + Focal Point: + X: 0 + Y: 0 + Z: 0 + Focal Shape Fixed Size: true + Focal Shape Size: 0.05000000074505806 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.009999999776482582 + Pitch: 1.5697963237762451 + Target Frame: + Yaw: 3.133575201034546 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Height: 846 + Hide Left Dock: false + Hide Right Dock: true + QMainWindow State: 000000ff00000000fd000000040000000000000156000002b0fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d000002b0000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002b0fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d000002b0000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004b00000003efc0100000002fb0000000800540069006d00650100000000000004b0000003bc00fffffffb0000000800540069006d0065010000000000000450000000000000000000000354000002b000000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: true + Width: 1200 + X: 921 + Y: 27 diff --git a/test/emulator/launch/emulator_tim240.launch b/test/emulator/launch/emulator_tim240.launch new file mode 100644 index 00000000..47f248fa --- /dev/null +++ b/test/emulator/launch/emulator_tim240.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/test/emulator/src/test_server_thread.cpp b/test/emulator/src/test_server_thread.cpp index b98dfb22..a3155370 100644 --- a/test/emulator/src/test_server_thread.cpp +++ b/test/emulator/src/test_server_thread.cpp @@ -510,13 +510,14 @@ void sick_scan::TestServerThread::runWorkerThreadColaCb(socket_ptr p_socket) iTransmitErrorCnt = 0; } // Start or stop scandata thread - if(sick_scan::TestcaseGenerator::SendScandataEnabled() == true && m_tcp_send_scandata_thread == 0) + bool send_scandata_enabled = sick_scan::TestcaseGenerator::SendScandataEnabled() || m_scanner_type == "sick_tim_240"; // TIM240 does not support "LMCstartmeas" + if(send_scandata_enabled == true && m_tcp_send_scandata_thread == 0) { // Start scandata thread m_tcp_send_scandata_thread_running = true; m_tcp_send_scandata_thread = new std::thread(&sick_scan::TestServerThread::runWorkerThreadScandataCb, this, p_socket); } - else if(sick_scan::TestcaseGenerator::SendScandataEnabled() == false && m_tcp_send_scandata_thread != 0) + else if(send_scandata_enabled == false && m_tcp_send_scandata_thread != 0) { // Stop scandata thread closeScandataThread(); diff --git a/test/emulator/yaml/emulator_port2111.yaml b/test/emulator/yaml/emulator_port2111.yaml new file mode 100644 index 00000000..86cc5790 --- /dev/null +++ b/test/emulator/yaml/emulator_port2111.yaml @@ -0,0 +1,14 @@ +# Configuration of sick_scan_emulator +# sick_scan_emulator implements a simple tcp server, simulating a Tim875S for unittests. +# It implements a simple tcp server, accepting tcp connections from clients and generating telegrams to test the ros driver for sim localization. +sick_scan: + + # Server configuration. See Operation-Instruction-v1.1.0.241R.pdf, page 51, "IP port number and protocol" for default tcp ports. + test_server: + result_telegrams_tcp_port: 2201 # Default tcp port for sim_loc_test_server is 2201 (ip port number of the localization controller sending localization results) + cola_telegrams_tcp_port: 2111 # For requests and to transmit settings to the localization controller: IP port number 2111 and 2112 to send telegrams and to request data, SOPAS CoLa-A or CoLa-B protocols + start_scandata_delay: 1 # Delay between scandata activation ("LMCstartmeas" request) and first scandata message, default: 1 second + result_telegrams_rate: 10 # Rate to generate and send result port telegrams + result_testcases_topic: "/sick_scan/emulator/result_testcases" # ROS topic to publish testcases with result port telegrams (type SickLocResultPortTestcaseMsg) + result_testcases_frame_id: "result_testcases" # ROS frame id of testcase messages (type SickLocResultPortTestcaseMsg) + diff --git a/test/pcap_json_converter/pcap_json_converter.cmd b/test/pcap_json_converter/pcap_json_converter.cmd index abf7d07b..ae0d6952 100644 --- a/test/pcap_json_converter/pcap_json_converter.cmd +++ b/test/pcap_json_converter/pcap_json_converter.cmd @@ -13,6 +13,7 @@ echo PYTHON_DIR=%PYTHON_DIR% python --version @echo. +python pcap_json_converter.py --pcap_filename=../emulator/scandata/20230510_tim240.pcapng python pcap_json_converter.py --pcap_filename=../emulator/scandata/20230112_01_mrs1000_layer_1111_50hz_0.25deg.pcapng python pcap_json_converter.py --pcap_filename=../emulator/scandata/20230112_02_mrs1000_layer_1000_50hz_0.25deg.pcapng python pcap_json_converter.py --pcap_filename=../emulator/scandata/20230112_03_mrs1000_layer_0100_50hz_0.25deg.pcapng diff --git a/test/scripts/run_linux_ros1_simu_tim240.bash b/test/scripts/run_linux_ros1_simu_tim240.bash new file mode 100644 index 00000000..96314880 --- /dev/null +++ b/test/scripts/run_linux_ros1_simu_tim240.bash @@ -0,0 +1,46 @@ +#!/bin/bash +printf "\033c" +pushd ../../../.. +if [ -f /opt/ros/melodic/setup.bash ] ; then source /opt/ros/melodic/setup.bash ; fi +if [ -f /opt/ros/noetic/setup.bash ] ; then source /opt/ros/noetic/setup.bash ; fi +if [ -f ./devel_isolated/setup.bash ] ; then source ./devel_isolated/setup.bash ; fi + +echo -e "run_simu_tim240.bash: starting tim240 emulation\n" + +# Start roscore if not yet running +roscore_running=`(ps -elf | grep roscore | grep -v grep | wc -l)` +if [ $roscore_running -lt 1 ] ; then + roscore & + sleep 3 +fi + +# Start sick_scan emulator +roslaunch sick_scan emulator_tim240.launch & +sleep 1 + +# Start rviz +# Note: Due to a bug in opengl 3 in combination with rviz and VMware, opengl 2 should be used by rviz option --opengl 210 +# See https://github.com/ros-visualization/rviz/issues/1444 and https://github.com/ros-visualization/rviz/issues/1508 for further details + +rosrun rviz rviz -d ./src/sick_scan_xd/test/emulator/config/rviz_tim240.rviz --opengl 210 & +sleep 1 + +# Start sick_scan driver for tim240 +echo -e "Launching sick_scan sick_tim_240.launch\n" +roslaunch sick_scan sick_tim_240.launch hostname:=127.0.0.1 sw_pll_only_publish:=False & +sleep 1 + +# Wait for 'q' or 'Q' to exit or until rviz is closed +while true ; do + echo -e "tim240 emulation running. Close rviz or press 'q' to exit..." ; read -t 1.0 -n1 -s key + if [[ $key = "q" ]] || [[ $key = "Q" ]]; then break ; fi + rviz_running=`(ps -elf | grep rviz | grep -v grep | wc -l)` + if [ $rviz_running -lt 1 ] ; then break ; fi +done + +# Shutdown +rosnode kill -a ; sleep 1 +killall sick_generic_caller ; sleep 1 +killall sick_scan_emulator ; sleep 1 +popd + From 7e4e8b33e281aeea1215fc1c9abbb74086d606c4 Mon Sep 17 00:00:00 2001 From: Michael Lehning Date: Sat, 13 May 2023 07:23:32 +0200 Subject: [PATCH 4/4] CHANGELOG.md updated --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d1e071f..78b9299c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ features that will be removed in future versions **Removed** for deprecated feat ### v2.9.1 - Angle correction - **Fix** Angle correction (min/max angle settings), fix #166 - **Fix** TiM240 initialization (start measurement) + - **Added** Documentation for Interlacing mode ### v2.9.0 - RMSxxxx support and NAV350 support - **Added** RMSxxxx support, unification of RMS-1xxx and RMS-2xxx Note: RMSxxxx supports ASCII-communication mode only (Cola-A).