velodyne icon indicating copy to clipboard operation
velodyne copied to clipboard

how to use two vlp-16 in the ros melodic

Open himhan34 opened this issue 2 years ago • 17 comments

Please complete the following information:

  • OS and Version: ubuntu 18.04
  • ROS Version: melodic
  • Built from Source or Downloaded from Official Repository:
  • Version: [if from repository, give version from sudo dpkg -s ros-$ROS_VERSION-velodyne, if from source, give commit hash]

Describe the bug A clear and concise description of what the bug is.

hello. first thank you for the nice code sharing. i am also doing the same thing as you do with two vlp 16 lidar

image

after following the thing that you guys done, there was no error, but i cant see mixed point clouds, is there any ways to see them?

image

my code is exactly like you..

<!-- VLP-16 front -->
<include file="$(find velodyne_pointcloud)/launch/VLP16_points.launch">
  <arg name="calibration" value="$(arg velodyne_calib)"/>
  <arg name="device_ip" value="192.168.1.201"/>
  <arg name="frame_id" value="vlp201"/>
  <arg name="port" value="2368"/>
</include>

can you help me?

To Reproduce Steps to reproduce the behavior:

  1. Go to '...' https://github.com/ros-drivers/velodyne/issues/108

=> i followed this procedure in this repo. can you help me?

himhan34 avatar Oct 24 '22 17:10 himhan34

@himhan34 There are a lot of "procedures" in the issue you linked to.

  • Also, you did not answer one of the questions in the template: are you building this repository from source or are you using the version from apt?
  • What are the IP addresses of both of your sensors?
  • What ports are set for the data and telemetry ports on both of your sensors?
  • How are both sensors connected to your PC?

JWhitleyWork avatar Oct 24 '22 18:10 JWhitleyWork

sorry for the small information.

  1. for this question. Also, you did not answer one of the questions in the template: are you building this repository from source or are you using the version from apt?

=> i installed throught git clone command, and i tried to follow the direction that people had done. https://github.com/ros-drivers/velodyne/issues/108

  1. for this question. i followed the same procedure of the people , my ip is
    image

this one.

  1. for this question What ports are set for the data and telemetry ports on both of your sensors? image

also the same as people had done.

  1. for this question How are both sensors connected to your PC?

now i am using jetson xavier for our lab's robot. and one of them is connected to the jetson directly and rest of them is connected with lan cable to usb cable to jetson.

and i used this launch file , but there was no problem with catkin-make, after that i tried to do operate the node but the node didnt show velodyne points as well they was empty

<!-- VLP-16 front -->
<include file="$(find velodyne_pointcloud)/launch/VLP16_points.launch">
  <arg name="calibration" value="$(arg velodyne_calib)"/>
  <arg name="device_ip" value="192.168.1.201"/>
  <arg name="frame_id" value="vlp201"/>
  <arg name="port" value="2368"/>
</include>

himhan34 avatar Oct 24 '22 18:10 himhan34

Hello, Can you share whole launch file you metioned? I think I can help you.

JeongJae0815 avatar Oct 26 '22 07:10 JeongJae0815

2,3 : I think you should make the configurations(gateway, host address) same on both sensors. Only differences is on ip address, data port and telemetry port(you set well.)

4: In my case, I use a router to use both sensors.

JeongJae0815 avatar Oct 26 '22 07:10 JeongJae0815

ahh sorry for the late reply. i solved !

the problem was fixed frame. to solve my problem i changed the fixed frame in the launch file.
and i set in the same fixed frame with 2 velodynelidars thanks for helping me !

have a nice day!

himhan34 avatar Oct 26 '22 10:10 himhan34

if you dont mind can i ask one question about the multi lidar pointcloud fusion??

2022년 10월 26일 (수) 오후 4:39, JeongJae0815 @.***>님이 작성:

2,3 : I think you should make the configurations(gateway, host address) same on both sensors. Only differences is on ip address, data port and telemetry port(you set well.)

In my case, I use a router to use both sensors.

— Reply to this email directly, view it on GitHub https://github.com/ros-drivers/velodyne/issues/480#issuecomment-1291624730, or unsubscribe https://github.com/notifications/unsubscribe-auth/ALFL7J3U53R7KHTTH2YGVALWFDN3VANCNFSM6AAAAAARNGTY7U . You are receiving this because you were mentioned.Message ID: @.***>

