鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    rviz中点云颜色显示

    已定时 已固定 已锁定 已移动 未解决
    综合问题
    rviz 点云 pointcloud2 点云分割
    3
    4
    412
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 3476752953
      AB博洋CD
      最后由 编辑

      由于一些原因,我需要将PointCloud2中的部分点云加上颜色,并在rviz中显示出来,numpy数据的形状为(n,4),以下是我使用的点云属性

      fields = [
      PointField(name='x', offset=0, datatype=PointField.FLOAT32, count=1),
      PointField(name='y', offset=4, datatype=PointField.FLOAT32, count=1),
      PointField(name='z', offset=8, datatype=PointField.FLOAT32, count=1),
      PointField(name='rgb', offset=12, datatype=PointField.UINT32, count=1)
      ]

      在转换过程中,我发现rgb需要32位无符号整数。我将蓝色[0,0,255]转换为255后,rviz中显示的是红色,紫色[128, 0, 128]转为8388736,rviz中显示的是蓝色
      def rgb_to_int(r, g, b):
      return (int(r) << 16 ) | (int(g) << 8 ) | int(b)

      所以,我对rviz中颜色展示非常困惑

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        在RViz中显示点云颜色时,确实需要将RGB颜色值组合成一个32位无符号整数。在你的代码中,你已经正确地定义了一个函数 rgb_to_int 来完成这个任务。然而,你提到在RViz中显示的颜色和你预期的不一致,这可能是由于颜色值的位顺序或颜色解释的问题。

        首先,确保你的 rgb_to_int 函数是正确的。这个函数将RGB值(每个值在0到255之间)转换为一个整数,其中R、G、B分别占据整数的最高、中间和最低8位。这是正确的转换方式:

        def rgb_to_int(r, g, b):
            return (r << 16) | (g << 8) | b
        

        在你的描述中,你提到:

        • 蓝色 [0, 0, 255] 转换为 255 后在RViz中显示为红色。
        • 紫色 [128, 0, 128] 转换为 8388736 后在RViz中显示为蓝色。

        这里似乎有一个误解。实际上,按照你的 rgb_to_int 函数:

        • 蓝色 [0, 0, 255] 应该转换为 0x0000FF(即十进制的16777215),而不是255。
        • 紫色 [128, 0, 128] 应该转换为 0x800080(即十进制的8388736),这是正确的。

        但是,关于颜色显示的问题,可能有以下原因:

        1. 颜色值错误:确保在生成点云数据时,每个点的RGB值都正确无误地通过 rgb_to_int 函数转换。

        2. RViz配置:在RViz中,检查点云的显示设置,确保“Color By”设置为“RGB”,而不是其他选项(如“Intensity”或“Depth”)。

        3. 数据格式:确认你的点云数据格式(如 PointCloud2)完全按照ROS的要求来构建,包括头部(header)、字段(fields)和数据(data)。特别是字段的 offset 和 datatype 必须正确设置。

        4. 数据对齐:由于你使用的是numpy数组,确保在将数据发送到ROS主题之前,数组的数据类型和对齐方式是正确的。例如,你可能需要将numpy数组转换为字节流(使用 .tobytes() 或 .tostring()),因为ROS期望的是原始字节数据。

        5. 驱动和依赖:确保所有相关的ROS包和驱动都是最新的,有时候问题可能是由于软件包的旧版本中的bug导致的。

        如果以上都确认无误,但问题依旧存在,建议通过打印或日志记录的方式检查实际发送到RViz的数据,看看在传输过程中是否有数据被错误地修改或解释。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @347675295
          最后由 编辑

          @347675295 确认下是 rgb 顺序,还是 bgr

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          3476752953 1 条回复 最后回复 回复 引用 0
          • 3476752953
            AB博洋CD @小鱼
            最后由 编辑

            @小鱼 在 rviz中点云颜色显示 中说:

            bgr

            是传入转换函数前的rgb顺序吗?

            1 条回复 最后回复 回复 引用 0
            • 第一个帖子
              最后一个帖子
            皖ICP备16016415号-7
            Powered by NodeBB | 鱼香ROS