ros2学习笔记28--ros2环境下,多激光雷达启动的launch文件编写样式参考(代码片段)

鸿_H 鸿_H     2022-12-18     760

关键词:

背景:一次需要读取多个velodyne的雷达点云数据,但是ros2知识缺少,一番折腾终有成果.

1.准备

velodyne的ros2版本驱动链接:https://github.com/ros-drivers/velodyne/tree/ros2

2.launch文件编写

2.1 官方launch编写样式

下面python代码是启动一个激光雷达情况,但是同时启动多个,并可分别读取点云数据才是我们考虑重点.
velodyne-all-nodes-VLP16-launch.py:

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.yaml')
    velodyne_driver_node = launch_ros.actions.Node(package='velodyne_driver',
                                                   node_executable='velodyne_driver_node',
                                                   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 = launch_ros.actions.Node(package='velodyne_pointcloud',
                                                    node_executable='velodyne_convert_node',
                                                    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.yaml')
    velodyne_laserscan_node = launch_ros.actions.Node(package='velodyne_laserscan',
                                                      node_executable='velodyne_laserscan_node',
                                                      output='both',
                                                      parameters=[laserscan_params_file])


    return launch.LaunchDescription([velodyne_driver_node,
                                     velodyne_convert_node,
                                     velodyne_laserscan_node,

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

2.2 多个velodyne激光雷达启动launch文件编写

下面代码是实现同时启动两个激光雷达的launch文件,亦可推广到多个传感器在ros2环境启动情形.
想了解更多内容,可参看个人发表在ros社区提问链接:https://answers.ros.org/question/383667/how-to-start-multiple-lidar-in-one-file-in-ros2-environment/

import os
import yaml

import ament_index_python.packages
from launch import LaunchDescription
from launch_ros.actions import Node

#velodyne_1
def generate_launch_description():
    ld = LaunchDescription()

    driver_share_dir_1 = ament_index_python.packages.get_package_share_directory('velodyne_driver')
    driver_params_file_1 = os.path.join(driver_share_dir_1, 'config', 'vlp_1.yaml')
    velodyne_driver_node_1 = Node(
        package="velodyne_driver",
        executable="velodyne_driver_node",
        name="velodyne_driver_node_1",
        parameters=[driver_params_file_1],
        remappings=[
            ("velodyne_packets", "velodyne_packets_1")
        ]
    )

    convert_share_dir_1 = ament_index_python.packages.get_package_share_directory('velodyne_pointcloud')
    convert_params_file_1 = os.path.join(convert_share_dir_1, 'config', 'VLP16-velodyne_convert_node-params.yaml')
    with open(convert_params_file_1, 'r') as f:
        convert_params_1 = yaml.safe_load(f)['velodyne_convert_node']['ros__parameters']
    convert_params_1['calibration'] = os.path.join(convert_share_dir_1, 'params', 'VLP16db.yaml')
    velodyne_convert_node_1 = Node(
        package="velodyne_pointcloud",
        executable="velodyne_convert_node",
        name="velodyne_convert_node_1",
        parameters=[convert_params_1],
        remappings=[
            ("velodyne_packets", "velodyne_packets_1"),
            ("velodyne_points", "velodyne_points_1")
        ]
    )

    laserscan_share_dir_1 = ament_index_python.packages.get_package_share_directory('velodyne_laserscan')
    laserscan_params_file_1 = os.path.join(laserscan_share_dir_1, 'config', 'default-velodyne_laserscan_node-params.yaml')
    velodyne_laserscan_node_1 = Node(
        package="velodyne_laserscan",
        executable="velodyne_laserscan_node",
        name="velodyne_laserscan_node_1",
        parameters=[laserscan_params_file_1],
        remappings=[
            ("velodyne_points", "velodyne_points_1"),
            ("scan", "scan_1")
        ]
    )

    #velodyne_2
    driver_share_dir_2 = ament_index_python.packages.get_package_share_directory('velodyne_driver')
    driver_params_file_2 = os.path.join(driver_share_dir_2, 'config', 'vlp_1.yaml')
    velodyne_driver_node_2 = Node(
        package="velodyne_driver",
        executable="velodyne_driver_node",
        name="velodyne_driver_node_2",
        parameters=[driver_params_file_2],
        remappings=[
            ("velodyne_packets", "velodyne_packets_2")
        ]
    )

    convert_share_dir_2 = ament_index_python.packages.get_package_share_directory('velodyne_pointcloud')
    convert_params_file_2 = os.path.join(convert_share_dir_2, 'config', 'VLP16-velodyne_convert_node-params.yaml')
    with open(convert_params_file_2, 'r') as f:
        convert_params_2 = yaml.safe_load(f)['velodyne_convert_node']['ros__parameters']
    convert_params_2['calibration'] = os.path.join(convert_share_dir_2, 'params', 'VLP16db.yaml')
    velodyne_convert_node_2 = Node(
        package="velodyne_pointcloud",
        executable="velodyne_convert_node",
        name="velodyne_convert_node_2",
        parameters=[convert_params_2],
        remappings=[
            ("velodyne_packets", "velodyne_packets_2"),
            ("velodyne_points", "velodyne_points_2")
        ]
    )

    laserscan_share_dir_2 = ament_index_python.packages.get_package_share_directory('velodyne_laserscan')
    laserscan_params_file_2 = os.path.join(laserscan_share_dir_2, 'config', 'default-velodyne_laserscan_node-params.yaml')
    velodyne_laserscan_node_2 = Node(
        package="velodyne_laserscan",
        executable="velodyne_laserscan_node",
        name="velodyne_laserscan_node_2",
        parameters=[laserscan_params_file_2],
        remappings=[
            ("velodyne_points", "velodyne_points_2"),
            ("scan", "scan_2")
        ]
    )     

    ld.add_action(velodyne_driver_node_1)
    ld.add_action(velodyne_convert_node_1)
    ld.add_action(velodyne_laserscan_node_1)
    ld.add_action(velodyne_driver_node_2)
    ld.add_action(velodyne_convert_node_2)
    ld.add_action(velodyne_laserscan_node_2)
    return ld

rqt_graph效果图:

3.小结

1)python编写的launch文件,具有更强的灵活性,目前个人还比较菜,只会简单的

2)ros2环境下多传感器启动的launch文件编写,可由该样式推广

3)注意node发出的订阅者或发布者topic名字,remapping恰当,即可实现信息流的准确传递

4)注意多看官方文档,这次如:https://docs.ros.org/en/foxy/Guides/Launch-file-different-formats.html

