Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix lidar near plane clipping #356

Merged
merged 21 commits into from
Oct 19, 2021
Merged

Fix lidar near plane clipping #356

merged 21 commits into from
Oct 19, 2021

Conversation

iche033
Copy link
Contributor

@iche033 iche033 commented Jun 29, 2021

Signed-off-by: Ian Chen [email protected]

🦟 Bug fix

Fixes osrf/subt#888

Summary

In our GPU lidar implementation, the min range currently translates to the near clip plane of the cube camera used to sample the depth values of the scene. This is not correct. The problem is that objects that are near the corner of the image can be incorrectly clipped.

For example, take a lidar with a min range of 1m. An object is now placed at a position at p = [0.9, 0.9, 0] relative to the robot (0.9m in front of it and 0.9m to its left). The object should be visible because it is beyond the min range, i.e. length(p) is sqrt(0.9*0.9 + 0.9*0.9) = 1.27, which is larger than min range. However, the current implementation clips p because the clipping plane is at 1m which is larger than the 0.9.

To fix this, we set a smaller near clip plane for the cube camera and let the shaders handle the clipping of range values.

For comparison, take a look at the point clouds produced by the cerberus gagarin robot in osrf/subt#888. The point clouds at the bottom is box shaped because of incorrect clipping. Here're the point clouds after the fix. It's now a spherical shape :

cerberus_gagarin_points

Testing with ign-gazebo

Another test is to run ign-gazebo with the near_clip.sdf world:

  • Open the Visualize Lidar plugin,
  • Change lidar visual type to Points
  • Refresh the Topic drop down list
  • Hit the play button to run simulation

Checklist

  • Signed all commits for DCO
  • Added tests
  • Updated documentation (as needed)
  • Updated migration guide (as needed)
  • codecheck passed (See contributing)
  • All tests passed (See test coverage)
  • While waiting for a review on your PR, please help review another open pull request to support the maintainers

Note to maintainers: Remember to use Squash-Merge

@github-actions github-actions bot added the 🏢 edifice Ignition Edifice label Jun 29, 2021
@iche033 iche033 changed the base branch from ign-rendering5 to ign-rendering4 June 29, 2021 03:27
@iche033 iche033 added 🔮 dome Ignition Dome and removed 🏢 edifice Ignition Edifice labels Jun 29, 2021
Copy link
Contributor

@ahcorde ahcorde left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  /github/workspace/ogre2/src/Ogre2GpuRays.cc:196:  Missing spaces around =  [whitespace/operators] [4]

@peci1
Copy link
Contributor

peci1 commented Jun 29, 2021

This PR almost completely breaks CTU_CRAS_NORLAB robots with Ouster lidars. I tested with Spot and MARV. I think it is because the newly defined near clip plane is inside the lidar's geometry. The lidar radius is 0.0435 m, min range is set to 0.1. If you take 0.1 * 0.6, it gives 0.06, which means the geometry should not obstruct the view, but apparently, it does (most of the time). I think there is something more related to gazebosim/gz-sensors#128 (see the screenshots with rotated robots). This PR makes the rotated behavior much worse (and the non-rotated, too).

Before:
Snímek obrazovky pořízený 2021-06-29 10-58-13

Snímek obrazovky pořízený 2021-06-29 10-58-40

With this PR:

Snímek obrazovky pořízený 2021-06-29 10-42-37

Snímek obrazovky pořízený 2021-06-29 10-43-01

MARV is affected, too:

Snímek obrazovky pořízený 2021-06-29 11-07-21

Snímek obrazovky pořízený 2021-06-29 11-07-47

Just to get an idea how does the scaling parameter help, I also tried with 0.2 * NearClipPlane(), but it seems the geometry obstruction is now complete:

Snímek obrazovky pořízený 2021-06-29 10-47-54

Snímek obrazovky pořízený 2021-06-29 10-48-24

