Open chengwei0427 opened 8 months ago
Hello @chengwei0427 ,
no problem at all, I am pleased about the interest.
Using the control poses, spline interpolation (translation) and slerp (orientation) is used to generate a "continuous trajectory" with a temporal resolution of 0.1 ms, which is then used to transform the points.
With the current settings, there is a single start pose and a control pose for each point cloud (full rotation of the LiDAR). To map higher frequency trajectories, the number of control poses can also be increased. In my experience, however, the robustness decreases with too many control poses.
I hope the answers help you. If you have any further questions, let me know.
Thank you for your patience. There may be other questions that need to be consulted, so I will keep this issue open for the time being.
Hi, @davidskdds
I have a question about optimizeSet
:
Sliding Window DMSA Continuous Trajectory Optimization
, DMSA Keyframe Optimization
, I mean, how does the optimized keyframe pose in the sliding window remain continuous with the pose outside the sliding window.Hello @chengwei0427 ,
thank you for your interest.
I hope I have understood your question correctly. I will expand a little. In the "Sliding Window Continuous Trajectory" optimization, continuity is ensured by the fact that the first control pose of the respective time horizon is not changed during the optimization. For example, if we use 6 control poses for 5 point clouds to be optimized, only 5 of the control poses will be optimized. The first one is always initialized by the poses of the previous time step and is not changed. In addition, the static points also help to maintain continuity.
Let's assume that the current map has 10 keyframes (id 0 to id 9). The keyframe id 9 was added in this time step, which triggers a keyframe optimization from keyframe id 5 to id 9 by "DMSA Keyframe Optimization". In order to maintain continuity with the future "Sliding Window Continuous Trajectory", the first control pose of the past continuous trajectory (whose point clouds became keyframe id 9) is replaced with the new pose of keyframe id 9. This is done in line 231 and 232 in include/DMSA/DmsaSlam.h. The subsequent control poses of the last sliding window continuous trajectory are then updated by the function "relative2global();". In the next time step, these updated control poses are then used to initialize the "new" continuous trajectory.
This update ensures that consistency is maintained after keyframe optimizations.
In addition, all non-keyframe poses that lie in the period between keyframe id 5 and id 9 must also be updated. This is ensured by the fact that non-keyframe poses are not saved in relation to the map frame but relative to the keyframe with the most overlap together with its keyframe id.
This functionality is stored in the "include/DMSA/OutputManagement.h" class. Non-keyframes are updated there using the function "addNonKeyframePose".
I hope this has answered your question. If you have any further questions, please feel free to ask.
Hi, @davidskdds Forgive me for bothering you again. In the test, there are some doubts
num_clouds_submap
andnumControlPoints
; That's how I understand it. Please point out any mistakes: In the program, the data ofnum_clouds_submap
frames are processed at a time, and the trajectory of these data is controlled bynumControlPoints
? Here,numControlPoints
are used to control this continuous trajectory,and the pose of each laser point is interpolated by thisnumControlPoints
control point?Jacobian.col(k) = one_div_incr * (errorVec - error0);
Waiting for your reply. Thanks.