Ask Your Question

Laserscan to PointCloud

asked 2014-06-04 06:33:25 -0500

cobhc999 gravatar image

Hello folks

I need to convert the Laserscanner data from my Hokuyo Laser Range Finder into a PointCloud. I know there is a package called laser_assembler which should do this. But i can't manage to make it working. There's a launch file in the test directory, but this one didnt what i expected. What I need is a launch file, which converts the laserscanners topic /scan to a pointcloud topic /scan_pointcloud for example, so I can visualize it in Rviz as a first step.

I will appreciate any kind of help! Regards,


edit retag flag offensive close merge delete


Do you need a single scan as points or multiple merged ones? The latter is what laser_assembler does. Converting a single scan is rather simple. For visualization in rviz, just use a LaserScan display.

dornhege gravatar image dornhege  ( 2014-06-04 07:44:12 -0500 )edit

I don't need merged ones. Just the actual ones, but not as polar coordinates. I need them as Cartesian coordinates. I know, I can visualize just the laserscan topic in Rviz. But I need them as a pointcloud. In a later approach I have to detect circles in the pointcloud, thats why I need Cartesian coordinates.

cobhc999 gravatar image cobhc999  ( 2014-06-04 08:03:54 -0500 )edit

In that case I'd suggest to just to that manually in the code, unless that is something that you cannot change and needs pointcloud input. Then you could just write a simple node that does the conversion.

dornhege gravatar image dornhege  ( 2014-06-04 10:12:40 -0500 )edit

Ok, I managed to run the assembler and the periodic snapshotter. But it only gets new points after about 4sec. But I cant find the variable to change, which makes the snapshotter publish the points more often.

cobhc999 gravatar image cobhc999  ( 2014-06-06 02:52:59 -0500 )edit

2 Answers

Sort by ยป oldest newest most voted

answered 2014-06-04 12:56:52 -0500

A simple converter node is available via the hector_laserscan_to_pointcloud package. It should be pretty straightforward to use and do what you request.

edit flag offensive delete link more


Hi Stefan I cant find this package on , how can I incorporate this package to my hydro ros?

kost9 gravatar image kost9  ( 2014-10-22 03:51:58 -0500 )edit

The laser_geometry package has the core functions for doing this:

tfoote gravatar image tfoote  ( 2016-05-08 15:10:58 -0500 )edit

answered 2017-08-22 14:51:54 -0500

R. Tellez gravatar image

updated 2017-10-09 03:54:16 -0500

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:

<node type="laser_scan_assembler" pkg="laser_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 type ="" pkg="laser_to_pcl" name="laser2pc"/>

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

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

r = rospy.Rate (1)

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

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


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

edit flag offensive delete link more


This answer would be much more useful if you provided a minimal working example of your launch files/code.

jayess gravatar image jayess  ( 2017-08-31 15:02:08 -0500 )edit

Modified as suggested

R. Tellez gravatar image R. Tellez  ( 2017-10-09 03:54:24 -0500 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower


Asked: 2014-06-04 06:33:25 -0500

Seen: 4,498 times

Last updated: Oct 09 '17