Isn't there a simple way to tell the gpu lidar to ignore some geometries? At least those attached to the same link as the lidar sensor? (but that would make problems on models which are just a single link, like MARBLE_HUSKY). Or is it possible to turn on backface culling for the robot meshes?

Also, is there a way to visualize the output of the shaders (the depth images) before they go through the 1st and 2nd passes? That could help figuring out a better solution (or finding out where obstructing geometries are).

Increasing the near clip in SDF helps a bit, but still some false points are observed:

0.1 -> 0.2

rviz_screenshot_2021_06_29-11_17_16

0.1 -> 0.5

rviz_screenshot_2021_06_29-11_18_45

@codecov
Copy link

codecov bot commented Jun 29, 2021

Codecov Report

Merging #356 (82a194d) into ign-rendering6 (a28e315) will increase coverage by 0.06%.
The diff coverage is 98.55%.

Impacted file tree graph

@@                Coverage Diff                 @@
##           ign-rendering6     #356      +/-   ##
==================================================
+ Coverage           53.51%   53.58%   +0.06%     
==================================================
  Files                 192      194       +2     
  Lines               19569    19635      +66     
==================================================
+ Hits                10473    10521      +48     
- Misses               9096     9114      +18     
Impacted Files Coverage Δ
...lude/ignition/rendering/ogre2/Ogre2RenderEngine.hh 100.00% <ø> (ø)
ogre2/src/Ogre2IgnHlmsCustomizations.cc 97.61% <97.61%> (ø)
ogre2/src/Ogre2GpuRays.cc 95.40% <100.00%> (+0.09%) ⬆️
ogre2/src/Ogre2IgnHlmsCustomizations.hh 100.00% <100.00%> (ø)
ogre2/src/Ogre2RenderEngine.cc 79.95% <100.00%> (+0.39%) ⬆️
...a/src/Hlms/PbsListener/OgreHlmsPbsTerraShadows.cpp 24.00% <0.00%> (-34.00%) ⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update a28e315...82a194d. Read the comment docs.

@iche033
Copy link
Contributor Author

iche033 commented Jun 29, 2021

At least those attached to the same link as the lidar sensor? (but that would make problems on models which are just a single link, like MARBLE_HUSKY).

yeah I think that may be a problem for other robots and cases where the geometry is meant to be visible.

Or is it possible to turn on backface culling for the robot meshes?

the rendering engine should be doing culling, and just by looking at the Ouster lidar mesh, the mesh actually has triangles facing inwards, hence they are seen by the camera if it's beyond the near clip plane.

I think one solution is to set visibility mask/flags for the lidar and the ouster lidar visual. That way we can tell the sensor to ignore the ouster lidar mesh, and would also be a solution for gazebosim/gz-sensors#128. This would require changes in sdf and ign-sensors, and the robot model.sdf. I'll think about this and see if there is an easier way

@iche033
Copy link
Contributor Author

iche033 commented Jun 29, 2021

Increasing the near clip in SDF helps a bit, but still some false points are observed:

I noticed that. For testing, I removed the sensor mesh and the false points are gone. We def get some weird values when the sensor is inside another geometry.

@peci1
Copy link
Contributor

peci1 commented Jun 30, 2021

We def get some weird values when the sensor is inside another geometry.

Which is, however, very common. I think this deserves a generally usable and good working solution. Or a tutorial for mesh design. Or an automatic warning in console when Gazebo detects all/most points from the lidar projected onto the minimum distance.

One general way I was thinking about was removing triangles which intersect the min-distance sphere (maybe a little inflated). But I don't know how to implement it.

@darksylinc
Copy link
Contributor

darksylinc commented Jul 12, 2021

This problem sounds like it needs a custom piece in HlmsPbs (Ogre 2.1+) to apply custom clipping math.

Whenever the interpolated attribute of a triangle is gl_ClipDistance[i] < 0 (for any i) the triangle at that pixel will not be rendered.

This problem seems like it would need simple math:
gl_ClipDistance[0] = distance( vertexWorldSpacePos, cameraPos ) - passBuf.minLidarRange;

