Refactor PointcloudColorHandlerGenericField to deal with any field type#6309
Conversation
|
I ran the formatter to put my changes in these files, but unfortunately this has resulted in a large diff, as they seemed to not have followed the clang-format style file before. |
The style file has only been added a few years ago, and most of the code is not yet formatted according to it. We are slowly formatting more and more files, but we cannot format any files that are changed in any open pull request (otherwise the pull request would have merge conflicts and basically be lost). Unfortunately, with the formatting changes mixed in, this pull request is very difficult to review, as it is very time consuming to look for the changes you wanted to make originally. Is there any way you can revert the formatting changes in this pull request?
To be honest, I am not sure, but it is probably there for a reason so I would like to keep it. However, instead of the current structure (if-condition, then two for-loops, one for each case), you could probably merge the for-loops into one, then check something like |
88d0563 to
2556e89
Compare
|
I have recommitted without formatting changes outside of the affected class. also added the handling of non-xyz data as suggested, but have not tested it yet. |
…lerGenericField class
b5bfae2 to
7e7f343
Compare
|
CI seems to pass, i guess i should add some kind of test? |
That would be great. My suggestion: create a small cloud with maybe 4-5 points (manually), pass to color handler, then check if the array returned by |
|
Added a test which passes for me locally, but I don't think CI builds the visualization tests. (they are also disabled on macos, because the code only checks for UNIX + DISPLAY set, which doesn't exist on macos) |
Its run on the ubuntu CI's using xvfb - so should be good 👍 |
|
Can I get a review? |
|
|
||
|
|
||
| // Get point step. Does not directly exist in pcl::PointCloud | ||
| template <typename CloudT> inline int getPointStep(const CloudT&) |
There was a problem hiding this comment.
I would add these getters to their respective classes - even though they currently only a used here, I don't see why it shouldn't belong to the point_cloud/PCLPointCloud2 classes.
There was a problem hiding this comment.
I would rather not add these as getters, I don't think they would be used that often
|
|
||
|
|
||
| // Get point step. Does not directly exist in pcl::PointCloud | ||
| template <typename CloudT> inline int getPointStep(const CloudT&) |
There was a problem hiding this comment.
I would rather not add these as getters, I don't think they would be used that often
|
I've moved some functions to io.h/hpp, but not kept some where they are since there are differing opinions it seems. I'm a bit annoyed that due to the new getFields() specialization we now get many of these warnings for all code that uses it with |
275ea83 to
230e469
Compare
| virtual std::string | ||
| getName () const { return ("PointCloudColorHandlerGenericField"); } | ||
| /** \brief Name of the field used to create the color handler. */ | ||
| std::string field_name_; |
There was a problem hiding this comment.
Could this be private, like before?
Co-authored-by: Markus Vieth <39675748+mvieth@users.noreply.github.com>
| return std::distance(fields.begin(), result); | ||
| } | ||
|
|
||
| // Cloud type agnostic isXYZFinite wrappers to check if pointcloud or PCLPointCloud2 at |
There was a problem hiding this comment.
Should we move these XYZFinite next to the others in https://github.com/PointCloudLibrary/pcl/blob/f5fd21531b6cb19724227490949e66b5ce171075/common/include/pcl/common/point_tests.h ?
There was a problem hiding this comment.
Hmm, maybe not, since one of the methods require getFieldIndex, which would give circular dependency.
|
Resolve conflict and its 👍 from here. |
|
Conflict resolved |
| } | ||
| } | ||
|
|
||
| const size_t point_offset = this->fields_[this->field_idx_].offset; |
There was a problem hiding this comment.
| const size_t point_offset = this->fields_[this->field_idx_].offset; | |
| size_t point_offset = this->fields_[this->field_idx_].offset; |
const does not work here
There was a problem hiding this comment.
god dammit, i was surprised to learn executing the tests does not recompile the modules they depend on.
fixed
There was a problem hiding this comment.
How do you execute the tests? If you run the CMake target tests (e.g. like cmake --build . -- tests), then it should recompile the modules (if it doesn't, something may be broken?). If you just run the executable file (e.g. test_visualization), then it will of course not rebuild anything.
c7a7597 to
cdb5da7
Compare
| switch (type) { | ||
| case pcl::PCLPointField::PointFieldTypes::FLOAT32: | ||
| return reinterpret_and_cast<float, T>(data); | ||
| break; | ||
| case pcl::PCLPointField::PointFieldTypes::UINT8: | ||
| return reinterpret_and_cast<std::uint8_t, T>(data); | ||
| break; | ||
| case pcl::PCLPointField::PointFieldTypes::UINT16: | ||
| return reinterpret_and_cast<std::uint16_t, T>(data); | ||
| break; | ||
| case pcl::PCLPointField::PointFieldTypes::UINT32: | ||
| return reinterpret_and_cast<std::uint32_t, T>(data); |
There was a problem hiding this comment.
i noticed today in other code doing this, that UBSAN complains here about misaligned loads on some types. i.e. if the PCLPointCloud2 point data has first a uint8 field, then a uint16 field, the latter will start at an odd address, which apparently is not allowed for this type. so for everything larger than 8 bits, one would have to memcpy the data instead of just reinterpreting it.
Resolves #6306
Partially resolves #6186