himhan34 avatar Oct 28 '22 18:10 himhan34

Sorry for replying late :( How can I help you?

JeongJae0815 avatar Nov 02 '22 06:11 JeongJae0815

thanks for answering now i am using 2 vlp 16 lidar

do you know how to change oriemtation of point cloud?

2022년 11월 2일 (수) 오후 3:35, JeongJae0815 @.***>님이 작성:

Sorry for replying late :( How can I help you?

— Reply to this email directly, view it on GitHub https://github.com/ros-drivers/velodyne/issues/480#issuecomment-1299647060, or unsubscribe https://github.com/notifications/unsubscribe-auth/ALFL7J3FJIBLND4C7E47L53WGIDRNANCNFSM6AAAAAARNGTY7U . You are receiving this because you modified the open/close state.Message ID: @.***>

himhan34 avatar Nov 02 '22 10:11 himhan34

As I understand,I think you want to merge two point clouds from each sensors. To merge two point clouds, you need homogenous matrix(positional relationship between two sensors) through calibration process(You need to search it with some keywords[velodyne, calibration]).And then, You can merge them with the matrix in one frame.(Please search transformation matrix)

On presentation of aligned point clouds on rviz, I don't know this driver offers the function of transformation.(cause I don't need it) I think you can write a new ros code that publish new aligned point cloud.

JeongJae0815 avatar Nov 02 '22 10:11 JeongJae0815

thanks for helping, i will try!

2022년 11월 2일 (수) 오후 7:31, JeongJae0815 @.***>님이 작성:

As I understand,I think you want to merge two point clouds from each sensors. To merge two point clouds, you need homogenous matrix(positional relationship between two sensors) through calibration process(You need to search it with some keyword[velodyne, calibration]). You can merge them with the matrix in one frame. (Please search transformation matrix)

On presentation of aligned point clouds on rviz, I don't know this driver offer the function of transformation.(cause I don't need it) I think you can write a new ros code that publish new aligned point cloud.

— Reply to this email directly, view it on GitHub https://github.com/ros-drivers/velodyne/issues/480#issuecomment-1300005796, or unsubscribe https://github.com/notifications/unsubscribe-auth/ALFL7J44UBR65TT3AKIFYNTWGI7GLANCNFSM6AAAAAARNGTY7U . You are receiving this because you modified the open/close state.Message ID: @.***>

himhan34 avatar Nov 03 '22 02:11 himhan34

Hi, I have read the issue mentioned in above, and still no luck to see both lidar scan in Rviz2.

I am working on ROS2 Galactic docker environment, the build is using git and rosdep install. In my case, I can see both Lidar individually with different assigned IP (192.168.1.201:2368 & 192.168.1.202:2369). However after I modifier the launch file, there always a lidar messge saying poll() timeout and only one lidar scan data can be viewed.

I have checked the wireshark packages and also the rqt_graph, both of them are appeared. Below is the IP configuration:

lidar_left:

  • IP: 192.168.1.201
  • Dest IP: 192.168.1.100
  • port: 2368 and 8308
  • frame_id: velodyne

lidar_right:

  • IP: 192.168.1.202
  • Dest IP: 192.168.1.100
  • port: 2369 and 8309
  • frame_id: velodyne

One thing I would like to point out is that, even I change the frame_id to lidar_left and lidar_right, no change effects was shown. might be this is a bug...

Below is the launch file:

# Copyright 2019 Open Source Robotics Foundation, Inc.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above
#    copyright notice, this list of conditions and the following
#    disclaimer in the documentation and/or other materials provided
#    with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

"""Launch the velodyne driver, pointcloud, and laserscan nodes with default configuration."""

import os
import yaml

import ament_index_python.packages
import launch
import launch_ros.actions