That way geometry will be clipped spherically, while being able to pull the near plane closer without worrying about geometry of the robot that's between the virtual camera pos and the lidar's min range.

How do you want to proceed?

  1. I create a demo showing how to customize HlmsPbs with a custom minLidarRange? (and someone else ports it to ign-rendering)
  2. I customize HlmsPbs directly on ign-rendering, and someone points me which camera class needs minLidarRange and when the customization should be toggled on and when it should be toggled off again

This diagram visually shows the solution:

Untitled

Update: By "customize HlmsPbs" I don't meant modifying Ogre code. I mean using its extensibility options (listeners, custom pieces, or even create a custom class that derives from HlmsPbs) to add custom shader code and pass our own variables to customize rendering without touching Ogre's src.

@iche033
Copy link
Contributor Author

iche033 commented Jul 12, 2021

I customize HlmsPbs directly on ign-rendering, and someone points me which camera class needs minLidarRange and when the customization should be toggled on and when it should be toggled off again

I think we can go for this option. It's great we can do this without modifying ogre code. The envCams in Ogre2GpuRays are the ones that will need this custom clipping:
https://github.com/ignitionrobotics/ign-rendering/blob/ign-rendering4/ogre2/src/Ogre2GpuRays.cc#L870

for now, custom clipping should always be on for these env cameras but not for other cameras. Ideally after the customization is done, we can easily apply them to other cameras later if needed, e.g. we are still considering if we need to do this for Ogre2DepthCamera.

Note that we are currently doing additional clipping in the shaders so I think we'll need to remove that logic: https://github.com/ignitionrobotics/ign-rendering/blob/ign-rendering4/ogre2/src/media/materials/programs/gpu_rays_1st_pass_fs.glsl#L125-L126

@darksylinc
Copy link
Contributor

I think we can go for this option. It's great we can do this without modifying ogre code. The envCams in Ogre2GpuRays are the ones that will need this custom clipping:
https://github.com/ignitionrobotics/ign-rendering/blob/ign-rendering4/ogre2/src/Ogre2GpuRays.cc#L870

Great!

for now, custom clipping should always be on for these env cameras but not for other cameras. Ideally after the customization is done, we can easily apply them to other cameras later if needed, e.g. we are still considering if we need to do this for Ogre2DepthCamera.

Ok!

Note that we are currently doing additional clipping in the shaders so I think we'll need to remove that logic: https://github.com/ignitionrobotics/ign-rendering/blob/ign-rendering4/ogre2/src/media/materials/programs/gpu_rays_1st_pass_fs.glsl#L125-L126

From what you're saying and what I can see, yes that test should be redundant.

I think the clip distance changes won't break API / ABI right?

You asked this one via email but I'm replying it here: I don't think so. API and ABI should not break.
The solution is also fairly simple, not complex code.

@peci1
Copy link
Contributor

peci1 commented Jul 23, 2021

The latest added commit (7fb493b) made a difference - it removed the ball around the lidar, but the far points are still not displayed with the robot rotated.

@iche033 iche033 changed the base branch from ign-rendering4 to main July 27, 2021 17:27
@iche033 iche033 added 🏯 fortress Ignition Fortress and removed 🔮 dome Ignition Dome labels Aug 3, 2021
@nkoenig nkoenig self-requested a review August 9, 2021 20:14
@chapulina chapulina added the beta Targeting beta release of upcoming collection label Sep 8, 2021
@nkoenig
Copy link
Contributor

nkoenig commented Oct 13, 2021

I've noticed some strange behavior. I modified the x1 config 1 model's lidar to have 4 ray samples, such as:

                        <horizontal>
                            <samples>4</samples>
                            <resolution>1</resolution>
                            <min_angle>-2.3562</min_angle>
                            <max_angle>2.3562</max_angle>
                        </horizontal>

The rays produced are truncated, such as in this image:

