ROS2开发|将Pointcloud2数据

22 篇文章 1 订阅

描述

我的点云数据发布在"map"坐标系下,我想把这个pointcloud2数据变化至"base_link"坐标系。

解决办法

方法一

找到tf关系,然后调用doTransform函数

#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/point_cloud2.hpp"
#include "geometry_msgs/msg/transform_stamped.hpp"

#include <tf2/transform_datatypes.h>
#include <tf2/utils.h>
#include "tf2_ros/buffer.h"
#include <tf2_sensor_msgs/tf2_sensor_msgs.h> //for tf transform
#include "tf2_ros/transform_listener.h"

....
auto tf_buffer =
      std::make_unique<tf2_ros::Buffer>(this->get_clock());
  auto in = std::make_shared<sensor_msgs::msg::PointCloud2>(); //输入点云
 auto out = std::make_shared<sensor_msgs::msg::PointCloud2>(); //输出点云
 
  
  geometry_msgs::msg::TransformStamped transformStamped;
  try {
    transformStamped = tf_buffer->lookupTransform(
        "base_link", in->header.frame_id, tf2::TimePointZero); 
  } catch (tf2::TransformException &ex) {
      SPDLOG_ERROR("{}", ex.what());
      return;
  }
  tf2::doTransform(*in, *out, transformStamped);

CMAKE文件需要

find_package(catkin REQUIRED COMPONENTS
  rclcpp
  tf2
  tf2_ros
  tf2_sensor_msgs
  geometry_msgs
  sensor_msgs
)

 target_link_libraries(your_node_name
    ${catkin_LIBRARIES}
)

方法二

更简单的方法时=是直接调用tf_bugger的transform函数

auto tf_buffer =
      std::make_unique<tf2_ros::Buffer>(this->get_clock());
  auto in = std::make_shared<sensor_msgs::msg::PointCloud2>(); //输入点云
 auto out = std::make_shared<sensor_msgs::msg::PointCloud2>(); //输出点云
  tf_buffer->transform(*in, *out, "base_link", tf2::durationFromSec(0.1));
  

方法三

PCL-ROS包里也有坐标系变换的功能,我没有仔细研究。感兴趣的同学可以下载源码研究一下
pcl_ros源码

遇到的问题

如果遇到了“未定义的引用“和"undefined reference to "之类的错误,大概率是tf2_sensor_msgs没有引入
在代码中加入

#include <tf2_sensor_msgs/tf2_sensor_msgs.h>```

并在CMAKELIST和package文件里添加tf2_sensor_msgs依赖就可以了

参考连接

ROS论坛里 有个哥们遇到和我一样的问题 参考他的解决办法
一些tf2的小例子
官方关于TF2的教程
官方开发的POINTCLOUD2数据转laserscan数据的源码,里面涉及到坐标系转换

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ROS是一款开源机器人操作系统,它提供了很多方便的工具和库,使得机器人开发变得更加容易。其中点云是常用的传感器数据类型之一,可以通过ROSPointCloud2消息类型来传输点云数据。 在ROS中,可以使用tf库来进行点云的变换操作。tf库提供了很多方便的API,可以让用户轻松地实现点云的旋转变换。需要完成点云旋转变换的一般流程如下: 1. 获取点云数据:使用PointCloud2消息类型订阅点云数据。 2. 设置变换关系:使用tf库中的TransformBroadcaster节点发布相应的变换矩阵(即旋转矩阵和平移矩阵)。 3. 进行点云变换:使用PointCloudLibrary(PCL)库中的pcl_ros::transformPointCloud函数对点云进行变换。 具体的操作步骤如下: 1. 订阅点云数据ros::Subscriber sub = nh.subscribe("/point_cloud_topic", 1, cloudCallback); //点云回调函数 void cloudCallback(const sensor_msgs::PointCloud2ConstPtr& input){  //根据输入的点云进行处理 } 2. 设置变换关系: //这里以z轴旋转90°为例,设置相应的变换矩阵 tf::Transform transform; transform.setOrigin(tf::Vector3(0.0, 0.0, 0.0)); tf::Quaternion q; q.setRPY(0, 0, 1.57); transform.setRotation(q); //发布变换矩阵 tf::TransformBroadcaster br; br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "source_frame", "target_frame")); 3. 进行点云变换: //创建pcl::PointCloud对象 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); //将received_cloud变换到新坐标系下 pcl_ros::transformPointCloud("target_frame", *input, *cloud, listener); 以上就是使用ROS进行点云旋转变换的基本步骤。需要注意的是,变换矩阵的设置需要根据具体的变换情况进行调整,同时在进行变换操作时也需要考虑坐标系的问题,使用TransformBroadcaster和PointCloudLibrary库可以方便地完成点云坐标系的转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值