Awesome
sick_ldmrs_laser
This stack provides a ROS driver for the SICK LD-MRS series of laser scanners. The SICK LD-MRS is a multi-layer, multi-echo 3D laser scanner that is geared towards rough outdoor environments and also provides object tracking. The driver also works for the identical devices from IBEO.
Supported Hardware
This driver has been tested and confirmed working on the following products. If you have successfully used this driver with a LD-MRS scanner which is not on this list, please contact us so we can add it.
device name | identical to | part no. | description | |
---|---|---|---|---|
LD-MRS400001 | 1045046 | 4 layer (standard) | ||
LD-MRS400001S01 | IBEO LUX Standard | 1052960 | 4 layer (standard, includes object tracking) | |
LD-MRS400102 HD | 1047145 | 4 layer (heavy duty) | ||
LD-MRS400102S01 HD | IBEO LUX HD | 1052961 | 4 layer (heavy duty, includes object tracking) | |
LD-MRS800001S01 | IBEO LUX 8L | 1069408 | 8 layer (standard) |
Installation
In the following instructions, replace <rosdistro>
with the name of your ROS distro (e.g., indigo
).
source /opt/ros/<rosdistro>/setup.bash
mkdir -p ~/ros_catkin_ws/src/
cd ~/ros_catkin_ws/src/
git clone https://github.com/SICKAG/libsick_ldmrs.git
git clone -b <rosdistro> https://github.com/SICKAG/sick_ldmrs_laser.git
cd ..
catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
source ~/ros_catkin_ws/install_isolated/setup.bash
Quick Start
roslaunch sick_ldmrs_tools sick_ldmrs_demo.launch
rosrun rviz rviz -d $(rospack find sick_ldmrs_tools)/config/sick_ldmrs.rviz
rosrun rqt_reconfigure rqt_reconfigure
rosrun rqt_robot_monitor rqt_robot_monitor
Package overview
-
sick_ldmrs_driver: This package provides the main driver node,
sick_ldmrs_node
. -
sick_ldmrs_description: This package provides an URDF description of the scanner along with the corresponding mesh.
-
sick_ldmrs_msgs: This package provides ROS message definitions for the scanner's object tracking functionality and a PCL point type used in the PointCloud2 topic.
-
sick_ldmrs_tools: This package provides example nodes that demonstrate how to subscribe to the topics provided by the scanner and use the data:
sick_ldmrs_filter_first
: Filters the point cloud and only output the first echo of each beam.sick_ldmrs_filter_last
: Filters the point cloud and only output the last echo of each beam.sick_ldmrs_filter_layer
: Filters the point cloud and only output points from the second layer.sick_ldmrs_object_marker
: Subscribes to theobjects
topic and publishes the object tracking information as visualization_msgs/MarkerArray for visualization in RViz.sick_ldmrs_all_layer_assembler
: Subscribes to the point cloud, transforms it into a fixed frame and assembles one point clouds of the lower four layers and one of the upper four layers into a point cloud of all eight layers.sick_ldmrs_make_organized
: Subscribes to the point cloud and turns it into an organized point cloud.sick_ldmrs_remove_background
: Removes static background points from an organized input point cloud, assuming the scanner is stationary.sick_ldmrs_print_resolution
: Subscribes to the point cloud and prints the angular resolution sectors. Useful to verify that the FocusedRes / FlexRes features are working as expected.
ROS API
sick_ldmrs_node
Published Topics
cloud
(sensor_msgs/PointCloud2)
- The published point cloud. The meaning of the fields is documented in sick_ldmrs_point_type.h.
objects
(sick_ldmrs_msgs/ObjectArray)
- The output of the object tracking functionality of the scanner. See ObjectArray.msg and Object.msg.
diagnostics
(diagnostic_msgs/DiagnosticArray)
- ROS diagnostics information.
Parameters
Dynamically Reconfigurable Parameters
See the dynamic_reconfigure package for details on dynamically reconfigurable parameters.
~frame_id
(str
, default: ldmrs)
- The TF frame in which point clouds will be returned.
~start_angle
(double
, default: 0.872664625997)
- The angle of the first range measurement [rad]. Range: -1.04610672041 to 0.872664625997
~end_angle
(double
, default: -1.0471975512)
- The angle of the last range measurement [rad]. Range: -1.0471975512 to 0.871573795215
~scan_frequency
(int
, default: 0)
- Scan frequency. Possible values are: ScanFreq1250 (0): Scan frequency 12.5 Hz, ScanFreq2500 (1): Scan frequency 25.0 Hz, ScanFreq5000 (2): Scan frequency 50.0 Hz.
~sync_angle_offset
(double
, default: 0.0)
- Angle under which the LD-MRS measures at the time of the sync pulse [rad]. Range: -3.14159265359 to 3.1410472382
~angular_resolution_type
(int
, default: 1)
- Angular resolution type. Possible values are: FocusedRes (0): Focused resolution, ConstantRes (1): Constant resolution (0.25° @ 12.5 Hz / 0.25° @ 25.0 Hz / 0.5° @ 50.0 Hz), FlexRes (2): Flexible resolution
~layer_range_reduction
(int
, default: 0)
- Possible values are: RangeFull (0): All layers full range, RangeLowerReduced (1): Lower 4 layers reduced range, RangeUpperReduced (2): Upper 4 layers reduced range, RangeAllReduced (3): All 8 layers reduced range.
~ignore_near_range
(bool
, default: False)
- Ignore scan points up to 15m. Requires
layer_range_reduction
= RangeLowerReduced.
~sensitivity_control
(bool
, default: False)
- Reduce the sensitivity automatically in case of extraneous light.
~flexres_start_angle1
(double
, default: 0.872664625997)
- FlexRes: start angle of sector 1. Range: -1.04610672041 to 0.872664625997
~flexres_start_angle2
(double
, default: 0.610865238198)
- FlexRes: start angle of sector 2. Range: -1.04610672041 to 0.872664625997
~flexres_start_angle3
(double
, default: 0.523598775598)
- FlexRes: start angle of sector 3. Range: -1.04610672041 to 0.872664625997
~flexres_start_angle4
(double
, default: 0.349065850399)
- FlexRes: start angle of sector 4. Range: -1.04610672041 to 0.872664625997
~flexres_start_angle5
(double
, default: 0.0)
- FlexRes: start angle of sector 5. Range: -1.04610672041 to 0.872664625997
~flexres_start_angle6
(double
, default: -0.349065850399)
- FlexRes: start angle of sector 6. Range: -1.04610672041 to 0.872664625997
~flexres_start_angle7
(double
, default: -0.523598775598)
- FlexRes: start angle of sector 7. Range: -1.04610672041 to 0.872664625997
~flexres_start_angle8
(double
, default: -0.698131700798)
- FlexRes: start angle of sector 8. Range: -1.04610672041 to 0.872664625997
~flexres_resolution1
(int
, default: 32)
- FlexRes: angular resolution of sector 1. Possible values are: Res0125 (4): Angular resolution 0.125 degrees, Res0250 (8): Angular resolution 0.25 degrees, Res0500 (16): Angular resolution 0.5 degrees, Res1000 (32): Angular resolution 1.0 degrees
~flexres_resolution2
(int
, default: 16)
- FlexRes: angular resolution of sector 2. Possible values are: Res0125 (4): Angular resolution 0.125 degrees, Res0250 (8): Angular resolution 0.25 degrees, Res0500 (16): Angular resolution 0.5 degrees, Res1000 (32): Angular resolution 1.0 degrees
~flexres_resolution3
(int
, default: 8)
- FlexRes: angular resolution of sector 3. Possible values are: Res0125 (4): Angular resolution 0.125 degrees, Res0250 (8): Angular resolution 0.25 degrees, Res0500 (16): Angular resolution 0.5 degrees, Res1000 (32): Angular resolution 1.0 degrees
~flexres_resolution4
(int
, default: 4)
- FlexRes: angular resolution of sector 4. Possible values are: Res0125 (4): Angular resolution 0.125 degrees, Res0250 (8): Angular resolution 0.25 degrees, Res0500 (16): Angular resolution 0.5 degrees, Res1000 (32): Angular resolution 1.0 degrees
~flexres_resolution5
(int
, default: 8)
- FlexRes: angular resolution of sector 5. Possible values are: Res0125 (4): Angular resolution 0.125 degrees, Res0250 (8): Angular resolution 0.25 degrees, Res0500 (16): Angular resolution 0.5 degrees, Res1000 (32): Angular resolution 1.0 degrees
~flexres_resolution6
(int
, default: 16)
- FlexRes: angular resolution of sector 6. Possible values are: Res0125 (4): Angular resolution 0.125 degrees, Res0250 (8): Angular resolution 0.25 degrees, Res0500 (16): Angular resolution 0.5 degrees, Res1000 (32): Angular resolution 1.0 degrees
~flexres_resolution7
(int
, default: 32)
- FlexRes: angular resolution of sector 7. Possible values are: Res0125 (4): Angular resolution 0.125 degrees, Res0250 (8): Angular resolution 0.25 degrees, Res0500 (16): Angular resolution 0.5 degrees, Res1000 (32): Angular resolution 1.0 degrees
~flexres_resolution8
(int
, default: 16)
- FlexRes: angular resolution of sector 8. Possible values are: Res0125 (4): Angular resolution 0.125 degrees, Res0250 (8): Angular resolution 0.25 degrees, Res0500 (16): Angular resolution 0.5 degrees, Res1000 (32): Angular resolution 1.0 degrees
~contour_point_density
(int
, default: 2)
- Contour point density. Possible values are: ClosestPointOnly (0): Closest point only, LowDensity (1): Low density, HighDensity(2): High density
~min_object_age
(int
, default: 0)
- Minimum tracking age (number of scans) of an object to be transmitted. Range: 0 to 65535
~max_prediction_age
(int
, default: 0)
- Maximum prediction age (number of scans) of an object to be transmitted. Range: 0 to 65535
Not Dynamically Reconfigurable Parameters
~hostname
(string
, default: "192.168.0.1")
- The host name or IP address of the laser scanner.
Notes on FlexRes
Please observe the following constraints when setting the FlexRes parameters (user-defined sectors of angular resolution):
- The start angles of each sector have to be given in decreasing order (i.e.,
flexres_start_angle1 > flexres_start_angle2
etc.) - The sectors with a resolution of 0.125° must not sum up to more than 20°.
- The number of shots per scan must be at most 440. (This corresponds to an average angular resolution of 0.25° over the full 110° range.)
The reason for the last two constraints is that the scanner increases the shooting frequency when increasing angular resolution. To avoid overheating the scanner and limit the amount of data to be processed, it's not possible to use 0.125° angular resolution for the full range.
Unused Scanner Parameters
The scanner provides a number of parameters that are not exposed via the ROS API. Specifically:
- A number of vehicle-related parameters (vehicle velocity, axis lengths, mounting position of the scanner). The "ROS way" of handling this is to use URDF to specify the position of the scanner and other forms of localization to provide the transform between world and scanner coordinates.
- The
upside_down
parameter. In ROS, this is also better handled by specifying the scanner mounting position in the URDF. This driver will print a warning if theupside_down
parameter was set externally. - SOPAS fields and eval cases.
- Setting the TCP/IP configuration of the scanner. Not supported by this driver to avoid accidentally making the scanner unaccessible; use the software provided with the scanner instead.