hku-mars / balm Goto Github PK
View Code? Open in Web Editor NEWAn efficient and consistent bundle adjustment for lidar mapping
License: GNU General Public License v2.0
An efficient and consistent bundle adjustment for lidar mapping
License: GNU General Public License v2.0
Dear authors,
Thank you for the great work.
I have run the simulation/consistency app, the saved covariance matrix of the estimated poses (100 poses) is in the attached txt file. The values look fine, agreeing with the fact that the computed NEES value is as expected (600).
So I also try to compute the covariance matrix in the benchmark_realworld app.
The default app does not support Rcov, so I have made a few seemingly innocuous changes including
Then the app is run for the first 61 scans (to save computation for a test) of the benchmark_realworld data.
The saved covariance is also attached as a txt file.
The covariance entries for the position error states is very large say 100000, as we expect very small values.
Can you please inform me about how to fix this issue?
Hello, author, I am very sorry to bother you. I deduced the first-order and second-order derivatives according to the relevant formulas given in Theorem 4 in the paper Efficient and Consistent Bundle Adjustment on Lidar Point Clouds, but they are not exactly the same as those given in the source code, Have you made relevant omissions in the source code? Can you give me some advice? thank you very much.
Thank you for your excellent work,In outdoor scenes, the point cloud is corrected by using the optimized posture, and the point cloud becomes very poor。I tried modifying the following parameters to make the input plane feature as good as possible(eigen_value_array and voxel_size),I don't know where the problem is。
Dear Author, thanks for your great work.
I build the sliding window LIO using BALM 2.0. After calling opt_lsv.damping_iter(...) function, the total memory occupancy increase, about 100MB each time. Any advise?
Waiting for your kindly reply.
great work ! I have one little question, why you weighted line feature in bundle adjustment ?
BALM/src/benchmark/benchmark_virtual.cpp
Line 467 in df9a376
x_stats[j].p =
x_stats[j].p - x_stats[j].R * x_stats[0].R.transpose() * x_stats[0].p;
x_stats[j].R = x_stats[j].R * x_stats[0].R.transpose();
fixed code:
x_stats[j].p = x_stats[0].R.transpose() *(x_stats[j].p - x_stats[0].p);
x_stats[j].R = x_stats[0].R.transpose() * x_stats[j].R;
Dear Author.
Hello! Sorry to disturb you, I have a question to ask you. We have a scene data of 3081 frames and using BALM 2.0 to optimize him, it results in memory overflow. Therefore, we would like to use a sliding window to optimize the whole scene step by step. Could you please tell me the size of the sliding window and what is the right number of frames to set for each slide, or your suggestion for parameter setting. Thank you very much!
Great job! Thanks for this.
Do you plan to open sources under any standard license (possibly permissive, such as MIT or BSD)? Without a license, it cannot be used in any open or closed source projects.
Please someone can explain me how can I save the final point cloud map, in pcd or any other format?
thanks
class SIG_VEC_CLASS
{
public:
Eigen::Matrix3d sigma_vTv;
Eigen::Vector3d sigma_vi;
int sigma_size;
SIG_VEC_CLASS()
{
sigma_vTv.setZero();
sigma_vi.setZero();
sigma_size = 0;
}
void tozero()
{
sigma_vTv.setZero();
sigma_vi.setZero();
sigma_size = 0;
}
};``
Dear author, thanks for your excellent work.I read the paper and the code recently, but some questions in my mind.
firstly, it is why the position left_update left multiply dR, specifics in damping_inter function? as I think the dR is not necessary.
the second,why do the transformation which transfer x_states to the pose relative to es0.
Hei. When is your next version coming? Just curious!
Great work .
Thanks for your research. I want to ask something about the edge feature of the BA formulation. How is it derived? Can you give some tricks or ways? Thx a lot!
Hi,
Thanks for your work and thanks for trying on NTU VIRAL dataset. The accuracy with only one lidar is quite impressive.
May I ask if you have any launch file or config for running the code with the NTU VIRAL dataset? We will be linking your work to our website https://ntu-aris.github.io/ntu_viral_dataset/
Regards
when i use 128 line lidars for 60 frames data ,it crashes ,but when i use just 30 frames data , it works fine . why is that happened ,and how can i improve it ?
When I run "roslaunch balm balm_horizon_outdoor.launch", Tthen the following appeared:
"
SUMMARY
PARAMETERS
* /N_SCANS: 6
* /accumulate_window: 1
* /blind: 0.5
* /corn_filter_length: 0.2
* /cos160: 160.0
* /disA: 0.01
* /disB: 0.1
* /edgea: 2.0
* /edgeb: 0.1
* /group_size: 8
* /inf_bound: 10.0
* /jump_down_limit: 8.0
* /jump_up_limit: 170.0
* /lidar_type: 1
* /limit_maxmid: 6.25
* /limit_maxmin: 3.24
* /limit_midmin: 6.25
* /p2l_ratio: 225.0
* /point_filter_num: 3
* /pub_skip: 5
* /root_corn_voxel_size: 1.0
* /root_surf_voxel_size: 1.0
* /rosdistro: melodic
* /rosversion: 1.14.10
* /scan2map_on: 0
* /smallp_intersect: 172.5
* /smallp_ratio: 1.2
* /surf_filter_length: 0.4
NODES
/
balm_front_back (balm/balm_front_back)
livox_feature (balm/livox_feature)
rviz (rviz/rviz)
auto-starting new master
process[master]: started with pid [13140]
ROS_MASTER_URI=http://localhost:11311
setting /run_id to 59753fca-8dfc-11eb-ae62-3c7c3f527e1a
process[rosout-1]: started with pid [13151]
started core service [/rosout]
process[livox_feature-2]: started with pid [13158]
process[balm_front_back-3]: started with pid [13159]
process[rviz-4]: started with pid [13165]
HORIZON
1.000000 1.000000
balm_front_back: /usr/include/eigen3/Eigen/src/Core/DenseStorage.h:128: Eigen::internal::plain_array<T, Size, MatrixOrArrayOptions, 32>::plain_array() [with T = double; int Size = 4; int MatrixOrArrayOptions = 0]: Assertion `(internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (31)) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****"' failed.
[balm_front_back-3] process has died [pid 13159, exit code -6, cmd /home/scale/catkin_ws/devel/lib/balm/balm_front_back __name:=balm_front_back __log:=/home/scale/.ros/log/59753fca-8dfc-11eb-ae62-3c7c3f527e1a/balm_front_back-3.log].
log file: /home/scale/.ros/log/59753fca-8dfc-11eb-ae62-3c7c3f527e1a/balm_front_back-3*.log
[rviz-4] process has finished cleanly
log file: /home/scale/.ros/log/59753fca-8dfc-11eb-ae62-3c7c3f527e1a/rviz-4*.log
^C[livox_feature-2] killing on exit
[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done
"
How can I solve this problem?
(PS: I did not compile successfully before. I modified the CMakeLists.txt and changed the "add_executable" of "add_executable(velodyne_feature src/features/velodyne_feature.cpp)" to "add_library". After the change, it can be compiled)
When I run the balm_velo16.launch(I use the rs_lidar16,change the topic name),the frame rate is very low,even my computer is very lagging.I use the same bag in the lego_loam have not this problem.Is the problem with the algothrim?
Dear authors,
I appreciate your great work.
This question arises from the code line
center += 3 * sqrt(eva0) * direct;
To me, this line shifts the center along the minor axis by 3 sigma.
The following lines split the voxel into 8 cubes, and check their planarity based on the minimum eigenvalue.
All sounds reasonable except for the above line.
So why the shift?
Ubuntu 18.04. ROS Melodic.
PCL 1.8.0
Eigen 3.3.4
CERES 1.1.4
openCV3.2
.
BALM/src/benchmark/bavoxel.hpp
Line 771 in d91afa9
@Zale-Liu looks like cut_func(win_count-1);
not need
because it has recurrsive call for each leaf node. here:
BALM/src/benchmark/bavoxel.hpp
Line 773 in d91afa9
Hello! Thank you for publishing your tool! Could you please comment on what perturbation of gt trajectory was used for realworld benchmark? I've not found this information in the paper text, there is only information for synthetic environments.
Dear Author,
Thank you for your work. Are there any tactics about changing the eigen value array? The results seem to be very sensitive about the array.
Dear Author, thanks for your great work.
As you might know, LiDAR BA may fall into degeneracy in structure-less environments. Do you recently have plans for solving such a problem by combining visual cues, sth like a combination of SFM and BALM?
Hi all,
I am trying to reproduce your execellent work on HILTI. Just a quick(and maybe irrelavant :D) question to ask: Where did you guys find the ground-true pose of HILTI 2023 datasets. I couldn't find any sources on the main page. While in your paper's Section VI-B you said "The ground-true lidar pose trajectory is captured by a total station or motion capture ssytem.".
Did you mean by using HILTI competitions evaluation tool? In that case, how did you guys optimize the poses of ground-true pose trajectory used for registering pointclouds, shown in Fig.10?
Thanks.
@Zale-Liu : SO3::SO3(const Quaterniond&): Assertion `unit_quaternion_.squaredNorm() > SMALL_EPS' failed.
Feature point extraction should be no problem, I feel that scantomap is a bit problematic
Hi:
As I can see this work runs on individual scans in pcd format, and a csv containing the poses.
Will be there an option to use other datasets, as our own bags?
BALM v1 alowed to use own datasets, isolated or with LOAM odometry.
Will be there any utility to capture external odometry to make the PCDs and the pose file?
Thanks in advance
BALM/src/benchmark/bavoxel.hpp
Line 39 in d91afa9
Hi, @Zale-Liu
May i ask how to understand the meaning of layer in eigen_value_array? Is it the layer of octree or the layer for hierarchical BA?
What's the meaning of above codes?
Looking forward to your help ;)
Dear authros of BALM:
Thanks for sharing your advanced work. I want to ask a question about your paper. In Table II, you test your algorithm, LOAM and Lego-LOAM on a Velodyne VLP-16 LiDAR dataset named Steven. Howver, the author of Lego-LOAM did not provide the ground-truth poses of this trajectory. How to evaluate the performance of these approaches on this dataset? Did you suppose that the start and end point of this trajectory is strictly overlapped and compute the total drift error?
BALM在检测中,多次发生imu漂移,不知道是不是imu运行太快的原因!
Hello, thanks for your great work! I would like to test the BALM with 128-scans lidar of robosense, I have modified the params named "N_SCANS" and "scan_line" in balm_velo16.launch, but it did not work. Are there any other parameters that need to be modified?
Thank you for your excellent work.
Looking forward to the "lidar-inertial odometry with sliding window optimization" work.
I have a question. I noticed in your paper VII Application-A, only point-plane residual is used. Likewise in FAST-LIO where only point-plane registration is used while in many old loam paper, both point-plane and point-line registration is used. Is there any experiment showing that point-line registration will reduce pointcloud registration performance?
Hi, i have a question about the slide window ba, why you choose second order approximation eigenvalues w.r.t poses?
I try to use first order approximation to solve this problem, but the iteration result cannot converge. Is this ba formulation converge region is small?
Dear Author.
Will subsequent versions update the edge feature module?
after I've already built BALM, I run roslaunch balm balm_velo16.launch
and I get error
ERROR: cannot launch node of type [balm/velodyne_feature]: Cannot locate node of type [velodyne_feature] in package [balm]. Make sure file exists in package path and permission is set to executable (chmod +x)
ERROR: cannot launch node of type [balm/balm_front_back]: Cannot locate node of type [balm_front_back] in package [balm]. Make sure file exists in package path and permission is set to executable (chmod +x)
How to fix it?
@Zale-Liu thanks for great works for BALM2.0,
but i confused in plane pointcloud generation, looks like plSurfs[i] has different structure.
BALM/src/benchmark/benchmark_virtual.cpp
Line 580 in df9a376
my comments.
// plane normal vector and center in global frame, these two vectors vary in different pointcloud(plSurfs[i])
surfDirect[i] = rot.col(2);
surfCenter[i] << randRange(e), randRange(e), randRange(e);
// pvec(randVoxel(e), randVoxel(e), randThick(e)); in samping frame
// pvec = rot * pvec + surfCenter[i]; in global frame
// pvec = xBuf[j].R.transpose() * (pvec - xBuf[j].p); in body frame
Eigen::Vector3d pvec(randVoxel(e), randVoxel(e), randThick(e));
pvec = rot * pvec + surfCenter[i];
pvec = xBuf[j].R.transpose() * (pvec - xBuf[j].p);
generated two pointcloud from this part code. looks like these have different structure.
Really cool work! Thanks for open sourcing it! 😄
The link for the stairs bag listed in the Readme in section 3.4 is either inaccessible or has been moved. Can you please update it?
TIA!
Thanks for your work! I test BALM using Kitti odom data by using a_loam as front-end, and BALM as back-end. I found that using default parameter the result after BA gets worse in height. Does anyone have any suggestion or ideas? Below is a part of traj. Purple is gt, red is a_loam, green is aloam+BALM.
Why don't just use the first-order derivative then feed it into gauss-newton solver ?
When I compile, I have installed the livox-ros-driver, but the following errors will occur,
CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
Could not find a package configuration file provided by "livox_ros_driver"
with any of the following names:
livox_ros_driverConfig.cmake
livox_ros_driver-config.cmake
What a great job! I noticed that Experiment 1 was mentioned in the video and paper, and through issus I also saw that you will work on combining open source and lio in the future.
I noticed that in Experiment 1, there was a globally maintained voxel map, and this map seemed to be adaptive and would not change after multiple passes.
This is something I've been thinking about lately
How was this implemented? Did you design it yourself or is there a ready-made solution that you can refer to?
Thank you for your contribution in lidar SLAM!
just ask when will you upload the new version with loop closure or something others?
Thank you again!
梯子数据集的下载链接失效,可以重新提供嘛
你好 感谢贵团队开源这么优秀的框架
我有一个关于修正状态更新的问题:为什么在迭代更新状态时平移的更新没有乘以误差的旋转,有什么理论依据可以参考么?
类似代码如下(摘自balmclass.hpp void damping_iter()):
so3_temp = SO3::exp(dxi.block<3, 1>(0, 0)) * so3_pose;
t_temp = t_pose + dxi.block<3, 1>(3, 0);
我的理解是这里的 t_temp =SO3::exp(dxi.block<3, 1>(0, 0)) * t_pose + dxi.block<3, 1>(3, 0);
但是我这么改了结果又不是很好。
期待回复,再次感谢!
您好:
我在运行自己录制的avia数据集的时候,偶尔会出现这个报错并程序崩溃。不知道什么原因造成的,我看也有其他人提到这个问题,请问现在这个修复了吗?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.