带颜色的3D点云数据发布到ros1中(通过rviz显示)python、C++

news2024/11/28 16:43:27

ros中发布点云数据xyz以及带颜色的点云数据xyzrgb

  • ros中发布点云数据xyz
    • 可以直接用python来做或者C++(看个人偏好)
  • ros中发布带颜色的点云数据xyzrgb
    • 环境
    • 1.新建ROS工作空间
    • 2.创建功能包

ros中发布点云数据xyz

可以直接用python来做或者C++(看个人偏好)

在这里我们带有颜色的点云数据格式为x y z c
其中c值为float型,有四种值1.0,2.0,3.0,4.0
在这里插入图片描述

代码文件b.py,具体内容如下:

import rospy
from sensor_msgs.msg import Image,PointCloud2
from cv_bridge import CvBridge
import numpy as np
import os
import cv2
from a import *
import open3d as o3d

DATA_PATH='/home/cxh/project/0618/point_cloud_selected.txt'
if __name__=='__main__':
    rospy.init_node('jizhui_node',anonymous=True)
    # cam_pub=rospy.Publisher('kitti_cam',Image,queue_size=10)
    pcl_pub=rospy.Publisher('/jizhui_pcl',PointCloud2,queue_size=1)#创建点云发布者,queue_size=10表示消息队列的大小
    bridge=CvBridge()#创建一个CvBridge实例,用于在OpenCV图像与ROS图像消息之间进行转换
    # rate=rospy.Rate(1)#设置发布频率为10Hz
    rate=rospy.Rate(5,reset=True)
    frame=0#初始化帧计数器
    def load_point_cloud(file_path):
        """
        从文本文件中加载点云数据
        """
        point_cloud = []
        color=[]
        with open(file_path, 'r') as f:
            for line in f:
                if line.strip():  # 忽略空行
                    try:
                        # 假设每行的格式为: x y z
                        x, y, z, c= map(lambda x: round(float(x) / 100, 5) if x != line.strip().split()[-1] else float(x), line.strip().split())
                        point_cloud.append([x, y, z])
                        #读取c的值,并把c的值映射成对应RGB值
                        # 1.0:灰色[220,220,220]
                        # 2.0:蓝色[173,216,230]
                        # 3.0:黄色[255,215,0]
                        # 4.0:红色[255,182,193]

                        # r, g, b = color_mapping(c)
                        # color.append([r, g, b])
                        # print("x y z",point_cloud)
                    except ValueError:
                        rospy.logerr("Error parsing line: {}".format(line))
        return np.array(point_cloud)
    
    # 循环播放,通过frame控制帧数
    while not rospy.is_shutdown():#主循环在ROS节点关闭前一直运行
        # 读取点云数据    
        point_cloud= load_point_cloud(DATA_PATH)#,color
        # print("shape:",point_cloud.shape)#49行3列

        publish_pcl(point_cloud,pcl_pub,'map')#调用publish_pcl函数将点云数据发布到ROS主题jizhui_pcl。color,
        # pcl_pub.publish(pcl2_msg)
        rospy.loginfo('published')#在日志中记录发布信息
        rate.sleep()#按照设定的频率进行休眠

文件a.py具体内容如下:

from sensor_msgs.msg import PointCloud2,PointField
import sensor_msgs.point_cloud2 as pcl2


from std_msgs.msg import Header
import rospy
import numpy as np
def publish_pcl(point_cloud,pcl_pub,frame_id):#定义点云数据的ROS发布者。
    if point_cloud.size == 0:
        rospy.logwarn("Empty point cloud data, skipping publish.")
        return
    
    header=Header()
    header.stamp=rospy.Time.now()
    header.frame_id=frame_id

    point_cloud_message=pcl2.create_cloud_xyz32(header,point_cloud)

    pcl_pub.publish(point_cloud_message)

发布到ros的步骤如下

#启动 ROS master
#启动一个终端键入
roscore
#在python文件b.py下运行代码
python b.py
#再另起一个终端键入
rviz

