Package Summary
Tags | No category tags. |
Version | 0.1.0 |
License | BSD |
Build type | CATKIN |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/flynneva/floam.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2021-08-23 |
Dev Status | DEVELOPED |
CI status | Continuous Integration |
Released | RELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
FLOAM
Fast LOAM (Lidar Odometry And Mapping)
This work is an optimized version of A-LOAM and LOAM with the computational cost reduced by up to 3 times. This code is modified from LOAM and A-LOAM .
Modifier: Wang Han, Nanyang Technological University, Singapore
Modifier: Evan Flynn
1. Demo Highlights
Watch our demo at Video Link
2. Evaluation
2.1. Computational efficiency evaluation
Computational efficiency evaluation (based on KITTI dataset):
Platform: Intel® Core™ i7-8700 CPU @ 3.20GHz
| Dataset | ALOAM | FLOAM |
|———————————————-|—————————-|————————|
| KITTI
| 151ms | 59ms |
Localization error:
| Dataset | ALOAM | FLOAM |
|———————————————-|—————————-|————————|
| KITTI sequence 00
| 0.55% | 0.51% |
| KITTI sequence 02
| 3.93% | 1.25% |
| KITTI sequence 05
| 1.28% | 0.93% |
2.2. localization result
2.3. mapping result
3. Prerequisites
3.1 Ubuntu and ROS
Ubuntu 64-bit 18.04 or 20.04
ROS Melodic or Noetic. ROS Installation
3.2. **Install dependencies using rosdep
Install dependencies using rosdep
:
cd /your/catkin_ws
rosdep install --from-paths src --ignore-src -y
Or you can manually install the dependencies below:
3.3. Ceres Solver
Follow Ceres Installation.
3.4. PCL
Follow PCL Installation.
3.5. Trajectory visualization
For visualization purpose, this package uses hector trajectory sever, you may install the package by
sudo apt-get install ros-melodic-hector-trajectory-server
Alternatively, you may remove the hector trajectory server node if trajectory visualization is not needed
4. Build
Make sure to have installed the required dependencies as above before trying to build this package.
4.1 Clone repository:
cd ~/catkin_ws/src
git clone https://github.com/wh200720041/floam.git
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash
4.2 Download test rosbag
Download KITTI sequence 05 or KITTI sequence 07
Unzip compressed file 2011_09_30_0018.zip. If your system does not have unzip. please install unzip by
sudo apt-get install unzip
And this may take a few minutes to unzip the file
cd ~/Downloads
unzip ~/Downloads/2011_09_30_0018.zip
4.3 Launch ROS
roslaunch floam floam.launch
if you would like to create the map at the same time, you can run (more cpu cost)
roslaunch floam floam_mapping.launch
If the mapping process is slow, you may wish to change the rosbag speed by replacing “–clock -r 0.5” with “–clock -r 0.2” in your launch file, or you can change the map publish frequency manually (default is 10 Hz)
4.4 How to use floam nodes
The floam
package provides three nodes: floam_lidar_node
, floam_odom_node
, floam_mapping_node
. Each of these nodes feeds the next with the proper data, so the data flow goes:
-
floam_lidar_node
: detects edges and surfaces of input pointcloud -
floam_odom_node
: estimate odometery based on edges and surfaces -
floam_mapping_node
: combine pointcloud into map using odom estimation
Each node could be ran without the others, however the inputs of each need to be satisifed in order to run properly.
For example, the floam_mapping_node
could be used with any odometry estimation and only requires an odom
topic and a pointcloud
topic. The odom
topic could be coming from robot_localization
or some other source for example.
5. Test on other sequence
To generate rosbag file of kitti dataset, you may use the tools provided by kitti_to_rosbag or kitti2bag
The default settings in the main launch file floam_all.launch
should be set for this recording. See below for instructions on how to adjust the parameters for more fine-tuned performance
6. The Nodes of floam
The floam
package was written in a way to be adjustable and usable for most lidars on the market today. Below is an outline of the parameters that you can adjust to see fine-tune the performance of floam for your device and use-case.
There are three main nodes normally run at once: floam_lidar_node
, floam_odom_node
and floam_mapping_node
. Each one serves a specific purpose and can be ran without the other if needed. The adjustable parameters for each are outlined below.
6.1 floam_lidar_node
The floam_lidar_node
has one primary purpose and that is to consume a single points_topic
and detect edges and surfaces within the pointcloud. Within the node there are many paramters you can adjust to fine-tune this detection process for your use-case.
There are two different flavors of the lidar node for more efficient processing techniques for organized and unorganized pointclouds.
6.1.1. common parameters
-
points_topic
: the raw input pointcloud -
lidar_frame_id
: the frame_id for your lidar (should be the same one that is in the header of yourpoints_topic
) -
frame_id
: new frame_id for edge and surface pointclouds. -
edge_threshold
: the threshold of curfavature of a surface to classify it as an edge. A larger edge threshold means more points will be classified as surfaces (seeline 156
insrc/lidar.cpp
for use). -
min_distance
: ignore points within this distance -
max_distance
: ignore points past this distance
6.1.2 scanning lidar parameters
-
scan_lines
: number of scan lines in the device (i.e. velodyne, ouster types). if you set this value to1
then a kdTree is used to search for neighboring points within a radius (TODO: implement k point search method). -
skip_points
: used as an incrementor to decide which points to run the edge detection (kdTree search) on. Essentially “skipping” the number of points specified (i.e. ifskip_points
is 10, kdTree search will be performed on points 0, 10, 20, etc. in original pointcloud). -
search_radius
: used inkdTree.radiusSearch
function to find all points around a specified point within some radius (meters).
[NOT YET USED]
-
search_k
: used in kdTree search to find k nearset points to specified point. -
period
: period of sensor scan (not used anymore)
6.1.3 imaging lidar parameters
- TODO
6.2 floam_odom_node parameters
-
odom_parent_frame_id
: the parent frame of the odometry estimation, defaults tomap
. -
edge_cloud_topic
: the input pointcloud with labeled edges -
surface_cloud_topic
: the input pointcloud wiht labeled surfaces
6.3 floam_mapping_node parameters
-
map_resolution
: defines the resolution of the final map pointcloud (meters) -
mapping_points_topic
: input pointcloud to create map from -
mapping_odom_topic
: input odom to use to create map -
output_map_topic
: output map pointcloud topic
7.Acknowledgements
Thanks for A-LOAM and LOAM(J. Zhang and S. Singh. LOAM: Lidar Odometry and Mapping in Real-time) and LOAM_NOTED.
Changelog for package floam
0.1.0 (2021-08-22)
- increase mapping odom queue size
- trying to reduce copying
- improve edge and surface detection
- trying to improve edge detection
- rewrote mapping class
- minor fixes for single-scan device
- working for unorganized single scanner
- fix launch files for scanner with 1 scan line
- functional mapping node
- functional odom node
- clean up diff logic, fix edge threshold param name
- more clean up, default to exact sync in launch
- fix frame_id, use variable for nearest k
- use variable for k points to search
- try different algos for predicting odom
- clean up odom estimation classes
- clean up coordinate frames, fix some error prints, transform pointcloud to new frame
- fix odom node, launch files
- make edgeThreshold param
- scanning lidar nodelets functional
- implement scanning lidar logic too
- add ros ci actions
- rewrote mapping nodelet
- change defaults for lidar launch, add approx sync callback for odom
- rewrote odom nodelet
- implemented templates for imager and scanner
- migrate to templates
- split lidar class to scanning and imaging
- edge detection working
- switch to nodelets
- fix launch files
- fix package depends, clean up files
- fix cmake error
- add demo link
- update
- Merge pull request #24 from Chris7462/master Fix some minor issues
- add img
- update rosbag link
- update edge cost
- Fix frame_id names and downSizeFilterSurf and downSizeFilterEdge misplaced
- remove multiple pointcloud subscription
- change video
- add video demo
- change rosbag location
- add floam ssl description
- change frame name
- add resultion setting and add support for velodyne VLP-16
- fix function mismatch problem
- add VLP16 description
- add new points selection rules and some code optimization
- add tf
- add trajectory sever install description
- change rosbag path
- change picture location
- change picture location
- add mapping gif
- add mapping node
- add some comments to code
- change frame name
- add license
- add comments to floam
- remove opencv dependency
- add csome instruction to roslaunch
- add csome instruction to roslaunch
- add csome instruction to roslaunch
- update some comparison
- update some comparison
- update some comparison
- update some comparison
- floam
- Contributors: Evan Flynn, Wang Han 王晗, chris7462, wh200720041
Wiki Tutorials
Package Dependencies
Deps | Name |
---|---|
catkin | |
geometry_msgs | |
nav_msgs | |
roscpp | |
nodelet | |
rospy | |
std_msgs | |
rosbag | |
sensor_msgs | |
tf2 | |
tf2_geometry_msgs | |
eigen_conversions | |
hector_trajectory_server | |
pcl_ros |
System Dependencies
Dependant Packages
Launch files
- launch/floam_mapping.launch
-
- frame_id [default: base_link]
- lidar_frame_id [default: velodyne]
- use_exact_sync [default: true]
- queue_size [default: 10]
- map_resolution [default: 10]
- mapping_points_topic [default: /floam_lidar_node/points_filtered]
- mapping_odom_topic [default: /floam_odom_node/odom]
- output_map_topic [default: /floam_mapping_node/map]
- launch/floam_scanning_lidar.launch
-
- points_topic [default: /velodyne_points]
- frame_id [default: base_link]
- lidar_frame_id [default: velodyne]
- floam_frame_id [default: floam_$(arg lidar_frame_id)]
- max_distance [default: 1000]
- min_distance [default: 0.0]
- edge_threshold [default: 0.05]
- scan_lines [default: 64]
- skip_points [default: 50]
- search_k [default: 10]
- search_radius [default: 0.25]
- node_name [default: floam]
- new_manager [default: true]
- launch/floam_imaging_lidar.launch
-
- points_topic [default: points]
- frame_id [default: base_link]
- lidar_frame_id [default: hfl118_front]
- floam_frame_id [default: floam_$(arg lidar_frame_id)]
- max_distance [default: 90]
- min_distance [default: 0.5]
- node_name [default: floam]
- new_manager [default: true]
- launch/floam_all.launch
-
- isScanning [default: true]
- points_topic [default: /velodyne_points]
- frame_id [default: velodyne]
- lidar_frame_id [default: velodyne]
- floam_frame_id [default: floam_$(arg lidar_frame_id)]
- max_distance [default: 200]
- min_distance [default: 0.5]
- use_exact_sync [default: true]
- queue_size [default: 10]
- edge_threshold [default: 0.05]
- scan_lines [default: 32]
- skip_points [default: 1]
- search_k [default: 10]
- search_radius [default: 0.25]
- period [default: 0.2]
- odom_parent_frame_id [default: map]
- edge_cloud_topic [default: /floam_lidar_node/points_edge]
- surface_cloud_topic [default: /floam_lidar_node/points_surface]
- map_resolution [default: 0.4]
- mapping_points_topic [default: /floam_lidar_node/points_filtered]
- mapping_odom_topic [default: /floam_odom_node/odom]
- output_map_topic [default: /floam_mapping_node/map]
- node_name_base [default: floam]
- manager_name [default: $(arg node_name_base)_manager]
- global_manager_name [default: /$(arg manager_name)]
- new_manager [default: true]
- rviz [default: true]
- launch/floam_odom.launch
-
- frame_id [default: base_link]
- odom_parent_frame_id [default: map]
- use_exact_sync [default: true]
- queue_size [default: 5]
- map_resolution [default: 0.4]
- edge_cloud_topic [default: /floam_lidar_node/points_edge]
- surface_cloud_topic [default: /floam_lidar_node/points_surface]
- odom_topic [default: /floam_odom_node/odom]
- launch/project_depth_image.launch
-
- lidar_name [default: lidar]
- node_name [default: $(arg lidar_name)]
- manager_name [default: $(arg lidar_name)_manager]
- depth_camera_info_topic [default: /$(arg lidar_name)/depth/camera_info]
- depth_image_topic [default: /$(arg lidar_name)/depth/image_raw]
- points_topic [default: /$(arg lidar_name)/depth/points]
- rectify_depth [default: false]
Messages
Services
Plugins
Recent questions tagged floam at Robotics Stack Exchange
Package Summary
Tags | No category tags. |
Version | 0.1.0 |
License | BSD |
Build type | CATKIN |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/flynneva/floam.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2021-08-23 |
Dev Status | DEVELOPED |
CI status | Continuous Integration |
Released | RELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
FLOAM
Fast LOAM (Lidar Odometry And Mapping)
This work is an optimized version of A-LOAM and LOAM with the computational cost reduced by up to 3 times. This code is modified from LOAM and A-LOAM .
Modifier: Wang Han, Nanyang Technological University, Singapore
Modifier: Evan Flynn
1. Demo Highlights
Watch our demo at Video Link
2. Evaluation
2.1. Computational efficiency evaluation
Computational efficiency evaluation (based on KITTI dataset):
Platform: Intel® Core™ i7-8700 CPU @ 3.20GHz
| Dataset | ALOAM | FLOAM |
|———————————————-|—————————-|————————|
| KITTI
| 151ms | 59ms |
Localization error:
| Dataset | ALOAM | FLOAM |
|———————————————-|—————————-|————————|
| KITTI sequence 00
| 0.55% | 0.51% |
| KITTI sequence 02
| 3.93% | 1.25% |
| KITTI sequence 05
| 1.28% | 0.93% |
2.2. localization result
2.3. mapping result
3. Prerequisites
3.1 Ubuntu and ROS
Ubuntu 64-bit 18.04 or 20.04
ROS Melodic or Noetic. ROS Installation
3.2. **Install dependencies using rosdep
Install dependencies using rosdep
:
cd /your/catkin_ws
rosdep install --from-paths src --ignore-src -y
Or you can manually install the dependencies below:
3.3. Ceres Solver
Follow Ceres Installation.
3.4. PCL
Follow PCL Installation.
3.5. Trajectory visualization
For visualization purpose, this package uses hector trajectory sever, you may install the package by
sudo apt-get install ros-melodic-hector-trajectory-server
Alternatively, you may remove the hector trajectory server node if trajectory visualization is not needed
4. Build
Make sure to have installed the required dependencies as above before trying to build this package.
4.1 Clone repository:
cd ~/catkin_ws/src
git clone https://github.com/wh200720041/floam.git
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash
4.2 Download test rosbag
Download KITTI sequence 05 or KITTI sequence 07
Unzip compressed file 2011_09_30_0018.zip. If your system does not have unzip. please install unzip by
sudo apt-get install unzip
And this may take a few minutes to unzip the file
cd ~/Downloads
unzip ~/Downloads/2011_09_30_0018.zip
4.3 Launch ROS
roslaunch floam floam.launch
if you would like to create the map at the same time, you can run (more cpu cost)
roslaunch floam floam_mapping.launch
If the mapping process is slow, you may wish to change the rosbag speed by replacing “–clock -r 0.5” with “–clock -r 0.2” in your launch file, or you can change the map publish frequency manually (default is 10 Hz)
4.4 How to use floam nodes
The floam
package provides three nodes: floam_lidar_node
, floam_odom_node
, floam_mapping_node
. Each of these nodes feeds the next with the proper data, so the data flow goes:
-
floam_lidar_node
: detects edges and surfaces of input pointcloud -
floam_odom_node
: estimate odometery based on edges and surfaces -
floam_mapping_node
: combine pointcloud into map using odom estimation
Each node could be ran without the others, however the inputs of each need to be satisifed in order to run properly.
For example, the floam_mapping_node
could be used with any odometry estimation and only requires an odom
topic and a pointcloud
topic. The odom
topic could be coming from robot_localization
or some other source for example.
5. Test on other sequence
To generate rosbag file of kitti dataset, you may use the tools provided by kitti_to_rosbag or kitti2bag
The default settings in the main launch file floam_all.launch
should be set for this recording. See below for instructions on how to adjust the parameters for more fine-tuned performance
6. The Nodes of floam
The floam
package was written in a way to be adjustable and usable for most lidars on the market today. Below is an outline of the parameters that you can adjust to see fine-tune the performance of floam for your device and use-case.
There are three main nodes normally run at once: floam_lidar_node
, floam_odom_node
and floam_mapping_node
. Each one serves a specific purpose and can be ran without the other if needed. The adjustable parameters for each are outlined below.
6.1 floam_lidar_node
The floam_lidar_node
has one primary purpose and that is to consume a single points_topic
and detect edges and surfaces within the pointcloud. Within the node there are many paramters you can adjust to fine-tune this detection process for your use-case.
There are two different flavors of the lidar node for more efficient processing techniques for organized and unorganized pointclouds.
6.1.1. common parameters
-
points_topic
: the raw input pointcloud -
lidar_frame_id
: the frame_id for your lidar (should be the same one that is in the header of yourpoints_topic
) -
frame_id
: new frame_id for edge and surface pointclouds. -
edge_threshold
: the threshold of curfavature of a surface to classify it as an edge. A larger edge threshold means more points will be classified as surfaces (seeline 156
insrc/lidar.cpp
for use). -
min_distance
: ignore points within this distance -
max_distance
: ignore points past this distance
6.1.2 scanning lidar parameters
-
scan_lines
: number of scan lines in the device (i.e. velodyne, ouster types). if you set this value to1
then a kdTree is used to search for neighboring points within a radius (TODO: implement k point search method). -
skip_points
: used as an incrementor to decide which points to run the edge detection (kdTree search) on. Essentially “skipping” the number of points specified (i.e. ifskip_points
is 10, kdTree search will be performed on points 0, 10, 20, etc. in original pointcloud). -
search_radius
: used inkdTree.radiusSearch
function to find all points around a specified point within some radius (meters).
[NOT YET USED]
-
search_k
: used in kdTree search to find k nearset points to specified point. -
period
: period of sensor scan (not used anymore)
6.1.3 imaging lidar parameters
- TODO
6.2 floam_odom_node parameters
-
odom_parent_frame_id
: the parent frame of the odometry estimation, defaults tomap
. -
edge_cloud_topic
: the input pointcloud with labeled edges -
surface_cloud_topic
: the input pointcloud wiht labeled surfaces
6.3 floam_mapping_node parameters
-
map_resolution
: defines the resolution of the final map pointcloud (meters) -
mapping_points_topic
: input pointcloud to create map from -
mapping_odom_topic
: input odom to use to create map -
output_map_topic
: output map pointcloud topic
7.Acknowledgements
Thanks for A-LOAM and LOAM(J. Zhang and S. Singh. LOAM: Lidar Odometry and Mapping in Real-time) and LOAM_NOTED.
Changelog for package floam
0.1.0 (2021-08-22)
- increase mapping odom queue size
- trying to reduce copying
- improve edge and surface detection
- trying to improve edge detection
- rewrote mapping class
- minor fixes for single-scan device
- working for unorganized single scanner
- fix launch files for scanner with 1 scan line
- functional mapping node
- functional odom node
- clean up diff logic, fix edge threshold param name
- more clean up, default to exact sync in launch
- fix frame_id, use variable for nearest k
- use variable for k points to search
- try different algos for predicting odom
- clean up odom estimation classes
- clean up coordinate frames, fix some error prints, transform pointcloud to new frame
- fix odom node, launch files
- make edgeThreshold param
- scanning lidar nodelets functional
- implement scanning lidar logic too
- add ros ci actions
- rewrote mapping nodelet
- change defaults for lidar launch, add approx sync callback for odom
- rewrote odom nodelet
- implemented templates for imager and scanner
- migrate to templates
- split lidar class to scanning and imaging
- edge detection working
- switch to nodelets
- fix launch files
- fix package depends, clean up files
- fix cmake error
- add demo link
- update
- Merge pull request #24 from Chris7462/master Fix some minor issues
- add img
- update rosbag link
- update edge cost
- Fix frame_id names and downSizeFilterSurf and downSizeFilterEdge misplaced
- remove multiple pointcloud subscription
- change video
- add video demo
- change rosbag location
- add floam ssl description
- change frame name
- add resultion setting and add support for velodyne VLP-16
- fix function mismatch problem
- add VLP16 description
- add new points selection rules and some code optimization
- add tf
- add trajectory sever install description
- change rosbag path
- change picture location
- change picture location
- add mapping gif
- add mapping node
- add some comments to code
- change frame name
- add license
- add comments to floam
- remove opencv dependency
- add csome instruction to roslaunch
- add csome instruction to roslaunch
- add csome instruction to roslaunch
- update some comparison
- update some comparison
- update some comparison
- update some comparison
- floam
- Contributors: Evan Flynn, Wang Han 王晗, chris7462, wh200720041
Wiki Tutorials
Package Dependencies
Deps | Name |
---|---|
catkin | |
geometry_msgs | |
nav_msgs | |
roscpp | |
nodelet | |
rospy | |
std_msgs | |
rosbag | |
sensor_msgs | |
tf2 | |
tf2_geometry_msgs | |
eigen_conversions | |
hector_trajectory_server | |
pcl_ros |
System Dependencies
Dependant Packages
Launch files
- launch/floam_mapping.launch
-
- frame_id [default: base_link]
- lidar_frame_id [default: velodyne]
- use_exact_sync [default: true]
- queue_size [default: 10]
- map_resolution [default: 10]
- mapping_points_topic [default: /floam_lidar_node/points_filtered]
- mapping_odom_topic [default: /floam_odom_node/odom]
- output_map_topic [default: /floam_mapping_node/map]
- launch/floam_scanning_lidar.launch
-
- points_topic [default: /velodyne_points]
- frame_id [default: base_link]
- lidar_frame_id [default: velodyne]
- floam_frame_id [default: floam_$(arg lidar_frame_id)]
- max_distance [default: 1000]
- min_distance [default: 0.0]
- edge_threshold [default: 0.05]
- scan_lines [default: 64]
- skip_points [default: 50]
- search_k [default: 10]
- search_radius [default: 0.25]
- node_name [default: floam]
- new_manager [default: true]
- launch/floam_imaging_lidar.launch
-
- points_topic [default: points]
- frame_id [default: base_link]
- lidar_frame_id [default: hfl118_front]
- floam_frame_id [default: floam_$(arg lidar_frame_id)]
- max_distance [default: 90]
- min_distance [default: 0.5]
- node_name [default: floam]
- new_manager [default: true]
- launch/floam_all.launch
-
- isScanning [default: true]
- points_topic [default: /velodyne_points]
- frame_id [default: velodyne]
- lidar_frame_id [default: velodyne]
- floam_frame_id [default: floam_$(arg lidar_frame_id)]
- max_distance [default: 200]
- min_distance [default: 0.5]
- use_exact_sync [default: true]
- queue_size [default: 10]
- edge_threshold [default: 0.05]
- scan_lines [default: 32]
- skip_points [default: 1]
- search_k [default: 10]
- search_radius [default: 0.25]
- period [default: 0.2]
- odom_parent_frame_id [default: map]
- edge_cloud_topic [default: /floam_lidar_node/points_edge]
- surface_cloud_topic [default: /floam_lidar_node/points_surface]
- map_resolution [default: 0.4]
- mapping_points_topic [default: /floam_lidar_node/points_filtered]
- mapping_odom_topic [default: /floam_odom_node/odom]
- output_map_topic [default: /floam_mapping_node/map]
- node_name_base [default: floam]
- manager_name [default: $(arg node_name_base)_manager]
- global_manager_name [default: /$(arg manager_name)]
- new_manager [default: true]
- rviz [default: true]
- launch/floam_odom.launch
-
- frame_id [default: base_link]
- odom_parent_frame_id [default: map]
- use_exact_sync [default: true]
- queue_size [default: 5]
- map_resolution [default: 0.4]
- edge_cloud_topic [default: /floam_lidar_node/points_edge]
- surface_cloud_topic [default: /floam_lidar_node/points_surface]
- odom_topic [default: /floam_odom_node/odom]
- launch/project_depth_image.launch
-
- lidar_name [default: lidar]
- node_name [default: $(arg lidar_name)]
- manager_name [default: $(arg lidar_name)_manager]
- depth_camera_info_topic [default: /$(arg lidar_name)/depth/camera_info]
- depth_image_topic [default: /$(arg lidar_name)/depth/image_raw]
- points_topic [default: /$(arg lidar_name)/depth/points]
- rectify_depth [default: false]