• ROS之pcl_ros


    1 概要:PCL(Point Cloud Library)ROS接口堆,PCL_ROS是在ROS中涉及n维点云和3D几何处理的3D应用的首选桥梁。这个包提供运行ROS和PCL的接口和工具,包括nodelets、nodes和c++接口

    2 源码地址: git  https://github.com/ros-perception/perception_pcl.git (branch: indigo-devel)

    3 ROS nodelets

    pcl_ros包括一些PCL filters包作为ROS nodelets。下面的连接提供使用这些接口的详细描述

    4 ROS C++接口

    pcl_ros扩展ROS C++客户端库,用来支持和PCL原始消息类型的消息传递,添加下面的头文件在你的ROS节点的源码中

    #include <pcl_ros/point_cloud.h>

    这个头文件允许你发布和订阅pcl::PointCloud<T>对象作为ROS消息。这好像ROS作为sensor_msgs/PointCloud2消息,与非PCL的ROS节点无缝连接。例如,你可以在一个节点中发布pcl::PointCloud<T>和在rviz中使用Point Cloud2 display可视化,它通过挂在到roscpp serialization infrastructure起作用。

    注意:旧的形式——sensor_msgs/PointCloud已经不在PCL中支持。

    4.1 发布点云

    你可以发布点云,使用标准的ros::Publisher

    #include <ros/ros.h>
    #include <pcl_ros/point_cloud.h>
    #include <pcl/point_types.h>
    
    typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
    
    int main(int argc, char** argv)
    {
      ros::init (argc, argv, "pub_pcl");
      ros::NodeHandle nh;
      ros::Publisher pub = nh.advertise<PointCloud> ("points2", 1);
    
      PointCloud::Ptr msg (new PointCloud);
      msg->header.frame_id = "some_tf_frame";
      msg->height = msg->width = 1;
      msg->points.push_back (pcl::PointXYZ(1.0, 2.0, 3.0));
    
      ros::Rate loop_rate(4);
      while (nh.ok())
      {
        msg->header.stamp = ros::Time::now().toNSec();
        pub.publish (msg);
        ros::spinOnce ();
        loop_rate.sleep ();
      }
    }

    4.2 订阅点云

    你也可以订阅点云,使用标准的ros::Subscriber

    #include <ros/ros.h>
    #include <pcl_ros/point_cloud.h>
    #include <pcl/point_types.h>
    #include <boost/foreach.hpp>
    
    typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
    
    void callback(const PointCloud::ConstPtr& msg)
    {
      printf ("Cloud: width = %d, height = %d
    ", msg->width, msg->height);
      BOOST_FOREACH (const pcl::PointXYZ& pt, msg->points)
        printf ("	(%f, %f, %f)
    ", pt.x, pt.y, pt.z);
    }
    
    int main(int argc, char** argv)
    {
      ros::init(argc, argv, "sub_pcl");
      ros::NodeHandle nh;
      ros::Subscriber sub = nh.subscribe<PointCloud>("points2", 1, callback);
      ros::spin();
    }

    5 ROS节点

    一些工具可以作为ROS节点运行。它们把ROS消息或包(bags)变为/读取 Point Cloud Data (PCD)文件形式。

    5.1 bag_to_pcd

    读取一个包文件,保存所有ROS点云消息在指定的PCD文件

    5.1.1 用法

    rosrun pcl_ros bag_to_pcd <input_file.bag> <topic> <output_directory>

    这里,<input_file.bag>是一个要读取的包文件

    <topic>是消息包中的话题,包括保存的消息

    <output_directory> 是一个PCD文件的保存位置

    5.1.2 示例

    rosrun pcl_ros bag_to_pcd data.bag /laser_tilt_cloud ./pointclouds

    5.2 把pcd转化为image

    加载PCD文件,发布它作为一个ROS image消息,一秒发5次

    5.2.1 发布话题

    output (sensor_msgs/Image

    一个从PCD文件中生成的图像流

    5.2.2 用法

    rosrun pcl_ros convert_pcd_to_image <cloud.pcd>

    读取在<cloud.pcd>点云,以5Hz的频率发布ROS图像消息。

    5.3 把点云转为图像

    订阅一个ros点云话题和重发布图像消息。

    5.3.1 订阅话题

    input (sensor_msgs/PointCloud2)  一个点云转化为图像的消息流

    5.3.2 发布话题

    output (sensor_msgs/Image) 对应图像的消息流

    5.3.3 示例

    订阅/my_cloud topic和在/my_image话题重发布消息

    rosrun pcl_ros convert_pointcloud_to_image input:=/my_cloud output:=/my_image

    为了看见图像,使用

     rosrun image_view image_view image:=/my_image

    5.4 pcd到pointcloud

    加载一个PCD文件,把它发布为一个点云消息

    5.4.1 发布话题

    cloud_pcd (sensor_msgs/PointCloud2) :一个由PCD文件生成的点云消息流

    5.4.2 参数

    ~frame_id (str, default: /base_link)  :对于发布数据的变换坐标系ID

    5.4.3 用法

    rosrun pcl_ros pcd_to_pointcloud <file.pcd> [ <interval> ]

    5.4.4 示例

    rosrun pcl_ros pcd_to_pointcloud point_cloud_file.pcd

    or

    rosrun pcl_ros pcd_to_pointcloud cloud_file.pcd 0.1 _frame_id:=/odom

    第二个指令发布10次/秒 在/odom参考坐标系

    5.5  pointcloud_to_pcd

    订阅一个ROS话题,保存点云为PCD文件,每一个消息保存为一个独立的文件,名称由可选的前缀参数、消息的ROS时间和.pcd扩展名组成。

    5.5.1订阅主题

    输入sensor_msgs / PointCloud2

    • 点云流保存为PCD文件。

    5.5.2参数

    前缀str

    • 创建PCD文件名的前缀。

    5.5.3例子

    订阅/ velodyne / pointcloud2话题并将每条消息保存在当前目录中。文件名看起来像1285627014.833100319.pcd,具体名称取决于消息的时间戳。

     rosrun pcl_ros pointcloud_to_pcd input:=/velodyne/pointcloud2

    在当前命名空间中设置prefix参数,将消息保存到名称为/tmp/pcd/vel_1285627015.132700443.pcd的文件中

     rosrun pcl_ros pointcloud_to_pcd  input:=/my_cloud   _prefix:=/tmp/pcd/vel_

    参考文献:http://wiki.ros.org/pcl_ros?distro=indigo

  • 相关阅读:
    POJ 3352&&3177 (割边 && 边双连通分量)
    .net程序员的盲点(二):两个“属性”引起的歧异
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    args argc argv 的意思以及英文缩写
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    .net程序员的盲点(一):参数修饰符ref,out ,params的区别
    args argc argv 的意思以及英文缩写
    args argc argv 的意思以及英文缩写
  • 原文地址:https://www.cnblogs.com/qixianyu/p/6607440.html
Copyright © 2020-2023  润新知