ROS中使用VLP16激光雷达获取点云数据

2023-11-14

ROS中使用VLP16激光雷达获取点云数据

个人博客地址

本文测试环境为:Ubuntu20.04 ROS Noetic


需要将激光雷达与PC连接,然后在设置=>网络=>有线中将IPv4改为手动,并且地址为192.168.1.100,子网掩码为255.255.255.0,点击应用。然后在浏览器输入192.168.1.201,如果成功进入配置界面则表示连接成功。

安装VLP驱动

cd catkin_ws/src
git clone https://github.com/ros-drivers/velodyne.git

继续执行下面命令。如果在执行第二条命令的时候报错了,需要根据终端的提示安装一些包或者可以看看这篇文章点我

cd ..
rosdep install --from-paths src --ignore-src --rosdistro noetic -y
catkin_make

报错处理:

如果catkin_make命令找不到,就需要看安装ROS依赖最后source脚本部分有没有完成。

编译中间如果出现找不到文件的报错,大概率是没有安装对应的包。

例如出现“Could NOT find image_transport (missing: image_transport_DIR)”错误,那就需要在终端输入sudo apt install ros-noetic-image-transport.

如果遇到“Could NOT find PY_em (missing: PY_EM)”错误,就需要运行catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

报错参考文章:

ROS报错:-- Could NOT find PY_em (missing: PY_EM)

ROS报错:Command ‘catkin_make‘ not found

【ROS】解决rosdep无法更新、缺少依赖问题

可视化测试

运行rosrun找不到命令的话,可以使用sudo apt install ros-noetic-rosbash安装。

sudo apt-get install ros-noetic-rviz

在终端输入下面命令,这个命令会一直运行,可以用Ctrl+C结束。要在catkin_velodyne目录下运行。

roslaunch velodyne_pointcloud VLP16_points.launch

运行后会出现一个窗口,将其左上角Fixed Framemap修改为velodyne。如果是运行rosrun rviz rviz -f velodyne命令话就不用做这一步了。

在这里插入图片描述

再点击左下角的Add,在弹出的窗口中选择By topic,再选择PointCloud2,最后点击OK

在这里插入图片描述

之后就可以在右侧看到可视化点云了。

在这里插入图片描述

录制和播放点云

在终端运行下面命令可以录制点云,点云记录会默认生成在运行目录。可以使用Crtl+C结束录制。

rosbag record out /velodyne_points

在终端运行下面命令可以播放点云,第一个参数填写要播放的点云记录。可以在rviz中看到播放的结果。按空格键可以暂停播放。

rosbag play 2023-03-28-22-49-58.bag

但是如果是在一直可视化显示点云的rviz下播放记录会出现重叠现象,看起来非常不舒服,因此最好是再重新开一个rviz窗口进行播放。

在终端输入roscore命令,然后再重新开一个终端输入rosrun rviz rviz -f velodyne命令。

点击左下角的Add,在弹出的窗口中选择PointCloud2,最后点击OK

在这里插入图片描述

点开左侧的PointCloud2,将Topic的内容改为*/velodyne_points*

在这里插入图片描述

之后在终端中输入播放命令rosbag play 2023-03-28-22-49-58.bag,就可以在该窗口的右侧看到播放画面了。

将bag文件转化成pcd文件

录制点云会生成bag文件,可以将该文件记录的每一帧点云转换成pcd格式并保存下来。

首先在终端中输入roscore命令