short_rays

When I increase the samples to 40, I get better results, but some of the side rays are still short.

long_rays

@iche033
Copy link
Contributor Author

iche033 commented Oct 14, 2021

I increased the minimum texture size of the for the raw depth texture that data is sampled from. The currently setup does not work well for large FOV with low sample count. After testing with a 360 degree lidar and 4 samples, I found that I had to increase the min texture size to 128x128 (from 2x2) in order to produce more correct range results. 1f50023

Signed-off-by: Ian Chen <[email protected]>
@peci1
Copy link
Contributor

peci1 commented Oct 15, 2021

With the increase of minimum lidar texture size, wouldn't the performance degrade too much for point lidars? Could you please test it on CTU_CRAS_NORLAB_MARV_SENSOR_CONFIG_1 which has 4 point lidars each simulated by a 3x3 ray lidar, and a 128-ray Ouster?

@darksylinc
Copy link
Contributor

darksylinc commented Oct 15, 2021

Rasterization-based GPUs (vs raytraced-based GPUs) aren't efficient when low resolutions are involved thus I wouldn't be surprised there's not much perf difference between 2x2 and 128x128, nonetheless it'd need to be profiled

Edit: this doesn't apply to CPU emulation (e.g. Mesa SW rasterization)

@iche033
Copy link
Contributor Author

iche033 commented Oct 19, 2021

here's a performance comparison of the 3x3 lidar sensor that I took from the CTU_CRAS_NORLAB_MARV_SENSOR_CONFIG_1 model. The time shown in the graph is the time it takes to render a frame on my machine before (ign-rendering6 branch) and after (lidar_near_clip branch) the change:

lidar_perf_plot

like @darksylinc mentioned, It's good to see that there isn't noticeable difference for this particular lidar configuration. I have an nvidia card / driver and I'm not using SW rendering

As for the VRAM usage, a quick test launching a simple ignition world with a a 3x3 lidar and a box, it increased slightly from 263MB to 268MB, which is small so I think that's acceptable.

@peci1
Copy link
Contributor

peci1 commented Oct 19, 2021

Great, that sounds good. Could you also test with software rendering? Is there actually a way to determine whether SW or HW rendering is used? Maybe different techinques could be used for SW and HW rendering...

@darksylinc
Copy link
Contributor

darksylinc commented Oct 19, 2021

The EGL windowless feature includes a way to select the device (SW mesa appears as a device)

I'm not sure about Nvidia but normally LIBGL_ALWAYS_SOFTWARE=1 environment variable will force sw rendering

If it still doesn't work then try __GLX_VENDOR_LIBRARY_NAME=mesa LIBGL_ALWAYS_SOFTWARE=1

And obviously check Ogre.log to see what driver is being used

@iche033
Copy link
Contributor Author

iche033 commented Oct 19, 2021

If it still doesn't work then try __GLX_VENDOR_LIBRARY_NAME=mesa LIBGL_ALWAYS_SOFTWARE=1

I ran into the another issue doing this. Same error as the one described in this post so I followed one of the methods mentioned there:

Here's what I did:

Xephyr -br -ac -noreset -screen 1920x1080 :2&
DISPLAY=:2 MESA_GL_VERSION_OVERRIDE=3.3  ign gazebo -v 4 lidar.sdf

and that got me SW rendering.

18:12:22: GL Version = 3.3.0.0
18:12:22: GL_VERSION = 3.3 (Compatibility Profile) Mesa 19.2.8
18:12:22: GL_VENDOR = VMware, Inc.
18:12:22: GL_RENDERER = llvmpipe (LLVM 9.0, 256 bits)

Here's the plot. Note I manually removed the time for the first frame as that takes much longer (0.11 seconds) to render and changes the y scale quite a bit

lidar_perf_plot_sw

Probably slightly higher average framerate but hard to tell. So it looks like there also isn't noticeable difference for this lidar configuration.

@iche033 iche033 dismissed ahcorde’s stale review October 19, 2021 05:12

