ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Hi, I have been playing around with the laser_assembler package and managed to make it work for assembling several laser scans into a single point cloud, and publish that point cloud on a topic.

What I have done is the following: 1- I create a package that will handle all the logic 2- On the launch file of that package, I launch the laser_assembler properly configured and my own node 3- My node subscribes to the service of the laser_assembler that provides point clouds 4- Then it calls the service, gets the response, and then publishes on a topic as a single PointCloud2 message

I have created a video describing step by step and code solution. In case you are interested, you can find it here

Hi, I have been playing around with the laser_assembler package and managed to make it work for assembling several laser scans into a single point cloud, and publish that point cloud on a topic.

What I have done is the following: 1- following:

  1. I create a package that will will handle all the logic 2- logic
  2. On the the launch file of that package, I I launch the laser_assembler properly properly configured and my own node 3- My node
  3. My node subscribes to the service of of the laser_assembler that provides provides point clouds 4- clouds
  4. Then it calls the the service, gets the response, and then then publishes on a topic as a single single PointCloud2 message

I have created a video describing step by step and code solution. In case you are interested, you can find it here

Hi, I have been playing around with the laser_assembler package and managed to make it work for assembling several laser scans into a single point cloud, and publish that point cloud on a topic.

What I have done is the following:

  1. I create a package that will handle all the logic
  2. On the launch file of that package, I launch the laser_assembler properly configured and my own node
  3. My node subscribes to the service of the laser_assembler that provides point clouds
  4. Then it calls the service, gets the response, and then publishes on a topic as a single PointCloud2 message

How to do it ===========

Using Python to do the conversion simplifies a lot. Let's see how to do that using the laser_geometry package.

First, you need to launch the laser_geometry package from a launch file, properly configured. Here a suggested launch file:

<launch>
<node type="laser_scan_assembler" pkg="laser_assembler"
    name="my_assembler">
<remap from="scan" to="laser_scan"/>
<param name="max_scans" type="int" value="400" />
<param name="fixed_frame" type="string" value="my_robot_link_base" />
 </node>
  <node type ="laser2pc.py" pkg="laser_to_pcl" name="laser2pc"/>
</launch>

That file launches the laser_geometry package indicating that the frame from which the transform will be done is the my_robot_link_base (that is whatever tf link of your robot you want the point cloud to be refered from). Another parameter is the max_scans which indicates the max number of last scans that will be take into account for the computation of the point cloud ( this is useful in case your laser is rotating, so you can generate a full 3D cloud).

The launch file above also launches a second node that is the one you have to create to get the data and publish it into your selected topic. What should be the code of such a node? Check the following:

#!/usr/bin/env python

import rospy 
from laser_assembler.srv import AssembleScans2
from sensor_msgs.msg import PointCloud2

rospy.init_node("assemble_scans_to_cloud")
rospy.wait_for_service("assemble_scans2")
assemble_scans = rospy.ServiceProxy('assemble_scans2', AssembleScans2)
pub = rospy.Publisher ("/laser_pointcloud", PointCloud2, queue_size=1)

r = rospy.Rate (1)

while (True):
    try:
        resp = assemble_scans(rospy.Time(0,0), rospy.get_rostime())
        print "Got cloud with %u points" % len(resp.cloud.data)
        pub.publish (resp.cloud)

    except rospy.ServiceException, e:
        print "Service call failed: %s"%e

    r.sleep()

The code shows how to subscribe to the assemble_scans2 service. That is the one that will provide the point cloud on its answer. The code also shows that the point cloud will be published on a topic of type PoinCloud2. basically, the while loop what it does is, first, call to the service, then publish the answer of the service into a topic.

I have created a video describing step by step and code solution. In case you are interested, you can find it here