5)一定要多看cmakelists.txt文件,以及源文件,搞清楚,node由哪个.cpp(源文件)生成的,发出的topic又有哪些,其订阅的topic名字以及发布的topic名字是什么;可以借助rqt_graph来梳理快速理解

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

ros2学习笔记18-velodyne16雷达点云在ros2中可视化案例参考(代码片段)

环境:ubuntu20.04,ros-foxy,vscode,velodyne-16背景:练习如何将velodyne-16雷达点云数据在ros2中读取并可视化.折腾了很久,并没有找到类似案例,所以自己总结一下.1.修改电脑ip这里修改自己电脑ip,跟大多数... 查看详情

激光slam课程学习笔记--第5课:传感器数据处理ii:激光雷达运动畸变去除

前言:这系列笔记是学习曾书格老师的激光slam课程所得,这里分享只是个人理解,有误之处,望大佬们赐教。这节课主要介绍激光的运动畸变去除相关知识。1.概念介绍1.1激光雷达传感器介绍1.1.1 测距原理三角... 查看详情

激光slam学习笔记1--rtk组合惯导激光雷达传感器一些经验知识分享(代码片段)

...f1a;跟组合惯导和激光雷达打交道半年了,过程中查找学习了这两方面的资料,这里来个小结。如果有理解错误的,望大佬们不吝赐教。一、RTK组合惯导个人理解有两部分组成,一个提供gps信息的rtk,另外一个... 查看详情

激光slam课程学习笔记--第3课:3d激光slam

前言:这系列笔记是学习曾书格老师的激光slam课程所得,这里分享只是个人理解,有误之处,望大佬们赐教。这节课介绍的是3d激光slam。1.3D激光SLAM的介绍1.13d雷达slam的输入1)IMU数据2)里程计数据3)3... 查看详情

2d激光雷达如何实现3d应用?

...现定位、建图、多点触摸等应用外,还能用来做3D建模与环境扫描。肯定会有人好奇,2D激光雷达扫描出来的图像应该是平面图,怎么将2D平面图变为三维的立体图呢?   目前市面上实现这种效果的方式主要有两种:&nb... 查看详情

激光雷达是什么?一文带你读懂激光雷达