requested change has been addressed

@iche033 iche033 merged commit 7c1430d into ign-rendering6 Oct 19, 2021
@iche033 iche033 deleted the lidar_near_clip branch October 19, 2021 05:13
srmainwaring pushed a commit to srmainwaring/gz-rendering that referenced this pull request Oct 21, 2021
srmainwaring added a commit to srmainwaring/gz-rendering that referenced this pull request Oct 23, 2021
- Update Metal shaders to match changes made in PR gazebosim#356
- Update CrossPlatformSettings_piece to #define outVs_gl_ClipDistance
- Update Ign_piece_vs_any to use cross platform version of gl_ClipDistance

Signed-off-by: Rhys Mainwaring <[email protected]>
srmainwaring added a commit to srmainwaring/gz-rendering that referenced this pull request Nov 1, 2021
- Update Metal shaders to match changes made in PR gazebosim#356
- Update CrossPlatformSettings_piece to #define outVs_gl_ClipDistance
- Update Ign_piece_vs_any to use cross platform version of gl_ClipDistance

- cherry-pick a2a3760

Signed-off-by: Rhys Mainwaring <[email protected]>
srmainwaring added a commit to srmainwaring/gz-rendering that referenced this pull request Nov 3, 2021
- Update Metal shaders to match changes made in PR gazebosim#356
- Update CrossPlatformSettings_piece to #define outVs_gl_ClipDistance
- Update Ign_piece_vs_any to use cross platform version of gl_ClipDistance

- cherry-pick a2a3760

Signed-off-by: Rhys Mainwaring <[email protected]>
srmainwaring added a commit to srmainwaring/gz-rendering that referenced this pull request Nov 7, 2021
- Update Metal shaders to match changes made in PR gazebosim#356
- Update CrossPlatformSettings_piece to #define outVs_gl_ClipDistance
- Update Ign_piece_vs_any to use cross platform version of gl_ClipDistance

- cherry-pick a2a3760

Signed-off-by: Rhys Mainwaring <[email protected]>
srmainwaring added a commit to srmainwaring/gz-rendering that referenced this pull request Nov 9, 2021
- Update Metal shaders to match changes made in PR gazebosim#356
- Update CrossPlatformSettings_piece to #define outVs_gl_ClipDistance
- Update Ign_piece_vs_any to use cross platform version of gl_ClipDistance

- cherry-pick a2a3760

Signed-off-by: Rhys Mainwaring <[email protected]>
srmainwaring added a commit to srmainwaring/gz-rendering that referenced this pull request Nov 9, 2021
- Update Metal shaders to match changes made in PR gazebosim#356
- Update CrossPlatformSettings_piece to #define outVs_gl_ClipDistance
- Update Ign_piece_vs_any to use cross platform version of gl_ClipDistance

- cherry-pick a2a3760

Signed-off-by: Rhys Mainwaring <[email protected]>
srmainwaring added a commit to srmainwaring/gz-rendering that referenced this pull request Nov 9, 2021
- Update Metal shaders to match changes made in PR gazebosim#356
- Update CrossPlatformSettings_piece to #define outVs_gl_ClipDistance
- Update Ign_piece_vs_any to use cross platform version of gl_ClipDistance

- cherry-pick a2a3760

Signed-off-by: Rhys Mainwaring <[email protected]>
ahcorde pushed a commit that referenced this pull request Nov 25, 2021
* [Metal] enable loading of the Metal render system for ogre2

- Add parameter "metal" and a member variable useMetalRenderSystem to Ogre2RenderEngine
- Modify LoadPlugins to load the Metal render system if enabled
- Modify CreateRenderSystem to select the Metal render system
- Modify RegisterHlms to load the Metal resources
- Add missing Metal shaders for the Terra (from Ogre2)

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] enable metal render system for some examples

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] add Metal shader for skybox and update material