启动了 RViz 后点击界面左下角的Add按钮并添加一个 PointCloud2 显示
即可在 RViz 中看到点云了
**注意:**对于发布带颜色的点云数据,由于python版没有creat_xyzrgb32 ,这个功能函数只有C++有,python的需要自己写一个这样的功能函数。我本人也参考b站博主学习视频链接: 用python将着色点云在ros中发布—解析PointCloud2与Rviz可视化源码弄了一下午没成功,就改用C++来做了!!
(ps这里还有一个特别需要注意的点,就是有的点云图很大且高,小窗口下不容易发现,我们一开始就因为这个问题郁闷了很久,一遍遍检查代码,后来发现早就生成了,只是没有吧窗口放大,多拖拉几下就能找到躲在角落处的点云图!!!)

ros中发布带颜色的点云数据xyzrgb

环境

环境:
Ubuntu20.04
ROS noetic
C++

1.新建ROS工作空间

mkdir -p PointCloundShow_ws/src
cd PointCloundShow_ws/src
catkin_init_workspace
cd ..
catkin_make 

2.创建功能包

cd src
catkin_create_pkg pointcloundshow pcl_ros roscpp rospy sensor_msgs std_msgs 

在功能包的src文件夹下新建cpp文件pcl_colored.cpp
代码文件pcl_colored.cpp内容如下:

#include <ros/ros.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl_conversions/pcl_conversions.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <iostream>
#include <string>

using namespace std;
uint32_t color_mapping(float c) {
    if (c == 1.0) {
        return (220 << 16) | (220 << 8) | 220;  // 灰色
    } else if (c == 2.0) {
        return (173 << 16) | (216 << 8) | 230;  // 
    } else if (c == 3.0) {
        return (255 << 16) | (215 << 8) | 0;  // 
    } else {
        return (255 << 16) | (182 << 8) | 193;  // 
    }
}

void readPointCloudFromFile(const string& filename, pcl::PointCloud<pcl::PointXYZRGB>::Ptr& cloud) {
    ifstream infile(filename);
    if (!infile.is_open()) {
        cerr << "Could not open file: " << filename << endl;
        return;
    }

    string line;
    while (getline(infile, line)) {
        istringstream iss(line);
        float x, y, z, c;
        if (!(iss >> x >> y >> z >> c)) {
            cerr << "Error reading line: " << line << endl;
            continue;
        }
        // 缩小 x, y, z 的值100倍
        x /= 100.0f;
        y /= 100.0f;
        z /= 100.0f;

        pcl::PointXYZRGB point;
        point.x = x;
        point.y = y;
        point.z = z;

        uint32_t rgb = color_mapping(c);
        point.rgb = *reinterpret_cast<float*>(&rgb);
        
        cloud->points.push_back(point);
    }
    cloud->width = cloud->points.size();
    cloud->height = 1;
    cloud->is_dense = true;

    infile.close();
}
int main(int argc, char** argv) {
    // 初始化ROS节点
    ros::init(argc, argv, "pcl_create_xyzrgb");
    ros::NodeHandle nh;

    // 创建一个发布者
    ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2>("pcl_output_colored", 1);

    // 创建一个点云对象
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>());

    // 从文件读取点云数据
    string filename = "/home/cxh/project/0618/point_cloud_selected.txt";
    readPointCloudFromFile(filename, cloud);

    // 将点云数据转换为ROS消息
    sensor_msgs::PointCloud2 output;
    pcl::toROSMsg(*cloud, output);
    output.header.frame_id = "map";

    // 发布点云消息
    ros::Rate loop_rate(1);
    while (ros::ok()) {
        output.header.stamp = ros::Time::now();
        pcl_pub.publish(output);
        ros::spinOnce();
        loop_rate.sleep();
    }

    return 0;
}

然后将下面的编译规则写到功能包的CMakeLists.txt文件中

find_package(PCL REQUIRED) 
include_directories(include${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS}) 
add_executable(pcl_colored.cpp src/pcl_colored.cpp)
target_link_libraries(pcl_colored.cpp ${catkin_LIBRARIES} ${PCL_LIBRARIES})

翻倒CMakeLists.txt文件的最后一行添加,我们的如下:
在这里插入图片描述
如图所示,因为我们用C++写了两个文件,一个是pcl_create.cpp另一个是目前的pcl_colored.cpp,所以我们这个是追加到后面的,供参考!