def generate_launch_description():
    driver_share_dir = ament_index_python.packages.get_package_share_directory('velodyne_driver')
    driver_params_file_left = os.path.join(driver_share_dir, 'config', 'VLP16-velodyne_driver_node-params_left.yaml')
    driver_params_file_right = os.path.join(driver_share_dir, 'config', 'VLP16-velodyne_driver_node-params_right.yaml')
    velodyne_driver_node_left = launch_ros.actions.Node(package='velodyne_driver',
                                                   executable='velodyne_driver_node',
                                                   namespace='lidar_left',
                                                   output='both',
                                                   parameters=[driver_params_file_left])

    velodyne_driver_node_right = launch_ros.actions.Node(package='velodyne_driver',
                                                   executable='velodyne_driver_node',
                                                   namespace='lidar_right',
                                                   output='both',
                                                   parameters=[driver_params_file_right])

    convert_share_dir = ament_index_python.packages.get_package_share_directory('velodyne_pointcloud')

    # convert_params_file = os.path.join(convert_share_dir, 'config', 'VLP16-velodyne_convert_node-params.yaml')
    # with open(convert_params_file, 'r') as f:
    #     convert_params = yaml.safe_load(f)['velodyne_convert_node']['ros__parameters']
    # convert_params['calibration'] = os.path.join(convert_share_dir, 'params', 'VLP16db.yaml')

    convert_params_file_left = os.path.join(convert_share_dir, 'config', 'VLP16-velodyne_convert_node-params_left.yaml')
    with open(convert_params_file_left, 'r') as f:
        convert_params_left = yaml.safe_load(f)['velodyne_convert_node']['ros__parameters']
    convert_params_left['calibration'] = os.path.join(convert_share_dir, 'params', 'VLP16db.yaml')

    convert_params_file_right = os.path.join(convert_share_dir, 'config', 'VLP16-velodyne_convert_node-params_right.yaml')
    with open(convert_params_file_right, 'r') as f:
        convert_params_right = yaml.safe_load(f)['velodyne_convert_node']['ros__parameters']
    convert_params_right['calibration'] = os.path.join(convert_share_dir, 'params', 'VLP16db.yaml')

    velodyne_convert_node_left = launch_ros.actions.Node(package='velodyne_pointcloud',
                                                    executable='velodyne_convert_node',
                                                    namespace='lidar_left',
                                                    output='both',
                                                    parameters=[convert_params_left])

    velodyne_convert_node_right = launch_ros.actions.Node(package='velodyne_pointcloud',
                                                    executable='velodyne_convert_node',
                                                    namespace='lidar_right',
                                                    output='both',
                                                    parameters=[convert_params_right])

    laserscan_share_dir = ament_index_python.packages.get_package_share_directory('velodyne_laserscan')
    laserscan_params_file = os.path.join(laserscan_share_dir, 'config', 'default-velodyne_laserscan_node-params.yaml')
    velodyne_laserscan_node_left = launch_ros.actions.Node(package='velodyne_laserscan',
                                                      executable='velodyne_laserscan_node',
                                                      namespace='lidar_left',
                                                      output='both',
                                                      parameters=[laserscan_params_file])

    velodyne_laserscan_node_right = launch_ros.actions.Node(package='velodyne_laserscan',
                                                      executable='velodyne_laserscan_node',
                                                      namespace='lidar_right',
                                                      output='both',
                                                      parameters=[laserscan_params_file])


    return launch.LaunchDescription([velodyne_driver_node_left,
                                     velodyne_driver_node_right,
                                     velodyne_convert_node_left,
                                     velodyne_convert_node_right,
                                     velodyne_laserscan_node_left,
                                     velodyne_laserscan_node_right

                                    #  launch.actions.RegisterEventHandler(
                                    #      event_handler=launch.event_handlers.OnProcessExit(
                                    #          target_action=velodyne_driver_node,
                                    #          on_exit=[launch.actions.EmitEvent(
                                    #              event=launch.events.Shutdown())],
                                    #      )),
                                     ])

TZECHIN6 avatar Nov 08 '22 07:11 TZECHIN6

TZECHIN6

For me, the Ros version is ros melodic. i think the problem might be the the destination ip,

how about changing the destination ip different each??

himhan34 avatar Nov 08 '22 07:11 himhan34

TZECHIN6

can you see the velodyne points each? if you cant see the data each (each lidar) i think you might set lidars again

himhan34 avatar Nov 08 '22 07:11 himhan34

Just checked the start log info when running ros2 launch velodyne velodyne-all-node....multi-launch.py

