feat: add YDLIDAR ROS2 driver package (ported from move_try)
TminiPro LiDAR driver with multi-model parameter configs (X4, G1, G2, G6, TminiPro, etc.), ROS2 lifecycle management, and RViz debug config. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
88
ros2/src/ydlidar_ros2_driver/CMakeLists.txt
Normal file
88
ros2/src/ydlidar_ros2_driver/CMakeLists.txt
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
# Copyright(c) 2020 eaibot limited.
|
||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
project(ydlidar_ros2_driver C CXX)
|
||||||
|
|
||||||
|
##################ros2#############################################
|
||||||
|
# Default to C++14
|
||||||
|
if(NOT CMAKE_CXX_STANDARD)
|
||||||
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
endif()
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
add_compile_options(-Wall -Wextra -Wpedantic)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
####################find package#####################################
|
||||||
|
find_package(ament_cmake REQUIRED)
|
||||||
|
find_package(rclcpp REQUIRED)
|
||||||
|
find_package(rmw REQUIRED)
|
||||||
|
find_package(sensor_msgs REQUIRED)
|
||||||
|
find_package(visualization_msgs REQUIRED)
|
||||||
|
find_package(geometry_msgs REQUIRED)
|
||||||
|
find_package(std_srvs REQUIRED)
|
||||||
|
|
||||||
|
############## YDLIDAR SDK START#####################################
|
||||||
|
#find ydlidar_sdk package
|
||||||
|
find_package(ydlidar_sdk REQUIRED)
|
||||||
|
############## YDLIDAR SDK END#####################################
|
||||||
|
|
||||||
|
#Include directories
|
||||||
|
include_directories(
|
||||||
|
${PROJECT_SOURCE_DIR}
|
||||||
|
${PROJECT_SOURCE_DIR}/src
|
||||||
|
${YDLIDAR_SDK_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
#link library directories
|
||||||
|
link_directories(${YDLIDAR_SDK_LIBRARY_DIRS})
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
# generate excutable and add libraries
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
add_executable(${PROJECT_NAME}_node
|
||||||
|
src/${PROJECT_NAME}_node.cpp)
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
# link libraries
|
||||||
|
#--------------------------------------------------------------------------------------
|
||||||
|
ament_target_dependencies(${PROJECT_NAME}_node
|
||||||
|
"rclcpp"
|
||||||
|
"sensor_msgs"
|
||||||
|
"visualization_msgs"
|
||||||
|
"geometry_msgs"
|
||||||
|
"std_srvs"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(${PROJECT_NAME}_node
|
||||||
|
${YDLIDAR_SDK_LIBRARIES})
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
# generate excutable and add libraries
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
add_executable(${PROJECT_NAME}_client
|
||||||
|
src/${PROJECT_NAME}_client.cpp)
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
# link libraries
|
||||||
|
#--------------------------------------------------------------------------------------
|
||||||
|
ament_target_dependencies(${PROJECT_NAME}_client
|
||||||
|
"rclcpp"
|
||||||
|
"sensor_msgs"
|
||||||
|
"visualization_msgs"
|
||||||
|
"geometry_msgs"
|
||||||
|
"std_srvs"
|
||||||
|
)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
# Install
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
install(TARGETS
|
||||||
|
${PROJECT_NAME}_node ${PROJECT_NAME}_client
|
||||||
|
DESTINATION lib/${PROJECT_NAME})
|
||||||
|
|
||||||
|
install(DIRECTORY launch params startup config
|
||||||
|
DESTINATION share/${PROJECT_NAME})
|
||||||
|
|
||||||
|
if(BUILD_TESTING)
|
||||||
|
find_package(ament_lint_auto REQUIRED)
|
||||||
|
ament_lint_auto_find_test_dependencies()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
ament_package()
|
||||||
|
|
||||||
0
ros2/src/ydlidar_ros2_driver/LICENSE.txt
Normal file
0
ros2/src/ydlidar_ros2_driver/LICENSE.txt
Normal file
187
ros2/src/ydlidar_ros2_driver/README.md
Normal file
187
ros2/src/ydlidar_ros2_driver/README.md
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|

|
||||||
|
# YDLIDAR ROS2 Driver
|
||||||
|
|
||||||
|
ydlidar_ros2_driver is a new ros package, which is designed to gradually become the standard driver package for ydlidar devices in the ros2 environment.
|
||||||
|
|
||||||
|
## How to [install ROS2](https://index.ros.org/doc/ros2/Installation)
|
||||||
|
[ubuntu](https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Install-Debians/)
|
||||||
|
|
||||||
|
[windows](https://index.ros.org/doc/ros2/Installation/Dashing/Windows-Install-Binary/)
|
||||||
|
|
||||||
|
## How to Create a ROS2 workspace
|
||||||
|
[Create a workspace](https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial/#create-a-workspace)
|
||||||
|
|
||||||
|
|
||||||
|
## Compile & Install YDLidar SDK
|
||||||
|
|
||||||
|
ydlidar_ros2_driver depends on YDLidar-SDK library. If you have never installed YDLidar-SDK library or it is out of date, you must first install YDLidar-SDK library. If you have installed the latest version of YDLidar-SDK, skip this step and go to the next step.
|
||||||
|
|
||||||
|
1. Download or clone the [YDLIDAR/YDLidar-SDK](https://github.com/YDLIDAR/YDLidar-SDK) repository on GitHub.
|
||||||
|
2. Compile and install the YDLidar-SDK under the ***build*** directory following `README.md` of YDLIDAR/YDLidar-SDK.
|
||||||
|
|
||||||
|
## Clone ydlidar_ros2_driver
|
||||||
|
|
||||||
|
1. Clone ydlidar_ros2_driver package for github :
|
||||||
|
|
||||||
|
`git clone https://github.com/YDLIDAR/ydlidar_ros2_driver.git ydlidar_ros2_ws/src/ydlidar_ros2_driver`
|
||||||
|
|
||||||
|
2. Build ydlidar_ros2_driver package :
|
||||||
|
|
||||||
|
```
|
||||||
|
cd ydlidar_ros2_ws
|
||||||
|
colcon build --symlink-install
|
||||||
|
```
|
||||||
|
Note: install colcon [see](https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial/#install-colcon)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<font color=Red size=4>>Note: If the following error occurs, Please install [YDLIDAR/YDLidar-SDK](https://github.com/YDLIDAR/YDLidar-SDK) first.</font>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
3. Package environment setup :
|
||||||
|
|
||||||
|
`source ./install/setup.bash`
|
||||||
|
|
||||||
|
Note: Add permanent workspace environment variables.
|
||||||
|
It's convenientif the ROS2 environment variables are automatically added to your bash session every time a new shell is launched:
|
||||||
|
```
|
||||||
|
$echo "source ~/ydlidar_ros2_ws/install/setup.bash" >> ~/.bashrc
|
||||||
|
$source ~/.bashrc
|
||||||
|
```
|
||||||
|
4. Confirmation
|
||||||
|
To confirm that your package path has been set, printenv the `grep -i ROS` variable.
|
||||||
|
```
|
||||||
|
$ printenv | grep -i ROS
|
||||||
|
```
|
||||||
|
You should see something similar to:
|
||||||
|
`OLDPWD=/home/tony/ydlidar_ros2_ws/install`
|
||||||
|
|
||||||
|
5. Create serial port Alias [optional]
|
||||||
|
```
|
||||||
|
$chmod 0777 src/ydlidar_ros2_driver/startup/*
|
||||||
|
$sudo sh src/ydlidar_ros2_driver/startup/initenv.sh
|
||||||
|
```
|
||||||
|
Note: After completing the previous operation, replug the LiDAR again.
|
||||||
|
|
||||||
|
## Configure LiDAR [paramters](params/ydlidar.yaml)
|
||||||
|
```
|
||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 230400
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 9
|
||||||
|
abnormal_check_count: 4
|
||||||
|
resolution_fixed: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 64.0
|
||||||
|
range_min: 0.01
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run ydlidar_ros2_driver
|
||||||
|
|
||||||
|
##### Run ydlidar_ros2_driver using launch file
|
||||||
|
|
||||||
|
The command format is :
|
||||||
|
|
||||||
|
`ros2 launch ydlidar_ros2_driver [launch file].py`
|
||||||
|
|
||||||
|
1. Connect LiDAR uint(s).
|
||||||
|
```
|
||||||
|
ros2 launch ydlidar_ros2_driver ydlidar_launch.py
|
||||||
|
```
|
||||||
|
or
|
||||||
|
|
||||||
|
```
|
||||||
|
launch $(ros2 pkg prefix ydlidar_ros2_driver)/share/ydlidar_ros2_driver/launch/ydlidar.py
|
||||||
|
```
|
||||||
|
2. RVIZ
|
||||||
|
```
|
||||||
|
ros2 launch ydlidar_ros2_driver ydlidar_launch_view.py
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
3. echo scan topic
|
||||||
|
```
|
||||||
|
ros2 run ydlidar_ros2_driver ydlidar_ros2_driver_client or ros2 topic echo /scan
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Launch file introduction
|
||||||
|
|
||||||
|
The driver offers users a wealth of options when using different launch file. The launch file directory
|
||||||
|
|
||||||
|
is `"ydlidar_ros2_ws/src/ydlidar_ros2_driver/launch"`. All launch files are listed as below :
|
||||||
|
|
||||||
|
| launch file | features |
|
||||||
|
| ------------------------- | ------------------------------------------------------------ |
|
||||||
|
| ydlidar.py | Connect to defualt paramters<br/>Publish LaserScan message on `scan` topic |
|
||||||
|
| ydlidar_launch.py | Connect ydlidar.yaml Lidar specified by configuration parameters<br/>Publish LaserScan message on `scan` topic |
|
||||||
|
| ydlidar_launch_view.py | Connect ydlidar.yaml Lidar specified by configuration parameters and setup RVIZ<br/>Publish LaserScan message on `scan` topic |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Publish Topic
|
||||||
|
| Topic | Type | Description |
|
||||||
|
|----------------------|-------------------------|--------------------------------------------------|
|
||||||
|
| `scan` | sensor_msgs/LaserScan | 2D laser scan of the 0-angle ring |
|
||||||
|
|
||||||
|
## Subscribe Service
|
||||||
|
| Service | Type | Description |
|
||||||
|
|----------------------|-------------------------|--------------------------------------------------|
|
||||||
|
| `stop_scan` | std_srvs::Empty | turn off lidar |
|
||||||
|
| `start_scan` | std_srvs::Empty | turn on lidar |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Configure ydlidar_ros_driver internal parameter
|
||||||
|
|
||||||
|
The ydlidar_ros2_driver internal parameters are in the launch file, they are listed as below :
|
||||||
|
|
||||||
|
| Parameter name | Data Type | detail |
|
||||||
|
| -------------- | ------- | ------------------------------------------------------------ |
|
||||||
|
| port | string | Set Lidar the serial port or IP address <br/>it can be set to `/dev/ttyUSB0`, `192.168.1.11`, etc. <br/>default: `/dev/ydlidar` |
|
||||||
|
| frame_id | string | Lidar TF coordinate system name. <br/>default: `laser_frame` |
|
||||||
|
| ignore_array | string | LiDAR filtering angle area<br/>eg: `-90, -80, 30, 40` |
|
||||||
|
| baudrate | int | Lidar baudrate or network port. <br/>default: `230400` |
|
||||||
|
| lidar_type | int | Set lidar type <br/>0 -- TYPE_TOF<br/>1 -- TYPE_TRIANGLE<br/>2 -- TYPE_TOF_NET <br/>default: `1` |
|
||||||
|
| device_type | int | Set device type <br/>0 -- YDLIDAR_TYPE_SERIAL<br/>1 -- YDLIDAR_TYPE_TCP<br/>2 -- YDLIDAR_TYPE_UDP <br/>default: `0` |
|
||||||
|
| sample_rate | int | Set Lidar Sample Rate. <br/>default: `9` |
|
||||||
|
| abnormal_check_count | int | Set the number of abnormal startup data attempts. <br/>default: `4` |
|
||||||
|
| fixed_resolution | bool | Fixed angluar resolution. <br/>default: `true` |
|
||||||
|
| reversion | bool | Reversion LiDAR. <br/>default: `true` |
|
||||||
|
| inverted | bool | Inverted LiDAR.<br/>false -- ClockWise.<br/>true -- CounterClockWise <br/>default: `true` |
|
||||||
|
| auto_reconnect | bool | Automatically reconnect the LiDAR.<br/>true -- hot plug. <br/>default: `true` |
|
||||||
|
| isSingleChannel | bool | Whether LiDAR is a single-channel.<br/>default: `false` |
|
||||||
|
| intensity | bool | Whether LiDAR has intensity.<br/>true -- G2 LiDAR.<br/>default: `false` |
|
||||||
|
| support_motor_dtr | bool | Whether the Lidar can be started and stopped by Serial DTR.<br/>default: `false` |
|
||||||
|
| angle_min | float | Minimum Valid Angle.<br/>default: `-180` |
|
||||||
|
| angle_max | float | Maximum Valid Angle.<br/>default: `180` |
|
||||||
|
| range_min | float | Minimum Valid range.<br/>default: `0.1` |
|
||||||
|
| range_max | float | Maximum Valid range.<br/>default: `16.0` |
|
||||||
|
| frequency | float | Set Scanning Frequency.<br/>default: `10.0` |
|
||||||
|
| invalid_range_is_inf | bool | Invalid Range is inf.<br/>true -- inf.<br/>false -- 0.0.<br/>default: `false` |
|
||||||
|
More paramters details, see [here](details.md)
|
||||||
|
|
||||||
|
## Contact EAI
|
||||||
|

|
||||||
|
|
||||||
|
If you have any extra questions, please feel free to [contact us](http://www.ydlidar.cn/cn/contact)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
177
ros2/src/ydlidar_ros2_driver/config/ydlidar.rviz
Normal file
177
ros2/src/ydlidar_ros2_driver/config/ydlidar.rviz
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
Panels:
|
||||||
|
- Class: rviz_common/Displays
|
||||||
|
Help Height: 78
|
||||||
|
Name: Displays
|
||||||
|
Property Tree Widget:
|
||||||
|
Expanded:
|
||||||
|
- /Global Options1
|
||||||
|
- /Status1
|
||||||
|
- /LaserScan1/Topic1
|
||||||
|
Splitter Ratio: 0.5
|
||||||
|
Tree Height: 617
|
||||||
|
- Class: rviz_common/Selection
|
||||||
|
Name: Selection
|
||||||
|
- Class: rviz_common/Tool Properties
|
||||||
|
Expanded:
|
||||||
|
- /2D Goal Pose1
|
||||||
|
- /Publish Point1
|
||||||
|
Name: Tool Properties
|
||||||
|
Splitter Ratio: 0.5886790156364441
|
||||||
|
- Class: rviz_common/Views
|
||||||
|
Expanded:
|
||||||
|
- /Current View1
|
||||||
|
Name: Views
|
||||||
|
Splitter Ratio: 0.5
|
||||||
|
Visualization Manager:
|
||||||
|
Class: ""
|
||||||
|
Displays:
|
||||||
|
- Alpha: 0.5
|
||||||
|
Cell Size: 1
|
||||||
|
Class: rviz_default_plugins/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: <Fixed 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_default_plugins/LaserScan
|
||||||
|
Color: 239; 41; 41
|
||||||
|
Color Transformer: FlatColor
|
||||||
|
Decay Time: 0
|
||||||
|
Enabled: true
|
||||||
|
Invert Rainbow: false
|
||||||
|
Max Color: 255; 255; 255
|
||||||
|
Max Intensity: 1012
|
||||||
|
Min Color: 0; 0; 0
|
||||||
|
Min Intensity: 1008
|
||||||
|
Name: LaserScan
|
||||||
|
Position Transformer: XYZ
|
||||||
|
Selectable: true
|
||||||
|
Size (Pixels): 3
|
||||||
|
Size (m): 0.05999999865889549
|
||||||
|
Style: Flat Squares
|
||||||
|
Topic:
|
||||||
|
Depth: 5
|
||||||
|
Durability Policy: Volatile
|
||||||
|
History Policy: Keep Last
|
||||||
|
Reliability Policy: System Default
|
||||||
|
Value: /scan
|
||||||
|
Use Fixed Frame: true
|
||||||
|
Use rainbow: true
|
||||||
|
Value: true
|
||||||
|
- Class: rviz_default_plugins/TF
|
||||||
|
Enabled: true
|
||||||
|
Frame Timeout: 15
|
||||||
|
Frames:
|
||||||
|
All Enabled: true
|
||||||
|
base_link:
|
||||||
|
Value: true
|
||||||
|
laser_frame:
|
||||||
|
Value: true
|
||||||
|
Marker Scale: 1
|
||||||
|
Name: TF
|
||||||
|
Show Arrows: true
|
||||||
|
Show Axes: true
|
||||||
|
Show Names: false
|
||||||
|
Tree:
|
||||||
|
base_link:
|
||||||
|
laser_frame:
|
||||||
|
{}
|
||||||
|
Update Interval: 0
|
||||||
|
Value: true
|
||||||
|
Enabled: true
|
||||||
|
Global Options:
|
||||||
|
Background Color: 48; 48; 48
|
||||||
|
Fixed Frame: laser_frame
|
||||||
|
Frame Rate: 30
|
||||||
|
Name: root
|
||||||
|
Tools:
|
||||||
|
- Class: rviz_default_plugins/Interact
|
||||||
|
Hide Inactive Objects: true
|
||||||
|
- Class: rviz_default_plugins/MoveCamera
|
||||||
|
- Class: rviz_default_plugins/Select
|
||||||
|
- Class: rviz_default_plugins/FocusCamera
|
||||||
|
- Class: rviz_default_plugins/Measure
|
||||||
|
Line color: 128; 128; 0
|
||||||
|
- Class: rviz_default_plugins/SetInitialPose
|
||||||
|
Topic:
|
||||||
|
Depth: 5
|
||||||
|
Durability Policy: Volatile
|
||||||
|
History Policy: Keep Last
|
||||||
|
Reliability Policy: Reliable
|
||||||
|
Value: /initialpose
|
||||||
|
- Class: rviz_default_plugins/SetGoal
|
||||||
|
Topic:
|
||||||
|
Depth: 5
|
||||||
|
Durability Policy: Volatile
|
||||||
|
History Policy: Keep Last
|
||||||
|
Reliability Policy: Reliable
|
||||||
|
Value: /goal_pose
|
||||||
|
- Class: rviz_default_plugins/PublishPoint
|
||||||
|
Single click: true
|
||||||
|
Topic:
|
||||||
|
Depth: 5
|
||||||
|
Durability Policy: Volatile
|
||||||
|
History Policy: Keep Last
|
||||||
|
Reliability Policy: Reliable
|
||||||
|
Value: /clicked_point
|
||||||
|
Transformation:
|
||||||
|
Current:
|
||||||
|
Class: rviz_default_plugins/TF
|
||||||
|
Value: true
|
||||||
|
Views:
|
||||||
|
Current:
|
||||||
|
Class: rviz_default_plugins/Orbit
|
||||||
|
Distance: 10
|
||||||
|
Enable Stereo Rendering:
|
||||||
|
Stereo Eye Separation: 0.05999999865889549
|
||||||
|
Stereo Focal Distance: 1
|
||||||
|
Swap Stereo Eyes: false
|
||||||
|
Value: false
|
||||||
|
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.5103975534439087
|
||||||
|
Target Frame: <Fixed Frame>
|
||||||
|
Value: Orbit (rviz)
|
||||||
|
Yaw: 6.163581848144531
|
||||||
|
Saved: ~
|
||||||
|
Window Geometry:
|
||||||
|
Displays:
|
||||||
|
collapsed: false
|
||||||
|
Height: 846
|
||||||
|
Hide Left Dock: false
|
||||||
|
Hide Right Dock: false
|
||||||
|
QMainWindow State: 000000ff00000000fd000000040000000000000156000002f4fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d000002f4000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002f4fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d000002f4000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004420000003efc0100000002fb0000000800540069006d00650100000000000004420000000000000000fb0000000800540069006d006501000000000000045000000000000000000000023f000002f400000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
|
||||||
|
Selection:
|
||||||
|
collapsed: false
|
||||||
|
Tool Properties:
|
||||||
|
collapsed: false
|
||||||
|
Views:
|
||||||
|
collapsed: false
|
||||||
|
Width: 1200
|
||||||
|
X: 67
|
||||||
|
Y: 60
|
||||||
133
ros2/src/ydlidar_ros2_driver/details.md
Normal file
133
ros2/src/ydlidar_ros2_driver/details.md
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
# ROS Paramters Table
|
||||||
|
|
||||||
|
## Dataset
|
||||||
|
<table>
|
||||||
|
<tr><th>LIDAR <th> Model <th> Baudrate <th> SampleRate(K) <th> Range(m) <th> Frequency(HZ) <th> Intenstiy(bit) <th> SingleChannel<th> voltage(V)
|
||||||
|
<tr><th> F4 <td> 1 <td> 115200 <td> 4 <td> 0.12~12 <td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> S4 <td> 4 <td> 115200 <td> 4 <td> 0.10~8.0 <td> 5~12 (PWM) <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> S4B <td> 4/11 <td> 153600 <td> 4 <td> 0.10~8.0 <td> 5~12(PWM) <td> true(8) <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> S2 <td> 4/12 <td> 115200 <td> 3 <td> 0.10~8.0 <td> 4~8(PWM) <td> false <td> true <td> 4.8~5.2
|
||||||
|
<tr><th> G4 <td> 5 <td> 230400 <td> 9/8/4 <td> 0.28/0.26/0.1~16<td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> X4 <td> 6 <td> 128000 <td> 5 <td> 0.12~10 <td> 5~12(PWM) <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> X2/X2L <td> 6 <td> 115200 <td> 3 <td> 0.10~8.0 <td> 4~8(PWM) <td> false <td> true <td> 4.8~5.2
|
||||||
|
<tr><th> G4PRO <td> 7 <td> 230400 <td> 9/8/4 <td> 0.28/0.26/0.1~16<td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> F4PRO <td> 8 <td> 230400 <td> 4/6 <td> 0.12~12 <td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> R2 <td> 9 <td> 230400 <td> 5 <td> 0.12~16 <td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G6 <td> 13 <td> 512000 <td> 18/16/8 <td> 0.28/0.26/0.1~25<td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G2A <td> 14 <td> 230400 <td> 5 <td> 0.12~12 <td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G2 <td> 15 <td> 230400 <td> 5 <td> 0.28~16 <td> 5~12 <td> true(8) <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G2C <td> 16 <td> 115200 <td> 4 <td> 0.1~12 <td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G4B <td> 17 <td> 512000 <td> 10 <td> 0.12~16 <td> 5~12 <td> true(10) <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G4C <td> 18 <td> 115200 <td> 4 <td> 0.1~12 <td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G1 <td> 19 <td> 230400 <td> 9 <td> 0.28~16 <td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G5 <td> 20 <td> 230400 <td> 9/8/4 <td> 0.28/0.26/0.1~16<td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> G7 <td> 21 <td> 512000 <td> 18/16/8 <td> 0.28/0.26/0.1~25<td> 5~12 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> TX8 <td> 100 <td> 115200 <td> 4 <td> 0.05~8 <td> 4~8(PWM) <td> false <td> true <td> 4.8~5.2
|
||||||
|
<tr><th> TX20 <td> 100 <td> 115200 <td> 4 <td> 0.05~20 <td> 4~8(PWM) <td> false <td> true <td> 4.8~5.2
|
||||||
|
<tr><th> TG15 <td> 100 <td> 512000 <td> 20/18/10 <td> 0.05~30 <td> 3~16 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> TG30 <td> 101 <td> 512000 <td> 20/18/10 <td> 0.05~30 <td> 3~16 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> TG50 <td> 102 <td> 512000 <td> 20/18/10 <td> 0.05~50 <td> 3~16 <td> false <td> false <td> 4.8~5.2
|
||||||
|
<tr><th> T15 <td> 200 <td> 8000 <td> 20 <td> 0.05~30 <td> 5~35 <td> true <td> false <td> 4.8~5.2
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Baudrate Table
|
||||||
|
|
||||||
|
| LiDAR | baudrate |
|
||||||
|
|-----------------------------------------------|-----------------------|
|
||||||
|
|F4/S2/X2/X2L/S4/TX8/TX20/G4C | 115200 |
|
||||||
|
|X4 | 128000 |
|
||||||
|
|S4B | 153600 |
|
||||||
|
|G1/G2/R2/G4/G5/G4PRO/F4PRO | 230400 |
|
||||||
|
|G6/G7/TG15/TG30/TG50 | 512000 |
|
||||||
|
|T5/T15 | 8000 (network port) |
|
||||||
|
|
||||||
|
|
||||||
|
## SingleChannel Table
|
||||||
|
|
||||||
|
| LiDAR | isSingleChannel |
|
||||||
|
|-----------------------------------------------------------|-----------------------|
|
||||||
|
|G1/G2/G4/G5/G6/G7/F4/F4PRO/S4/S4B/X4/R2/G4C | false |
|
||||||
|
|S2/X2/X2L | true |
|
||||||
|
|TG15/TG30/TG50 | false |
|
||||||
|
|TX8/TX20 | true |
|
||||||
|
|T5/T15 | false (optional) |
|
||||||
|
|
||||||
|
|
||||||
|
## LidarType Table
|
||||||
|
|
||||||
|
| LiDAR | lidar_type |
|
||||||
|
|-----------------------------------------------------------------------|-----------------------|
|
||||||
|
|G1/G2/G4/G5/G6/G7/F4/F4PRO/S4/S4B/X4/R2/G4C/S2/X2/X2L | TYPE_TRIANGLE |
|
||||||
|
|TG15/TG30/TG50/TX8/TX20 | TYPE_TOF |
|
||||||
|
|T5/T15 | TYPE_TOF_NET |
|
||||||
|
|
||||||
|
## DeviceType Table
|
||||||
|
|
||||||
|
| LiDAR | lidar_type |
|
||||||
|
|-----------------------------------------------------------------------|-----------------------|
|
||||||
|
|G1/G2/G4/G5/G6/G7/F4/F4PRO/S4/S4B/X4/R2/G4C/S2/X2/X2L | YDLIDAR_TYPE_SERIAL |
|
||||||
|
|TG15/TG30/TG50/TX8/TX20 | YDLIDAR_TYPE_SERIAL |
|
||||||
|
|T5/T15 | YDLIDAR_TYPE_TCP |
|
||||||
|
|
||||||
|
|
||||||
|
## Sampling Rate Table
|
||||||
|
|
||||||
|
| LiDAR | sample_rate |
|
||||||
|
|-----------------------------|------------------------|
|
||||||
|
|G4/G5/F4 | 4,8,9 |
|
||||||
|
|F4PRO | 4,6 |
|
||||||
|
|G6/G7 | 8,16,18 |
|
||||||
|
|G2/R2/X4 | 5 |
|
||||||
|
|G1 | 9 |
|
||||||
|
|S4/S4B/G4C/TX8/TX20 | 4 |
|
||||||
|
|S2 | 3 |
|
||||||
|
|TG15/TG30/TG50 | 10,18,20 |
|
||||||
|
|T5/T15 | 20 |
|
||||||
|
|
||||||
|
|
||||||
|
## Frequency Table
|
||||||
|
|
||||||
|
| LiDAR | frequency |
|
||||||
|
|-----------------------------------------------|------------------------|
|
||||||
|
|G1/G2/R2/G6/G7/G4/G5/G4PRO/F4/F4PRO | 5-12Hz |
|
||||||
|
|S4/S4B/S2/TX8/TX20/X4 | Not Support |
|
||||||
|
|TG15/TG30/TG50 | 3-16Hz |
|
||||||
|
|T5/T15 | 5-35Hz |
|
||||||
|
|
||||||
|
Note: For unsupported LiDARs, adjusting the scanning frequency requires external access to PWM speed control.
|
||||||
|
|
||||||
|
## Reversion Table
|
||||||
|
<table>
|
||||||
|
<tr><th>LiDAR <th>reversion
|
||||||
|
<tr><th>G1/G2/G2A/G2C/F4/F4PRO/R2 <td>true
|
||||||
|
<tr><th>G4/G5/G4PRO/G4B/G4C/G6/G7 <td>true
|
||||||
|
<tr><th>TG15/TG30/TG50 <td>true
|
||||||
|
<tr><th>T5/T15 <td>true
|
||||||
|
<tr><th>S2/X2/X2L/X4/S4/S4B <td>false
|
||||||
|
<tr><th>TX8/TX20 <td>false
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## Intensity Table
|
||||||
|
<table>
|
||||||
|
<tr><th>LiDAR <th>intensity
|
||||||
|
<tr><th>S4B/G2/G4B <td>true
|
||||||
|
<tr><th>G4/G5/G4C/G4PRO/F4/F4PRO/G6/G7 <td>false
|
||||||
|
<tr><th>G1/G2A/G2C/R2 <td>false
|
||||||
|
<tr><th>S2/X2/X2L/X4 <td>false
|
||||||
|
<tr><th>TG15/TG30/TG50 <td>false
|
||||||
|
<tr><th>TX8/TX20 <td>false
|
||||||
|
<tr><th>T5/T15 <td>true
|
||||||
|
<tr><th> <td>false
|
||||||
|
</table>
|
||||||
|
|
||||||
|
## DTR Support Table
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th>LiDAR <th>support_motor_dtr
|
||||||
|
<tr><th>S4/S4B/S2/X2/X2L/X4 <td>true
|
||||||
|
<tr><th>TX8/TX20 <td>true
|
||||||
|
<tr><th>G4/G5/G4C/G4PRO/F4/F4PRO/G6/G7 <td>false
|
||||||
|
<tr><th>G1/G2A/G2C/R2/G2/G4B <td>false
|
||||||
|
<tr><th>TG15/TG30/TG50 <td>false
|
||||||
|
<tr><th>T5/T15 <td>false
|
||||||
|
</table>
|
||||||
BIN
ros2/src/ydlidar_ros2_driver/images/EAI.png
Normal file
BIN
ros2/src/ydlidar_ros2_driver/images/EAI.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 515 KiB |
BIN
ros2/src/ydlidar_ros2_driver/images/YDLidar.jpg
Normal file
BIN
ros2/src/ydlidar_ros2_driver/images/YDLidar.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
BIN
ros2/src/ydlidar_ros2_driver/images/cmake_error.png
Normal file
BIN
ros2/src/ydlidar_ros2_driver/images/cmake_error.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
BIN
ros2/src/ydlidar_ros2_driver/images/finished.png
Normal file
BIN
ros2/src/ydlidar_ros2_driver/images/finished.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
BIN
ros2/src/ydlidar_ros2_driver/images/rviz.png
Normal file
BIN
ros2/src/ydlidar_ros2_driver/images/rviz.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
BIN
ros2/src/ydlidar_ros2_driver/images/view.png
Normal file
BIN
ros2/src/ydlidar_ros2_driver/images/view.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 128 KiB |
29
ros2/src/ydlidar_ros2_driver/launch/ydlidar.py
Normal file
29
ros2/src/ydlidar_ros2_driver/launch/ydlidar.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
from launch.exit_handler import ignore_exit_handler, restart_exit_handler
|
||||||
|
from ros2run.api import get_executable_path
|
||||||
|
|
||||||
|
|
||||||
|
def launch(launch_descriptor, argv):
|
||||||
|
ld = launch_descriptor
|
||||||
|
package = 'ydlidar_ros2_driver'
|
||||||
|
ld.add_process(
|
||||||
|
cmd=[get_executable_path(package_name=package, executable_name='ydlidar_ros2_driver_node')],
|
||||||
|
name='ydlidar_ros2_driver_node',
|
||||||
|
exit_handler=restart_exit_handler,
|
||||||
|
)
|
||||||
|
package = 'tf2_ros'
|
||||||
|
ld.add_process(
|
||||||
|
# The XYZ/Quat numbers for base_link -> laser_frame are taken from the
|
||||||
|
# turtlebot URDF in
|
||||||
|
# https://github.com/turtlebot/turtlebot/blob/931d045/turtlebot_description/urdf/sensors/astra.urdf.xacro
|
||||||
|
cmd=[
|
||||||
|
get_executable_path(
|
||||||
|
package_name=package, executable_name='static_transform_publisher'),
|
||||||
|
'0', '0', '0.02',
|
||||||
|
'0', '0', '0', '1',
|
||||||
|
'base_link',
|
||||||
|
'laser_frame'
|
||||||
|
],
|
||||||
|
name='static_tf_pub_laser',
|
||||||
|
exit_handler=restart_exit_handler,
|
||||||
|
)
|
||||||
|
return ld
|
||||||
56
ros2/src/ydlidar_ros2_driver/launch/ydlidar_launch.py
Normal file
56
ros2/src/ydlidar_ros2_driver/launch/ydlidar_launch.py
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
# Copyright 2020, EAIBOT
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from ament_index_python.packages import get_package_share_directory
|
||||||
|
|
||||||
|
from launch import LaunchDescription
|
||||||
|
from launch_ros.actions import LifecycleNode
|
||||||
|
from launch_ros.actions import Node
|
||||||
|
from launch.actions import DeclareLaunchArgument
|
||||||
|
from launch.substitutions import LaunchConfiguration
|
||||||
|
from launch.actions import LogInfo
|
||||||
|
|
||||||
|
import lifecycle_msgs.msg
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def generate_launch_description():
|
||||||
|
share_dir = get_package_share_directory('ydlidar_ros2_driver')
|
||||||
|
parameter_file = LaunchConfiguration('params_file')
|
||||||
|
node_name = 'ydlidar_ros2_driver_node'
|
||||||
|
|
||||||
|
params_declare = DeclareLaunchArgument('params_file',
|
||||||
|
default_value=os.path.join(
|
||||||
|
share_dir, 'params', 'TminiPro.yaml'),
|
||||||
|
description='FPath to the ROS2 parameters file to use.')
|
||||||
|
|
||||||
|
driver_node = LifecycleNode(package='ydlidar_ros2_driver',
|
||||||
|
executable='ydlidar_ros2_driver_node',
|
||||||
|
name='ydlidar_ros2_driver_node',
|
||||||
|
output='screen',
|
||||||
|
emulate_tty=True,
|
||||||
|
parameters=[parameter_file],
|
||||||
|
namespace='/',
|
||||||
|
)
|
||||||
|
# tf2_node = Node(package='tf2_ros',
|
||||||
|
# executable='static_transform_publisher',
|
||||||
|
# name='static_tf_pub_laser',
|
||||||
|
# arguments=['0', '0', '0.00','0', '0', '0', '1','base_link','laser_frame'],
|
||||||
|
# )
|
||||||
|
|
||||||
|
return LaunchDescription([
|
||||||
|
params_declare,
|
||||||
|
driver_node,
|
||||||
|
# tf2_node,
|
||||||
|
])
|
||||||
63
ros2/src/ydlidar_ros2_driver/launch/ydlidar_launch_view.py
Normal file
63
ros2/src/ydlidar_ros2_driver/launch/ydlidar_launch_view.py
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
# Copyright 2020, EAIBOTd
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from ament_index_python.packages import get_package_share_directory
|
||||||
|
|
||||||
|
from launch import LaunchDescription
|
||||||
|
from launch_ros.actions import LifecycleNode
|
||||||
|
from launch_ros.actions import Node
|
||||||
|
from launch.actions import DeclareLaunchArgument
|
||||||
|
from launch.substitutions import LaunchConfiguration
|
||||||
|
from launch.actions import LogInfo
|
||||||
|
|
||||||
|
import lifecycle_msgs.msg
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def generate_launch_description():
|
||||||
|
share_dir = get_package_share_directory('ydlidar_ros2_driver')
|
||||||
|
rviz_config_file = os.path.join(share_dir, 'config','ydlidar.rviz')
|
||||||
|
parameter_file = LaunchConfiguration('params_file')
|
||||||
|
node_name = 'ydlidar_ros2_driver_node'
|
||||||
|
|
||||||
|
params_declare = DeclareLaunchArgument('params_file',
|
||||||
|
default_value=os.path.join(
|
||||||
|
share_dir, 'params', 'TminiPro.yaml'),
|
||||||
|
description='FPath to the ROS2 parameters file to use.')
|
||||||
|
|
||||||
|
driver_node = LifecycleNode(package='ydlidar_ros2_driver',
|
||||||
|
executable='ydlidar_ros2_driver_node',
|
||||||
|
name='ydlidar_ros2_driver_node',
|
||||||
|
output='screen',
|
||||||
|
emulate_tty=True,
|
||||||
|
parameters=[parameter_file],
|
||||||
|
namespace='/',
|
||||||
|
)
|
||||||
|
tf2_node = Node(package='tf2_ros',
|
||||||
|
executable='static_transform_publisher',
|
||||||
|
name='static_tf_pub_laser',
|
||||||
|
arguments=['0', '0', '0.02','0', '0', '0', '1','base_link','laser_frame'],
|
||||||
|
)
|
||||||
|
# rviz2_node = Node(package='rviz2',
|
||||||
|
# executable='rviz2',
|
||||||
|
# name='rviz2',
|
||||||
|
# arguments=['-d', rviz_config_file],
|
||||||
|
# )
|
||||||
|
|
||||||
|
return LaunchDescription([
|
||||||
|
params_declare,
|
||||||
|
driver_node,
|
||||||
|
tf2_node,
|
||||||
|
#rviz2_node,
|
||||||
|
])
|
||||||
33
ros2/src/ydlidar_ros2_driver/package.xml
Normal file
33
ros2/src/ydlidar_ros2_driver/package.xml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||||
|
<package format="2">
|
||||||
|
<name>ydlidar_ros2_driver</name>
|
||||||
|
<version>1.0.1</version>
|
||||||
|
<description>
|
||||||
|
The ROS2 device driver for YDLIDAR LIDARS
|
||||||
|
</description>
|
||||||
|
<maintainer email="support@ydlidar.com">Tony</maintainer>
|
||||||
|
<license>MIT</license>
|
||||||
|
|
||||||
|
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||||
|
|
||||||
|
<build_depend>rclcpp</build_depend>
|
||||||
|
<build_depend>sensor_msgs</build_depend>
|
||||||
|
<build_depend>visualization_msgs</build_depend>
|
||||||
|
<build_depend>geometry_msgs</build_depend>
|
||||||
|
<build_depend>std_srvs</build_depend>
|
||||||
|
|
||||||
|
<exec_depend>rclcpp</exec_depend>
|
||||||
|
<exec_depend>sensor_msgs</exec_depend>
|
||||||
|
<exec_depend>visualization_msgs</exec_depend>
|
||||||
|
<exec_depend>geometry_msgs</exec_depend>
|
||||||
|
<exec_depend>std_srvs</exec_depend>
|
||||||
|
|
||||||
|
<test_depend>ament_cmake_gtest</test_depend>
|
||||||
|
<test_depend>ament_lint_auto</test_depend>
|
||||||
|
<test_depend>ament_lint_common</test_depend>
|
||||||
|
|
||||||
|
<export>
|
||||||
|
<build_type>ament_cmake</build_type>
|
||||||
|
</export>
|
||||||
|
</package>
|
||||||
23
ros2/src/ydlidar_ros2_driver/params/G1.yaml
Normal file
23
ros2/src/ydlidar_ros2_driver/params/G1.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 230400
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 9
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 16.0
|
||||||
|
range_min: 0.1
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
24
ros2/src/ydlidar_ros2_driver/params/G2.yaml
Normal file
24
ros2/src/ydlidar_ros2_driver/params/G2.yaml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 230400
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 4
|
||||||
|
intensity_bit: 10
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: true
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 16.0
|
||||||
|
range_min: 0.1
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
23
ros2/src/ydlidar_ros2_driver/params/G6.yaml
Normal file
23
ros2/src/ydlidar_ros2_driver/params/G6.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 512000
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 18
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 25.0
|
||||||
|
range_min: 0.1
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
24
ros2/src/ydlidar_ros2_driver/params/GS2.yaml
Normal file
24
ros2/src/ydlidar_ros2_driver/params/GS2.yaml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 921600
|
||||||
|
lidar_type: 3
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 9
|
||||||
|
intensity_bit: 0
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 1.0
|
||||||
|
range_min: 0.025
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
23
ros2/src/ydlidar_ros2_driver/params/TEA.yaml
Normal file
23
ros2/src/ydlidar_ros2_driver/params/TEA.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: 192.168.0.11
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 8090
|
||||||
|
lidar_type: 0
|
||||||
|
device_type: 1
|
||||||
|
sample_rate: 20
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: true
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 50.0
|
||||||
|
range_min: 0.01
|
||||||
|
frequency: 20.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
23
ros2/src/ydlidar_ros2_driver/params/TG.yaml
Normal file
23
ros2/src/ydlidar_ros2_driver/params/TG.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 512000
|
||||||
|
lidar_type: 0
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 20
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 50.0
|
||||||
|
range_min: 0.01
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
24
ros2/src/ydlidar_ros2_driver/params/TminiPro.yaml
Normal file
24
ros2/src/ydlidar_ros2_driver/params/TminiPro.yaml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttylzulaser
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 230400
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 4
|
||||||
|
intensity_bit: 8
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: true
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 12.0
|
||||||
|
range_min: 0.10
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: true
|
||||||
23
ros2/src/ydlidar_ros2_driver/params/X2.yaml
Normal file
23
ros2/src/ydlidar_ros2_driver/params/X2.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 115200
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 3
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: true
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: true
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 12.0
|
||||||
|
range_min: 0.1
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
23
ros2/src/ydlidar_ros2_driver/params/X4-Pro.yaml
Normal file
23
ros2/src/ydlidar_ros2_driver/params/X4-Pro.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 128000
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 5
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: true
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 12.0
|
||||||
|
range_min: 0.1
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
23
ros2/src/ydlidar_ros2_driver/params/X4.yaml
Normal file
23
ros2/src/ydlidar_ros2_driver/params/X4.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 128000
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 5
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: true
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 12.0
|
||||||
|
range_min: 0.1
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
24
ros2/src/ydlidar_ros2_driver/params/ydlidar.yaml
Normal file
24
ros2/src/ydlidar_ros2_driver/params/ydlidar.yaml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
ydlidar_ros2_driver_node:
|
||||||
|
ros__parameters:
|
||||||
|
port: /dev/ttyUSB0
|
||||||
|
frame_id: laser_frame
|
||||||
|
ignore_array: ""
|
||||||
|
baudrate: 230400
|
||||||
|
lidar_type: 1
|
||||||
|
device_type: 0
|
||||||
|
sample_rate: 9
|
||||||
|
intensity_bit: 0
|
||||||
|
abnormal_check_count: 4
|
||||||
|
fixed_resolution: true
|
||||||
|
reversion: true
|
||||||
|
inverted: true
|
||||||
|
auto_reconnect: true
|
||||||
|
isSingleChannel: false
|
||||||
|
intensity: false
|
||||||
|
support_motor_dtr: false
|
||||||
|
angle_max: 180.0
|
||||||
|
angle_min: -180.0
|
||||||
|
range_max: 64.0
|
||||||
|
range_min: 0.01
|
||||||
|
frequency: 10.0
|
||||||
|
invalid_range_is_inf: false
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* YDLIDAR SYSTEM
|
||||||
|
* YDLIDAR ROS 2 Node Client
|
||||||
|
*
|
||||||
|
* Copyright 2017 - 2020 EAI TEAM
|
||||||
|
* http://www.eaibot.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "rclcpp/rclcpp.hpp"
|
||||||
|
#include "sensor_msgs/msg/laser_scan.hpp"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define RAD2DEG(x) ((x)*180./M_PI)
|
||||||
|
|
||||||
|
static void scanCb(sensor_msgs::msg::LaserScan::SharedPtr scan) {
|
||||||
|
int count = scan->scan_time / scan->time_increment;
|
||||||
|
printf("[YDLIDAR INFO]: I heard a laser scan %s[%d]:\n", scan->header.frame_id.c_str(), count);
|
||||||
|
printf("[YDLIDAR INFO]: angle_range : [%f, %f]\n", RAD2DEG(scan->angle_min),
|
||||||
|
RAD2DEG(scan->angle_max));
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
float degree = RAD2DEG(scan->angle_min + scan->angle_increment * i);
|
||||||
|
printf("[YDLIDAR INFO]: angle-distance : [%f, %f]\n", degree, scan->ranges[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
rclcpp::init(argc, argv);
|
||||||
|
|
||||||
|
auto node = rclcpp::Node::make_shared("ydlidar_ros2_driver_client");
|
||||||
|
|
||||||
|
auto lidar_info_sub = node->create_subscription<sensor_msgs::msg::LaserScan>(
|
||||||
|
"scan", rclcpp::SensorDataQoS(), scanCb);
|
||||||
|
|
||||||
|
rclcpp::spin(node);
|
||||||
|
|
||||||
|
rclcpp::shutdown();
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
266
ros2/src/ydlidar_ros2_driver/src/ydlidar_ros2_driver_node.cpp
Normal file
266
ros2/src/ydlidar_ros2_driver/src/ydlidar_ros2_driver_node.cpp
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
/*
|
||||||
|
* YDLIDAR SYSTEM
|
||||||
|
* YDLIDAR ROS 2 Node
|
||||||
|
*
|
||||||
|
* Copyright 2017 - 2020 EAI TEAM
|
||||||
|
* http://www.eaibot.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#ifndef _USE_MATH_DEFINES
|
||||||
|
#define _USE_MATH_DEFINES
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "src/CYdLidar.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <chrono>
|
||||||
|
#include <iostream>
|
||||||
|
#include <memory>
|
||||||
|
#include "sensor_msgs/msg/point_cloud.hpp"
|
||||||
|
#include "rclcpp/clock.hpp"
|
||||||
|
#include "rclcpp/rclcpp.hpp"
|
||||||
|
#include "rclcpp/time_source.hpp"
|
||||||
|
#include "sensor_msgs/msg/laser_scan.hpp"
|
||||||
|
#include "std_srvs/srv/empty.hpp"
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
#define ROS2Verision "1.0.1"
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
rclcpp::init(argc, argv);
|
||||||
|
|
||||||
|
auto node = rclcpp::Node::make_shared("ydlidar_ros2_driver_node");
|
||||||
|
|
||||||
|
RCLCPP_INFO(node->get_logger(), "[YDLIDAR INFO] Current ROS Driver Version: %s\n", ((std::string)ROS2Verision).c_str());
|
||||||
|
|
||||||
|
CYdLidar laser;
|
||||||
|
std::string str_optvalue = "/dev/ydlidar";
|
||||||
|
node->declare_parameter("port", str_optvalue);
|
||||||
|
node->get_parameter("port", str_optvalue);
|
||||||
|
///lidar port
|
||||||
|
laser.setlidaropt(LidarPropSerialPort, str_optvalue.c_str(), str_optvalue.size());
|
||||||
|
|
||||||
|
///ignore array
|
||||||
|
str_optvalue = "";
|
||||||
|
node->declare_parameter("ignore_array", str_optvalue);
|
||||||
|
node->get_parameter("ignore_array", str_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropIgnoreArray, str_optvalue.c_str(), str_optvalue.size());
|
||||||
|
|
||||||
|
std::string frame_id = "laser_frame";
|
||||||
|
node->declare_parameter("frame_id", frame_id);
|
||||||
|
node->get_parameter("frame_id", frame_id);
|
||||||
|
|
||||||
|
//////////////////////int property/////////////////
|
||||||
|
/// lidar baudrate
|
||||||
|
int optval = 230400;
|
||||||
|
node->declare_parameter("baudrate", optval);
|
||||||
|
node->get_parameter("baudrate", optval);
|
||||||
|
laser.setlidaropt(LidarPropSerialBaudrate, &optval, sizeof(int));
|
||||||
|
/// tof lidar
|
||||||
|
optval = TYPE_TRIANGLE;
|
||||||
|
node->declare_parameter("lidar_type", optval);
|
||||||
|
node->get_parameter("lidar_type", optval);
|
||||||
|
laser.setlidaropt(LidarPropLidarType, &optval, sizeof(int));
|
||||||
|
/// device type
|
||||||
|
optval = YDLIDAR_TYPE_SERIAL;
|
||||||
|
node->declare_parameter("device_type", optval);
|
||||||
|
node->get_parameter("device_type", optval);
|
||||||
|
laser.setlidaropt(LidarPropDeviceType, &optval, sizeof(int));
|
||||||
|
/// sample rate
|
||||||
|
optval = 9;
|
||||||
|
node->declare_parameter("sample_rate", optval);
|
||||||
|
node->get_parameter("sample_rate", optval);
|
||||||
|
laser.setlidaropt(LidarPropSampleRate, &optval, sizeof(int));
|
||||||
|
/// abnormal count
|
||||||
|
optval = 4;
|
||||||
|
node->declare_parameter("abnormal_check_count", optval);
|
||||||
|
node->get_parameter("abnormal_check_count", optval);
|
||||||
|
laser.setlidaropt(LidarPropAbnormalCheckCount, &optval, sizeof(int));
|
||||||
|
|
||||||
|
/// Intenstiy bit count
|
||||||
|
optval = 8;
|
||||||
|
node->declare_parameter("intensity_bit", optval);
|
||||||
|
node->get_parameter("intensity_bit", optval);
|
||||||
|
laser.setlidaropt(LidarPropIntenstiyBit, &optval, sizeof(int));
|
||||||
|
|
||||||
|
//////////////////////bool property/////////////////
|
||||||
|
/// fixed angle resolution
|
||||||
|
bool b_optvalue = false;
|
||||||
|
node->declare_parameter("fixed_resolution", b_optvalue);
|
||||||
|
node->get_parameter("fixed_resolution", b_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropFixedResolution, &b_optvalue, sizeof(bool));
|
||||||
|
/// rotate 180
|
||||||
|
b_optvalue = true;
|
||||||
|
node->declare_parameter("reversion", b_optvalue);
|
||||||
|
node->get_parameter("reversion", b_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropReversion, &b_optvalue, sizeof(bool));
|
||||||
|
/// Counterclockwise
|
||||||
|
b_optvalue = true;
|
||||||
|
node->declare_parameter("inverted", b_optvalue);
|
||||||
|
node->get_parameter("inverted", b_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropInverted, &b_optvalue, sizeof(bool));
|
||||||
|
b_optvalue = true;
|
||||||
|
node->declare_parameter("auto_reconnect", b_optvalue);
|
||||||
|
node->get_parameter("auto_reconnect", b_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropAutoReconnect, &b_optvalue, sizeof(bool));
|
||||||
|
/// one-way communication
|
||||||
|
b_optvalue = false;
|
||||||
|
node->declare_parameter("isSingleChannel", b_optvalue);
|
||||||
|
node->get_parameter("isSingleChannel", b_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropSingleChannel, &b_optvalue, sizeof(bool));
|
||||||
|
/// intensity
|
||||||
|
b_optvalue = false;
|
||||||
|
node->declare_parameter("intensity", b_optvalue);
|
||||||
|
node->get_parameter("intensity", b_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropIntenstiy, &b_optvalue, sizeof(bool));
|
||||||
|
/// Motor DTR
|
||||||
|
b_optvalue = false;
|
||||||
|
node->declare_parameter("support_motor_dtr", b_optvalue);
|
||||||
|
node->get_parameter("support_motor_dtr", b_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropSupportMotorDtrCtrl, &b_optvalue, sizeof(bool));
|
||||||
|
|
||||||
|
//////////////////////float property/////////////////
|
||||||
|
/// unit: °
|
||||||
|
float f_optvalue = 180.0f;
|
||||||
|
node->declare_parameter("angle_max", f_optvalue);
|
||||||
|
node->get_parameter("angle_max", f_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropMaxAngle, &f_optvalue, sizeof(float));
|
||||||
|
f_optvalue = -180.0f;
|
||||||
|
node->declare_parameter("angle_min", f_optvalue);
|
||||||
|
node->get_parameter("angle_min", f_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropMinAngle, &f_optvalue, sizeof(float));
|
||||||
|
/// unit: m
|
||||||
|
f_optvalue = 64.f;
|
||||||
|
node->declare_parameter("range_max", f_optvalue);
|
||||||
|
node->get_parameter("range_max", f_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropMaxRange, &f_optvalue, sizeof(float));
|
||||||
|
f_optvalue = 0.1f;
|
||||||
|
node->declare_parameter("range_min", f_optvalue);
|
||||||
|
node->get_parameter("range_min", f_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropMinRange, &f_optvalue, sizeof(float));
|
||||||
|
/// unit: Hz
|
||||||
|
f_optvalue = 10.f;
|
||||||
|
node->declare_parameter("frequency", f_optvalue);
|
||||||
|
node->get_parameter("frequency", f_optvalue);
|
||||||
|
laser.setlidaropt(LidarPropScanFrequency, &f_optvalue, sizeof(float));
|
||||||
|
|
||||||
|
bool invalid_range_is_inf = false;
|
||||||
|
node->declare_parameter("invalid_range_is_inf", invalid_range_is_inf);
|
||||||
|
node->get_parameter("invalid_range_is_inf", invalid_range_is_inf);
|
||||||
|
|
||||||
|
|
||||||
|
bool ret = laser.initialize();
|
||||||
|
if (ret) {
|
||||||
|
ret = laser.turnOn();
|
||||||
|
} else {
|
||||||
|
RCLCPP_ERROR(node->get_logger(), "%s\n", laser.DescribeError());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto laser_pub = node->create_publisher<sensor_msgs::msg::LaserScan>("scan", rclcpp::SensorDataQoS());
|
||||||
|
auto pc_pub = node->create_publisher<sensor_msgs::msg::PointCloud>("point_cloud", rclcpp::SensorDataQoS());
|
||||||
|
|
||||||
|
auto stop_scan_service =
|
||||||
|
[&laser](const std::shared_ptr<rmw_request_id_t> request_header,
|
||||||
|
const std::shared_ptr<std_srvs::srv::Empty::Request> req,
|
||||||
|
std::shared_ptr<std_srvs::srv::Empty::Response> response) -> bool
|
||||||
|
{
|
||||||
|
return laser.turnOff();
|
||||||
|
};
|
||||||
|
|
||||||
|
auto stop_service = node->create_service<std_srvs::srv::Empty>("stop_scan",stop_scan_service);
|
||||||
|
|
||||||
|
auto start_scan_service =
|
||||||
|
[&laser](const std::shared_ptr<rmw_request_id_t> request_header,
|
||||||
|
const std::shared_ptr<std_srvs::srv::Empty::Request> req,
|
||||||
|
std::shared_ptr<std_srvs::srv::Empty::Response> response) -> bool
|
||||||
|
{
|
||||||
|
return laser.turnOn();
|
||||||
|
};
|
||||||
|
|
||||||
|
auto start_service = node->create_service<std_srvs::srv::Empty>("start_scan",start_scan_service);
|
||||||
|
|
||||||
|
rclcpp::WallRate loop_rate(20);
|
||||||
|
|
||||||
|
while (ret && rclcpp::ok()) {
|
||||||
|
|
||||||
|
LaserScan scan;//
|
||||||
|
|
||||||
|
if (laser.doProcessSimple(scan)) {
|
||||||
|
|
||||||
|
auto scan_msg = std::make_shared<sensor_msgs::msg::LaserScan>();
|
||||||
|
auto pc_msg = std::make_shared<sensor_msgs::msg::PointCloud>();
|
||||||
|
scan_msg->header.stamp = node->now();//this->now();
|
||||||
|
//scan_msg->header.stamp.sec = RCL_NS_TO_S(scan.stamp);
|
||||||
|
//scan_msg->header.stamp.nanosec = scan.stamp - RCL_S_TO_NS(scan_msg->header.stamp.sec);
|
||||||
|
scan_msg->header.frame_id = frame_id;
|
||||||
|
pc_msg->header = scan_msg->header;
|
||||||
|
scan_msg->angle_min = scan.config.min_angle;
|
||||||
|
scan_msg->angle_max = scan.config.max_angle;
|
||||||
|
scan_msg->angle_increment = scan.config.angle_increment;
|
||||||
|
scan_msg->scan_time = scan.config.scan_time;
|
||||||
|
scan_msg->time_increment = scan.config.time_increment;
|
||||||
|
scan_msg->range_min = scan.config.min_range;
|
||||||
|
scan_msg->range_max = scan.config.max_range;
|
||||||
|
|
||||||
|
int size = (scan.config.max_angle - scan.config.min_angle)/ scan.config.angle_increment + 1;
|
||||||
|
const float invalid_range_value =
|
||||||
|
invalid_range_is_inf ? std::numeric_limits<float>::infinity() : 0.0f;
|
||||||
|
scan_msg->ranges.assign(size, invalid_range_value);
|
||||||
|
scan_msg->intensities.assign(size, 0.0f);
|
||||||
|
|
||||||
|
pc_msg->channels.resize(2);
|
||||||
|
int idx_intensity = 0;
|
||||||
|
pc_msg->channels[idx_intensity].name = "intensities";
|
||||||
|
int idx_timestamp = 1;
|
||||||
|
pc_msg->channels[idx_timestamp].name = "stamps";
|
||||||
|
|
||||||
|
for(size_t i=0; i < scan.points.size(); i++) {
|
||||||
|
int index = std::ceil((scan.points[i].angle - scan.config.min_angle)/scan.config.angle_increment);
|
||||||
|
if(index >=0 && index < size) {
|
||||||
|
if (scan.points[i].range >= scan.config.min_range) {
|
||||||
|
scan_msg->ranges[index] = scan.points[i].range;
|
||||||
|
scan_msg->intensities[index] = scan.points[i].intensity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scan.points[i].range >= scan.config.min_range &&
|
||||||
|
scan.points[i].range <= scan.config.max_range) {
|
||||||
|
geometry_msgs::msg::Point32 point;
|
||||||
|
point.x = scan.points[i].range * cos(scan.points[i].angle);
|
||||||
|
point.y = scan.points[i].range * sin(scan.points[i].angle);
|
||||||
|
point.z = 0.0;
|
||||||
|
pc_msg->points.push_back(point);
|
||||||
|
pc_msg->channels[idx_intensity].values.push_back(scan.points[i].intensity);
|
||||||
|
pc_msg->channels[idx_timestamp].values.push_back(i * scan.config.time_increment);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
laser_pub->publish(*scan_msg);
|
||||||
|
pc_pub->publish(*pc_msg);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
RCLCPP_ERROR(node->get_logger(), "Failed to get scan");
|
||||||
|
}
|
||||||
|
if(!rclcpp::ok()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rclcpp::spin_some(node);
|
||||||
|
loop_rate.sleep();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RCLCPP_INFO(node->get_logger(), "[YDLIDAR INFO] Now YDLIDAR is stopping .......");
|
||||||
|
laser.turnOff();
|
||||||
|
laser.disconnecting();
|
||||||
|
rclcpp::shutdown();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
11
ros2/src/ydlidar_ros2_driver/startup/initenv.sh
Executable file
11
ros2/src/ydlidar_ros2_driver/startup/initenv.sh
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="ydlidar"' >/etc/udev/rules.d/ydlidar.rules
|
||||||
|
|
||||||
|
echo 'KERNEL=="ttyACM*", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", MODE:="0666", GROUP:="dialout", SYMLINK+="ydlidar"' >/etc/udev/rules.d/ydlidar-V2.rules
|
||||||
|
|
||||||
|
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0666", GROUP:="dialout", SYMLINK+="ydlidar"' >/etc/udev/rules.d/ydlidar-2303.rules
|
||||||
|
|
||||||
|
service udev reload
|
||||||
|
sleep 2
|
||||||
|
service udev restart
|
||||||
|
|
||||||
Reference in New Issue
Block a user