回到工作空间路径下也就是PointCloundShow_ws,输入catkin_make进行编译
然后再更新一下:source devel/setup.bash(**注意:**只要你修改过你工作空间任何一处代码,每次都需要重新编译和更新!!!另外每新建了一个cpp文件都需要在CMakeLists.txt文件做添加!!!)
然后新起一个终端终端运行roscore指令,
再在刚的source命令那个终端运行rosrun pointcloundshow pcl_create
最后再另起一个终端允许rviz指令

打开rviz
在rviz中左下角点Add增加PointCloud2d
topic 选 /pcl_output
fixed Frame 输入odom
或者直接点左下角的Add然后会弹出一个名字为rviz的框,选择By topic下的对应发布的点云名字
即可看到发布的带有颜色的点云图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1848237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM大模型开发-基础概论

前言 大家好&#xff0c;我是GISer Liu,好久不见&#xff0c;工作之余&#xff0c;我又来参加DataWhale举办的每月学习赛了&#xff1b;期待这个系列文章能帮助各位读者快速入门LLM开发&#xff0c;希望大家喜欢&#xff1b;Github链接已放在文末&#xff1b; 概述 在这篇文章中…

TCP/IP协议,三次握手,四次挥手,常用的协议

IP - 网际协议 IP 负责计算机之间的通信。 IP 负责在因特网上发送和接收数据包。 HTTP - 超文本传输协议 HTTP 负责 web 服务器与 web 浏览器之间的通信。 HTTP 用于从 web 客户端&#xff08;浏览器&#xff09;向 web 服务器发送请求&#xff0c;并从 web 服务器向 web …

鸿蒙开发:【信息传递载体Want】

Want概述 Want的定义与用途 [Want]是一种对象&#xff0c;用于在应用组件之间传递信息。 其中&#xff0c;一种常见的使用场景是作为[startAbility()]方法的参数。例如&#xff0c;当UIAbilityA需要启动UIAbilityB并向UIAbilityB传递一些数据时&#xff0c;可以使用Want作为…

NVIDIA Broadcast+普通麦克风+ai

关于 NVIDIA Broadcast NVIDIA Broadcast 通过 AI 的强大功能将标准网络摄像头和麦克风升级为高级智能设备&#xff0c;将任何房间转变为家庭工作室。通过麦克风噪声和房间回声消除、虚拟背景、网络摄像头自动取景和视频噪声消除等 AI 功能提高直播的视频和音频质量。借助 NVI…

Python基础教程(二十八):pip模块

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

MySQL之复制(九)

复制 复制管理和维护 确定主备是否一致 在理想情况下&#xff0c;备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误&#xff0c;备库同样可能因为MySQL自身的特性导致数据不一致&#xff0c;例如MySQL的Bug、网络中断、服务…

Spring之IoC(容器配置、Spring坐标导入、获取bean)

这里的话&#xff0c;因为博主学习时间有限&#xff0c;并没有实际去操作&#xff0c;只是学习和了解一个大概的流程。 目录 一、引言 1、管理什么&#xff1f;&#xff08;对象&#xff1a;Service、Dao ...&#xff09; 2、如何将被管理的对象告知 IoC 容器?&#xff08;用…

Android入门第70天-调用手机摄像头拍照的最全讲解

背景 涉及手机摄像头的应用太多了,有拍照、有摄像、有二维码、条码的扫描。还有AI领域的拍照识图。 无处不使用摄像头。 网上充斥着大多教程,无一例是可以把摄像头给真正驱动起来和完成一个高清拍照并取出照片进行后续处理的流程。这的确是一个不健康的现象。 本篇教程就是…

Springboot3.3 整合Cassandra 4.1.5