[velodyne_driver_node-1] [INFO] [1667891961.376124524] [lidar_left.velodyne_driver_node]: Velodyne HDL-64E rotating at 600.000000 RPM
[velodyne_driver_node-1] [INFO] [1667891961.376217147] [lidar_left.velodyne_driver_node]: publishing 260 packets per scan
[velodyne_driver_node-2] [INFO] [1667891961.376129781] [lidar_right.velodyne_driver_node]: Velodyne HDL-64E rotating at 600.000000 RPM
[velodyne_driver_node-2] [INFO] [1667891961.376217164] [lidar_right.velodyne_driver_node]: publishing 260 packets per scan
[velodyne_driver_node-2] [INFO] [1667891961.376241653] [lidar_right.velodyne_driver_node]: Cut at specific angle feature activated. Cutting velodyne points always at 6.283185 rad.
[velodyne_driver_node-2] [INFO] [1667891961.376259142] [lidar_right.velodyne_driver_node]: expected frequency: 10.000 (Hz)
[velodyne_driver_node-1] [INFO] [1667891961.376241322] [lidar_left.velodyne_driver_node]: Cut at specific angle feature activated. Cutting velodyne points always at 6.283185 rad.
[velodyne_driver_node-1] [INFO] [1667891961.376257072] [lidar_left.velodyne_driver_node]: expected frequency: 10.000 (Hz)
[velodyne_driver_node-1] [INFO] [1667891961.376451525] [lidar_left.velodyne_driver_node]: Opening UDP socket: port 2368
[velodyne_driver_node-2] [INFO] [1667891961.376451602] [lidar_right.velodyne_driver_node]: Opening UDP socket: port 2368

The launch file just ignore what I have passed to them, below is the .yaml for lidar_left:

velodyne_driver_node:
    ros__parameters:
        device_ip: 192.168.1.201
        gps_time: false
        time_offset: 0.0
        enabled: true
        read_once: false
        read_fast: false
        repeat_delay: 0.0
        frame_id: velodyne
        model: VLP16
        rpm: 600.0
        port: 2368
        timestamp_first_packet: false

lidar_right driver_node.yaml:

velodyne_driver_node:
    ros__parameters:
        device_ip: 192.168.1.202
        gps_time: false
        time_offset: 0.0
        enabled: true
        read_once: false
        read_fast: false
        repeat_delay: 0.0
        frame_id: velodyne
        model: VLP16
        rpm: 600.0
        port: 2369
        timestamp_first_packet: false

TZECHIN6 avatar Nov 08 '22 07:11 TZECHIN6

I wish I could help you with this problem, but I've not used ROS2 yet. This issue is focused on melodic system, so I think you'd better open new issue.

JeongJae0815 avatar Nov 08 '22 07:11 JeongJae0815

I somehow fix it just... what a lucky day!

Here is the solution:

launch.py

# Copyright 2019 Open Source Robotics Foundation, Inc.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above
#    copyright notice, this list of conditions and the following
#    disclaimer in the documentation and/or other materials provided
#    with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

"""Launch the velodyne driver, pointcloud, and laserscan nodes with default configuration."""

import os
import yaml

import ament_index_python.packages
import launch
import launch_ros.actions