再开启一个终端输入下面的命令。output.bag为要处理的bag文件;*pcd/*为最终pcd文件的输出目录

rosrun pcl_ros bag_to_pcd output.bag /velodyne_points pcd/

python获取实时点云数据并保存成pcd文件

使用python获取VLP16返回的实时点云数据,并把每一帧数据保存成pcd文件。下面介绍两种方式:

方式一:

#!/usr/bin/env python

import rospy
from sensor_msgs.msg import PointCloud2
import sensor_msgs.point_cloud2 as pc2


counts = 0
def callback(data):
    global counts
    counts += 1
    gen = pc2.read_points(data, skip_nans=True)
    cloud = []
    for p in gen:
        # p是元组类型,代表一个点云数据,一共有6个元素,分别为x, y, z, intensity, ring, time
        cloud.append([p[0], p[1], p[2]])
    # pcd_name = str(counts) + ".pcd"
    with open('output.pcd', 'w') as f:
        f.write('# .PCD v.7 - Point Cloud Data file format\n')
        f.write('VERSION .7\n')
        f.write('FIELDS x y z\n')
        f.write('SIZE 4 4 4\n')
        f.write('TYPE F F F\n')
        f.write('COUNT 1 1 1\n')
        f.write('WIDTH %d\n' % len(cloud))
        f.write('HEIGHT 1\n')
        f.write('VIEWPOINT 0 0 0 1 0 0 0\n')
        f.write('POINTS %d\n' % len(cloud))
        f.write('DATA ascii\n')
        for p in cloud:
            f.write('%f %f %f\n' % (p[0], p[1], p[2]))
    print(counts)


def listener():
    rospy.init_node('velodyne_listener', anonymous=True)
    rospy.Subscriber('/velodyne_points', PointCloud2, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()

方式二:

import rospy
from sensor_msgs.msg import PointCloud2
import sensor_msgs.point_cloud2 as pc2


counts = 0
def callback(data):
    global counts
    counts += 1
    # cloud_list是列表类型,其存放着每个点云数据
    # 每个点云数据是sensor_msgs.point_cloud2.Point类型,共有6个元素,分别为x, y, z, intensity, ring, time
    cloud_list = pc2.read_points_list(data, skip_nans=True)
    # pcd_name = str(counts) + ".pcd"
    with open('output_list.pcd', 'w') as f:
        f.write('# .PCD v.7 - Point Cloud Data file format\n')
        f.write('VERSION .7\n')
        f.write('FIELDS x y z\n')
        f.write('SIZE 4 4 4\n')
        f.write('TYPE F F F\n')
        f.write('COUNT 1 1 1\n')
        f.write('WIDTH %d\n' % len(cloud_list))
        f.write('HEIGHT 1\n')
        f.write('VIEWPOINT 0 0 0 1 0 0 0\n')
        f.write('POINTS %d\n' % len(cloud_list))
        f.write('DATA ascii\n')
        for i in range(len(cloud_list)):
            f.write('%f %f %f\n' % (cloud_list[i][0], cloud_list[i][1], cloud_list[i][2]))
    print(counts)


def listener():
    rospy.init_node('velodyne_listener', anonymous=True)
    rospy.Subscriber('/velodyne_points', PointCloud2, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()

实时可视化激光雷达点云数据

from sensor_msgs.msg import PointCloud2
import sensor_msgs.point_cloud2 as pc2
import numpy as np
import open3d as o3d
import rospy
import cv2


# 按下B结束运行
def key_callback(vis):
    global stop_flag
    stop_flag = True
    print("Stop")


if __name__ == '__main__':
    # 创建可视化窗口和点云
    vis = o3d.visualization.VisualizerWithKeyCallback()
    vis.create_window(width=1080, height=720)
    vis_render = vis.get_render_option()
    vis_render.background_color = (0, 0, 0)
    vis.register_key_callback(ord('B'), key_callback)
    pcd = o3d.geometry.PointCloud()

    # 标记
    add_flag = False    # 首次vis.add标记
    stop_flag = False    # 停止标记

    # 初始化ros节点
    rospy.init_node('velodyne_listener', anonymous=True)

    while not stop_flag:      
        # 等待一次消息
        data = rospy.wait_for_message('/velodyne_points', PointCloud2, timeout=None)
        gen = pc2.read_points(data, skip_nans=True)
        cloud = []
        for p in gen:
            cloud.append([p[0], p[1], p[2], p[3]])
        points = np.array(cloud).astype(np.float32)
        # 提取xyz,暂时不需要强度
        points_xyz = points[:, :3]

        pcd.points = o3d.utility.Vector3dVector(points_xyz)
        if not add_flag:
            vis.add_geometry(pcd)
            add_flag = True
        vis.update_geometry(pcd)
        vis.poll_events()
        vis.update_renderer()
    vis.destroy_window()

在这里使用的是rospy.wait_for_message用于接收一次消息,该函数会返回接收到的消息。可以设置timeout=rospy.Duration(1),代表超时时间为1秒钟。如果在1秒内没有收到消息,则函数会返回None。

如果使用rospy.spin的话,程序运行到这行代码就会卡死,不会往下执行其他代码,所以在实时可视化的时候不能使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS中使用VLP16激光雷达获取点云数据 的相关文章

  • gazebo通过sdf搭建仿真环境和机器人Husky

    具体格式要求可参考 http sdformat org spec ver 1 6 elem sdf
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • ROS学习(1)——ROS1和ROS2的区别

    因为机器人是一个系统工程 它包括了机械臂结构 电子电路 驱动程序 通信框架 组装集成 调试和各种感知决策算法等方面 任何一个人甚至是一个公司都不可能完成机器人系统的研发工作 但是我们又希望自己能造出一个机器人跑一跑 验证一下自己的算法 所以
  • Ubuntu镜像下载地址

    镜像地址https launchpad net ubuntu cdmirrors
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • Ubuntu下vscode配置ROS环境

    摘要 最近准备放弃用clion开发ROS使用更主流的vscode 整理一下在ubuntu18 04下的VSCode安装和ROS环境配置流程 安装 方法一 软件商店安装 个人还是推荐使用ubuntu软件下载vscode 简单不容易出错 方法二
  • ROS noetic tf demo错误处理及python版本切换

    文章目录 报错描述及解决 ubuntu20 04下python版本切换 报错描述及解决 ubuntu版本 20 04 ROS版本 noetic roslaunch turtle tf turtle tf demo launch 报错信息 t
  • 激光雷达LMS111在ROS上的使用

    LMS111 10100 在ROS上的测试与使用 准备工作 设备 硬件 LMS111 101000激光雷达 软件 ubuntu16 04 ROS 开始 设备连接 将激光雷达与处理器 电脑 工控机等 通过以太网连接好 激光雷达默认的IP地址为
  • open3d-点云读写和显示

    目录 一 点云读取 二 点云写入 二 点云显示 三 open3d支持如下点云文件类型 四 代码及结果示例 一 点云读取 read point cloud filename format auto remove nan points True
  • ROS 第四天 ROS中的关键组件

    1 Launch文件 通过XML文件实现多节点的配置和启动 可自动启动ROS Master
  • 《学习篇》学会这18个常用ROS命令集合就能入门ROS了

    常用ROS命令概述 ROS常用命令可以按照其使用场景分为ROSshell命令 ROS执行命令 ROS信息命令 ROS catkin命令与ROS功能包命令 虽然很难从一开始就很熟练地使用所有的命令 但是随着使用的次数增多 你会发现常用的几个R
  • 将 CUDA 添加到 ROS 包

    我想在 ros 包中使用 cuda 有人给我一个简单的例子吗 我尝试使用 cuda 函数构建一个静态库并将该库添加到我的包中 但总是出现链接错误 未定义的引用 cuda 我已经构建了一个可执行文件而不是库并且它可以工作 请帮忙 我自己找到了
  • ROS安装错误(Ubuntu 16.04中的ROS Kinetic)

    中列出的步骤顺序http wiki ros org kinetic Installat 已被关注 尝试在Ubuntu 16 04中安装ROSkinetic 输入以下命令时出错 sudo apt get install ros kinetic
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • 无法在 Ubuntu 20.04 上安装 ROS Melodic

    我正在尝试使用这些命令在 Ubuntu 20 04 上安装 ROS Melodic sudo sh c echo deb http packages ros org ros ubuntu lsb release sc main gt etc
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新

随机推荐

  • Vue——v-slot父组件调用子组件内的值

    首先声明子组件 设置3个slot插槽 分别为header main和默认插槽
  • QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)

    引言 TCP IP通信 即SOCKET通信 是通过网线将服务器Server端和客户机Client端进行连接 在遵循ISO OSI模型的四层层级构架的基础上通过TCP IP协议建立的通讯 控制器可以设置为服务器端或客户端 关于TCP IP协议
  • Ubuntu 之安装 Jenkins

    前提环境 Jenkins 依赖 Java 环境 Jenkins 下载 https mirrors tuna tsinghua edu cn jenkins war 2 300 地址 http mirrors jenkins ci org 首
  • 10个高效的摸鱼神器,你错过几个?

    老话说的好 Chrome 没插件 香味少一半 作为使用过上百个插件的Chrome半资深用户 这儿极力推荐10个插件 除了摸鱼 还能让你的工作学习效率翻高好几倍 1 Global Speed 视频播放提高至16倍速 以往我们看的视频网站 也就
  • Redis - String内存开销问题以及基本/扩展数据类型的使用

    Redis String内存开销问题以及基本 扩展数据类型的使用 一 String 类型内存开销问题 1 1 SDS 结构 1 2 RedisObject 结构 1 3 String 类型的内存布局优化 1 4 压缩列表的优势 二 Redi
  • [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例

    从2019年7月开始 我来到了一个陌生的专业 网络空间安全 初入安全领域 是非常痛苦和难受的 要学的东西太多 涉及面太广 但好在自己通过分享100篇 网络安全自学 系列文章 艰难前行着 感恩这一年相识 相知 相趣的安全大佬和朋友们 如果写得
  • PyCharm远程连接Spark

    PyCharm远程连接Spark 使用PyCharm连接远程服务器 总结一下完善的步骤 连接前一定要保证集群已经可以运行pyspark程序 1 添加SFTP连接 找到菜单Tool gt Deployment gt Configuration
  • Java学习资料

    Javadoop https javadoop com 公众号 Java学习录 https mp weixin qq com s xqDPttr53rxLBi8t8kIQDg bugstack 虫洞栈 https bugstack cn
  • IO学习系列之使用read和write复制文件内容

    read函数 功能 从文件fd中读取count个字节 存放进指针buf 具体内容 include
  • forest--声明式HTTP客户端框架-spring-b oot项目整合

    Forest 是一个开源的 Java HTTP 客户端框架 它能够将 HTTP 的所有请求信息 包括 URL Header 以及 Body 等信息 绑定到您自定义的 Interface 方法上 能够通过调用本地接口方法的方式发送 HTTP
  • 基于MATLAB的BP神经网络的数据分类

    1 BP神经网络的简介 BP神经网络是一种多层前馈神经网络 该网络的主要特点是信号前向传递 误差反向传播 在前向传递中 输入信号从输出层经隐含层逐层处理 直至输出层 每一层神经元状态只会影响下一层神经元状态 如果输出层得不到期望输出 则转入
  • 添加视频字幕后期制作Premiere Pro 2022中文

    Premiere Pro 2022是一款PR视频剪辑软件 同时支持M1 M2芯片和Intel芯片安装 可以帮助用户提升自己的创作能力和创作自由度 具有易学 高效 精确的优点 可为用户提供采集 剪辑 调色 美化音频 字幕添加 输出 DVD刻录
  • Google发布VS Code,支持Kubernetes应用开发

    VS Code以及IntelliJ适合用来开发本地端应用开发 但在开发云端应用的时候 Google提到 因为本地端与云端执行环境的差异 部分云端应用会抱错误 要在开发周期的后期才能被发现 而Cloud Codes能有效改善这个问题 由于是第
  • Ubuntu实时监控网速、CPU、内存

    Ubuntu实时监控网速 CPU 内存 sudo add apt repository ppa fossfreedom indicator sysmonitor sudo apt get update sudo apt get instal
  • 【Python】数据可视化-散点图绘制

    Python在数据科学中拥有十分重要的地位 numpy scipy pandas scikit learn这些高效易用 接口统一的科学计算包使其在数据分析处理过程更加方便快捷 其强大的数据可视化工具也是重要组成部分 在Python中 使用的
  • linux基本命令与终端操作、linux命令英文全称解释、ls clear cd pwd cat touch cp rm rmdir mkdir mv file find grep sudo su

    linux终端的命令提示符 命令提示符由四部分组成 当前登陆的用户名 主机名 当前所在目录 用户提示符 linux基本命令 查看目录下文件及文件夹 ls 英文全称 助记 list 命令参数 a all 输出所有文件及文件夹 包括隐藏文件 l
  • LoFTR配置运行: Detector-Free Local Feature Matching with Transformers ubuntu18.04 预训练模型分享

    刚装好系统的空白系统ubuntu18 04安装 首先进入 软件与更新 换到国内源 论文下载 代码下载 1 anaconda 3 5 3 安装 Index of anaconda archive 清华大学开源软件镜像站 Tsinghua Op
  • Redis进阶

    一 Redis集群和分布式锁 1 1 Redis集群的概念和优势 Redis集群是一种分布式系统架构 它将多个Redis实例组成一个逻辑集群 实现数据的分布式存储和高可用性 每个Redis实例负责存储集群中的一部分数据 通过节点之间的协调和
  • 【Git】Linux系统下Git的升级

    Git 在很多发行版的 Linux 系统里的版本都很低 比如说比 2 18 这个版本还低 这里比较的一般就是码农的本地环境 因为本地 Mac 系统等等大家经常用到的预装的 Git 的版本都比较深 Git 的版本太低有很多衍生问题 除了本身
  • ROS中使用VLP16激光雷达获取点云数据

    ROS中使用VLP16激光雷达获取点云数据 个人博客地址 本文测试环境为 Ubuntu20 04 ROS Noetic 需要将激光雷达与PC连接 然后在设置 gt 网络 gt 有线中将IPv4改为手动 并且地址为192 168 1 100