...的关注,在机器人领域,激光雷达可以帮助机器人在未知环境中了解周边地图信息,为后续定位导航提供很好的环境认知能力,帮助机器人实现智能行走。 什么是激光雷达?激光雷达是一种用于获取精确位置信息的传感器,... 查看详情

自动驾驶技术-环境感知篇:激光雷达毫米波雷达超声波雷达相关技术介绍

...》文章中我们介绍了自动驾驶三个核心环节,分别是环境感知和定位、决策规划、执行控制。接下来这章将会针对环境感知和定位展开介绍,环境感知和定位包含环境感知、定位、V2X3个子模块。环境感知指的是通过摄像... 查看详情

激光雷达lidar多制式产品

激光雷达Lidar多制式产品激光雷达,发射激光束探测目标的位置、速度等特征量的雷达系统。集激光、全球定位系统(GPS)、和IMU(惯性测量装置)三种技术于一身。激光雷达类型MEMS型激光雷达MEMS型激光雷达是比较常用的,可... 查看详情

自动驾驶技术-环境感知篇:激光雷达毫米波雷达超声波雷达相关技术介绍

...》文章中我们介绍了自动驾驶三个核心环节,分别是环境感知和定位、决策规划、执行控制。接下来这章将会针对环境感知和定位展开介绍,环境感知和定位包含环境感知、定位、V2X3个子模块。环境感知指的是通过摄像... 查看详情

被限制出口的激光雷达,中国有多厉害?美国企业已陆续被击败

...技术的局限当时的激光雷达需要高速旋转以不断扫描周围环境并采集数据,导致激光雷达的体积较大,而且可靠性较低。中国的激光雷达企业迅速研发了激光雷达处理芯片、收发激光芯片的面阵等关键技术部件,由此... 查看详情

pcl——pcl库的简单使用(代码片段)

...关概念,更多请见下面几篇文章:Apollo星火计划学习笔记——第六讲上自动驾驶感知基础(I)自动驾驶感知——激光雷达物体检测算法自动驾驶感知——激光雷达基本概念|激光雷达点云|激光雷达的标定1.1激光雷... 查看详情

激光slam课程学习笔记--第1课:激光slam的发展和应用

前言:这系列笔记是学习曾书格老师的激光slam课程所得,这里分享只是个人理解,有误之处,望大佬们赐教。这节课介绍的是激光slam的发展和应用。1. slam是什么1.1 slam的定义localization:在给定地图的情况下࿰... 查看详情

三角测距激光雷达与tof激光雷达大比拼(代码片段)

...不言而喻。就目前市面上的主流激光雷达产品而言,用于环境探测和地图构建的雷达,按技术路线大体可以分为两类,一类是三角测距激光雷达,另一类是TOF雷达。这两个名词相信很多人并不陌生,但是要说这两种方案从原理、... 查看详情

autoware使用激光雷达进行目标检测(代码片段)

autoware使用EuclideanClustering进行检测点云聚类在激光雷达环境感知中的作用就无人车的环境感知而言,方案很多,根据使用的传感器的不同,算法也截然不同,有单纯基于图像视觉的方法,也有基于激光雷达的方法,激光雷达以其... 查看详情

ros2学习笔记12--创建ros2包(代码片段)

概要:这篇主要介绍如何创建ros2包环境:ubuntu20.04,ros2-foxy,vscode最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.2.2.2创建自己第一个ros2包(原文:https://docs.ros.org/en/foxy/Tutor... 查看详情

自动驾驶感知算法实战16——激光雷达点云处理原理与实战

...云相关处理操作,介绍激光点云感知综述,相关点云深度学习处理方法。最终,以自动驾驶点云感知为实例,分析点云感知,以一个实操案例介绍过程。一、激光雷达工作原理(25%)激光雷达概述激光雷达工作原理激光雷达基本... 查看详情

自动驾驶感知算法实战16——激光雷达点云处理原理与实战

...云相关处理操作,介绍激光点云感知综述,相关点云深度学习处理方法。最终,以自动驾驶点云感知为实例,分析点云感知,以一个实操案例介绍过程。一、激光雷达工作原理(25%)激光雷达概述激光雷达工作原理激光雷达基本... 查看详情

激光slam课程学习笔记--第1课:激光slam的发展和应用

前言:这系列笔记是学习曾书格老师的激光slam课程所得,这里分享只是个人理解,有误之处,望大佬们赐教。这节课介绍的是激光slam的发展和应用。1. slam是什么1.1 slam的定义localization:在给定地图的情况下࿰... 查看详情