- Add Metal shader for skybox
- Update skybox material to support universal shaders
- Create subdirectories for GLSL and Metal in media/materials/programs and update Ogre2RenderEngine with new resource locations

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] add Metal and unified shaders to each material (wip)

- Add Metal and unified shaders to each material
- Add placeholders for a number of shaders to prevent compile errors when running examples

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] enable metal render system for remaining examples [do not merge]

- Note: these changes will need to be modified / reverted before merging

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] update examples to accept optional command line option "metal"

- Examples accept an additional command line option metal when specifying the ogre2 render engine.
- Pass parameters to the createCamera function.

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] fix formatting on example ogre2_demo

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] revert changes to example text_geom

- This example is for ogre only (not ogre2)

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] update formatting of shaders

- Minor formatting changes to plain_color, point and skybox Metal shaders.

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] port depth_camera and selection_buffer shaders

- Port depth_camera_vs and selection_buffer_fs to Metal
- The mouse_picker, ogre2_demo and transform_control demos now work correctly.

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] shader formatting - replace tabs with whitespace

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] port gaussian_noise shaders

- Port gaussian_noise vertex and pixel shaders from the GLSL counterparts
- The ogre2_demo and render_pass examples now work correctly.

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] port thermal_camera pixel shader

- Correct error in thermal material script
- Port thermal_camera pixel shaders from the GLSL counterparts
- The thermal_camera examples now runs but further requires testing

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] add placeholders for remaining shaders

- Add stubs for the remaining vertex and pixel shaders to port from GLSL

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] port heat_signature pixel shader

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] port depth_camera and gpu_rays shaders [wip]

- Initial ports of depth_camera and gpu_rays shaders
- This is work in progress:
	- On Metal the compositor in Ogre2GpuRay has a pixel format exception
	- Texture sampling for depth_camera_final_fs.metal is not using the equivalent of OpenGL's texelFetch

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] update custom_scene_viewer example to accept optional command line option "metal"

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] fix fragment program specifier in gaussian noise material

- Unified shader had incorrect specifier

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] fix depth camera vertex shader not found in selection buffer material

- This is the same issue as fixed in #456

Signed-off-by: Rhys Mainwaring <[email protected]>

* switch to user RGBA format for internal textures in gpu ray sensor

Signed-off-by: Ian Chen <[email protected]>

* [Metal] complete port of gpu rays 1st pass shader

- Complete port of the GPU Rays shader
- This depends upon the pixel format fix in #468

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] update shaders to fix lidar near plane clipping

- Update Metal shaders to match changes made in PR #356
- Update CrossPlatformSettings_piece to #define outVs_gl_ClipDistance
- Update Ign_piece_vs_any to use cross platform version of gl_ClipDistance

Signed-off-by: Rhys Mainwaring <[email protected]>

* Fix style for code check

- Remove line end whitespace causing CI to fail.

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] incorporate review feedback

- Revert debug output in Ogre2RenderEngine
- Fix codecheck issue with variable declaration shadows previous local
- Revert changes to simple_demo_qml
- Move useMetalRenderSystem to Ogre2RenderEnginePrivate

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] introduce enum for graphics interface

- Add enum class GraphicsAPI to RenderEngine.hh
- Add utils class GraphicsAPIUtils for setting enum from string
- Update Ogre2RenderEngine to use GraphicsAPI enum
- Update examples to use GraphicsAPI enum

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] refactor enum for graphics interface

- Move GraphicsAPI to own file

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] fix examples

- Fix custom_scene_viewer

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] fix class description

- Fix code check
- Change GraphicsAPIUtils class documentation
- Improve graphics API check in Ogre2RenderEngine

Signed-off-by: Rhys Mainwaring <[email protected]>

* [Metal] fix codecheck

- Fix code check - uninitialised variable warning

Signed-off-by: Rhys Mainwaring <[email protected]>

Co-authored-by: Ian Chen <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working 🏯 fortress Ignition Fortress
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Strange LIDAR returns for various robots
6 participants