一、数据库搭建 -- 创建Keyspace CREATE KEYSPACE school WITH replication {class:SimpleStrategy, replication_factor : 1};-- 创建表 CREATE TABLE student(id int PRIMARY KEY, name text, age int, genders int, address text ,interest set<text>,phone lis…

qml/c++:基础界面的串口设置逻辑

文章目录 文章介绍效果图本机串口打开从虚拟端串口传数据到本机串口 代码添加serialporthandler类serialporthandler.hserialporthandler.cpp获取串口列表打开串口关闭串口清空按钮接收数据按钮逻辑&#xff1a;打开和关闭串口、弹出信息框、按钮文字改变 main.cpp 文章介绍 上…

快捷方式(lnk)--加载HTA-CS上线

免责声明:本文仅做技术交流与学习... 目录 CS: HTA文档 文件托管 借助mshta.exe突破 本地生成lnk快捷方式: 非系统图标路径不同问题: 关于lnk的上线问题: CS: HTA文档 配置监听器 有效载荷---->HTA文档--->选择监听器--->选择powershell模式----> 默认生成一…

大数据学习-Hive 函数

目录 Hive函数 Hive的内置函数 数学函数 取整函数: round 指定精度取整函数: round 向下取整函数: floor 向上取整函数: ceil 取随机数函数: rand 幂运算函数: pow 绝对值函数: abs 字符串函数 字符串长度函数&#xff1a;length 字符串反转函数&#xff1a;reverse 字…

zookeeper + kafka消息队列

zookeeper kafka 消息队列 一、消息队列简介 1、什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种用于跨进程或分布式系统中传递消息的通信机制。消息队列在异步通信、系统解耦、负载均衡和容错方面具有重要作用。 &#xff08;1&#xff09;特性 异步…

解决Docker容器启动RabbitMQ报错:error pulling image configuration

解决Docker容器启动RabbitMQ报错&#xff1a;error pulling image configuration 问题原因是&#xff1a;Linux中系统时间跟真实时间相差太多导致。 解决办法就是让Linux的时间和网络时间同步就行了。 yum install -y ntpdate ntpdate 0.cn.pool.ntp.org

技术管理转型之战:决策之道-管理中的智慧与策略

文章目录 引言一、决策的重要性二、常见的决策方式1. 理性决策&#xff08;Rational Decision Making&#xff09;2. 有限理性&#xff08;Bounded Rationality&#xff09;3. 直觉决策&#xff08;Intuitive Decision Making&#xff09;4. 循证管理&#xff08;Evidence-Base…

编码规则UTF-8 和 UTF-16的区别

UTF-8 和 UTF-16 的设计背景与历史 为了更好地理解 UTF-8 和 UTF-16 的设计选择和背景&#xff0c;以下是两种编码方案的历史、设计动机和它们在计算机科学中的应用。 Unicode 的背景 在 Unicode 之前&#xff0c;不同的字符集和编码方案使得跨平台和国际化的文本处理变得复…

[网络安全产品]---EDR

写在前面 前端时间看抖音&#xff0c;刷到周鸿祎介绍360为什么这么厉害&#xff0c;他提到一点就是360是全球第一个提出云查杀概念的公司&#xff0c;相比较传统的基于病毒特征库终端杀毒&#xff0c;360依托积累的庞大的信息数据能有效应对APT攻击。 然后又特意找了一下云查…

高阶图神经网络 (HOGNN) 的概念、分类和比较

图神经网络&#xff08;GNNs&#xff09;是一类强大的深度学习&#xff08;DL&#xff09;模型&#xff0c;用于对相互连接的图数据集进行分类和回归。它们已被用于研究人类互动、分析蛋白质结构、设计化合物、发现药物、识别入侵机器、模拟单词之间的关系、寻找有效的交通路线…

oracle12c到19c adg搭建(五)dg搭建后进行切换19c进行数据字典升级

一、备库切主库升级 12c切换为19c主库的时候是由低版本到高版本所以cdb和pdb的数据字典需要进行升级才可以让数据与软件版本兼容。 1.1切换 SQL> alter database recover managed standby database finish; Database altered. SQL> alter database commit to switcho…

C语言 | Leetcode C语言题解之第164题最大间距

题目&#xff1a; 题解&#xff1a; int maximumGap(int* nums, int numsSize) {if (numsSize < 2) {return 0;}int maxVal INT_MIN, minVal INT_MAX;for (int i 0; i < numsSize; i) {maxVal fmax(maxVal, nums[i]);minVal fmin(minVal, nums[i]);}int d fmax(1,…