New submission from Sébastien Lemetter <sebal...@gmail.com>:

Hi,

I am using an old version, but maybe you can still help me. I am using the ROS 
operating system, and there, the unpack_from function is used for reading 
values from bags.
When I try to read uint16 with the function pointcloud2.readpoint(), it returns 
2 values instead of 1, and I couldn t understand why. Since this readpoint() is 
from the official pointcloud2 package from ros, and unpack_from is from 
official struct package, I don t think I could do many error here. In the 
screenshot, you can see that the inputs parameters seems ok. I am reading a 
field from my bag which is 2 bytes, and the offset (12) make also sense (4th 
value after 3 floats).



def read_points(cloud, field_names=None):

    """

    Read points from a L{sensor_msgs.PointCloud2} message.

 

    @param cloud: The point cloud to read from.

    @type  cloud: L{sensor_msgs.PointCloud2}

    @param field_names: The names of fields to read. If None, read all fields. 
[default: None]

    @type  field_names: iterable

    @param skip_nans: If True, then don't return any point with a NaN value.

    @type  skip_nans: bool [default: False]

    @param uvs: If specified, then only return the points at the given 
coordinates. [default: empty list]

    @type  uvs: iterable

    @return: Generator which yields a list of values for each point.

    @rtype:  generator

    """

    assert isinstance(cloud, roslib.message.Message) and cloud._type == 
'sensor_msgs/PointCloud2', 'cloud is not a sensor_msgs.msg.PointCloud2'

    fmt = _get_struct_fmt(cloud.is_bigendian, cloud.fields, field_names)

    print('fmt size ' , str(struct.calcsize(fmt)))

    print('cloud.height ' , str(cloud.height))

    print('cloud.row_step ' , str(cloud.row_step))

    width, height, point_step, row_step, data, isnan = cloud.width, 
cloud.height, cloud.point_step, cloud.row_step, cloud.data, math.isnan

    unpack_from = struct.Struct(fmt).unpack_from

 

    for v in range(height):

        offset = row_step * v

        for u in range(width):      

            yield unpack_from(data, offset)

            offset += point_step

def callback(data):

    print("pointcloud size is %d bytes" % len(data.data))

    pointCloudArray_a = [1,2,3,4,5]

    #print((data.data.size))

    for indoux in range(4):

        print("==========================")

        print(indoux)

        pointCloudArray_a[indoux] = np.array(list((read_points2(data, 
field_names=(fields_PI6[indoux])))))

Here my mail again if you need more infos:
sebal...@gmail.com

thanks,

----------
files: getIntensity.png
messages: 382017
nosy: sebaleme
priority: normal
severity: normal
status: open
title: struct.unpack_from return 2 values instead of one
type: behavior
Added file: https://bugs.python.org/file49632/getIntensity.png

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue42494>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to