def generate_launch_description():
    driver_share_dir = ament_index_python.packages.get_package_share_directory('velodyne_driver')
    driver_params_file = os.path.join(driver_share_dir, 'config', 'VLP16-velodyne_driver_node-params_multi.yaml')
    velodyne_driver_node_left = launch_ros.actions.Node(package='velodyne_driver',
                                                   executable='velodyne_driver_node',
                                                   namespace='lidar_left',
                                                   output='both',
                                                   parameters=[driver_params_file])

    velodyne_driver_node_right = launch_ros.actions.Node(package='velodyne_driver',
                                                   executable='velodyne_driver_node',
                                                   namespace='lidar_right',
                                                   output='both',
                                                   parameters=[driver_params_file])


    convert_share_dir = ament_index_python.packages.get_package_share_directory('velodyne_pointcloud')
    convert_params_file = os.path.join(convert_share_dir, 'config', 'VLP16-velodyne_convert_node-params.yaml')
    with open(convert_params_file, 'r') as f:
        convert_params = yaml.safe_load(f)['velodyne_convert_node']['ros__parameters']
    convert_params['calibration'] = os.path.join(convert_share_dir, 'params', 'VLP16db.yaml')
    velodyne_convert_node_left = launch_ros.actions.Node(package='velodyne_pointcloud',
                                                    executable='velodyne_convert_node',
                                                    namespace='lidar_left',
                                                    output='both',
                                                    parameters=[convert_params])

    velodyne_convert_node_right = launch_ros.actions.Node(package='velodyne_pointcloud',
                                                    executable='velodyne_convert_node',
                                                    namespace='lidar_right',
                                                    output='both',
                                                    parameters=[convert_params])

    laserscan_share_dir = ament_index_python.packages.get_package_share_directory('velodyne_laserscan')
    laserscan_params_file = os.path.join(laserscan_share_dir, 'config', 'default-velodyne_laserscan_node-params_multi.yaml')
    velodyne_laserscan_node_left = launch_ros.actions.Node(package='velodyne_laserscan',
                                                      executable='velodyne_laserscan_node',
                                                      namespace='lidar_left',
                                                      output='both',
                                                      parameters=[laserscan_params_file])

    velodyne_laserscan_node_right = launch_ros.actions.Node(package='velodyne_laserscan',
                                                      executable='velodyne_laserscan_node',
                                                      namespace='lidar_right',
                                                      output='both',
                                                      parameters=[laserscan_params_file])


    return launch.LaunchDescription([velodyne_driver_node_left,
                                     velodyne_driver_node_right,
                                     velodyne_convert_node_left,
                                     velodyne_convert_node_right,
                                     velodyne_laserscan_node_left,
                                     velodyne_laserscan_node_right

                                    #  launch.actions.RegisterEventHandler(
                                    #      event_handler=launch.event_handlers.OnProcessExit(
                                    #          target_action=velodyne_driver_node,
                                    #          on_exit=[launch.actions.EmitEvent(
                                    #              event=launch.events.Shutdown())],
                                    #      )),
                                     ])

Now is the main part to solve the issue:

As you might notice, I have given to each lidar node, after that, the node name would be changed to lidar_left/velodyne_driver_node and lidar_right/velodyne_driver_node. And you might already guess it, we have to change the name in the .yaml config as well.

velodyne_drive_node_multi.yaml (adjust to your name):

lidar_left/velodyne_driver_node:
    ros__parameters:
        device_ip: 192.168.1.201
        gps_time: false
        time_offset: 0.0
        enabled: true
        read_once: false
        read_fast: false
        repeat_delay: 0.0
        frame_id: velodyne
        model: VLP16
        rpm: 600.0
        port: 2368
        timestamp_first_packet: false
        
lidar_right/velodyne_driver_node:
    ros__parameters:
        device_ip: 192.168.1.202
        gps_time: false
        time_offset: 0.0
        enabled: true
        read_once: false
        read_fast: false
        repeat_delay: 0.0
        frame_id: velodyne
        model: VLP16
        rpm: 600.0
        port: 2369
        timestamp_first_packet: false

After this changes, the config for driver_node would be loaded correctly.

TZECHIN6 avatar Nov 08 '22 08:11 TZECHIN6

However, base on that solution I further deep down to see what happen if I modifiy the launch base on this logic:

Here is the thing that I am not sure and hope someone could guide me:

  1. for velodyne_pointcloud config .yaml
lidar_left/velodyne_convert_node:
    ros__parameters:
        calibration: VLP16db.yaml
        model: VLP16
        target_frame: velodyne
        fixed_frame: velodyne
        min_range: 0.9
        max_range: 130.0
        view_direction: 0.0
        organize_cloud: true

lidar_right/velodyne_convert_node:
    ros__parameters:
        calibration: VLP16db.yaml
        model: VLP16
        target_frame: velodyne
        fixed_frame: velodyne
        min_range: 0.9
        max_range: 130.0
        view_direction: 0.0
        organize_cloud: true

This will introduce an error about VLP16db.yaml cannot be loaded, seem they dont recognize the new name with prefix lidar_xxx.

  1. Base on the findings in point 1, actually, do I have to give namespace for all running node? Or only velodyne_driver_node is already enough?

TZECHIN6 avatar Nov 08 '22 08:11 TZECHIN6

@TZECHIN6 Please create different issues for different problems rather than continuing a long thread like this. If you are still having problems, please open a new issue.

JWhitleyWork avatar Dec 04 '22 21:12 JWhitleyWork