hkust-aerial-robotics / a-loam Goto Github PK
View Code? Open in Web Editor NEWAdvanced implementation of LOAM
License: Other
Advanced implementation of LOAM
License: Other
Hi, first of all I want to say great work on this algorithm, very robust and useful!
My question here is after we run the algorithm, and we have done the mapping process, how to save this map information into a file?
Thanks a lot!
The results from rviz I can get is this:
and I have already select after_maped topic. Is there anything wrong?
I also confused that I can't find my point cloud image and i have select the point cloud topic too? I realy want to know how to recurring the effect like this ?
I really need your help, Is there anything wrong, could you please give me some advice ? Thanks!
Thanks for the nice code from your guys,
after trying your code I have found that in VLP-32 the whole mapping time may cost 130ms per frame (may not reach real-time performance)
Can anyone provide some suggestions to speed up that code? Thanks.
Hi thanks for sharing such a good project.
I've tested your project with my own dataset which is around 1700 seconds. What I noticed there was a huge vertical deviation for the path after around 1300 seconds as shown below
AftMapped Path
It's very clear here, that's supposed to be at the same level.
And the ground truth doesn't have this vertical deviation at all, all streets were at the same level.
What do you think the issue would come from? And how can I resolve this issue?
Thanks!
Hi, I'd like to test on my own data, and I am wondering what is the minimum requirement for the overlap between two frames of lidar points cloud?
Thank you very much!
Is there a short description of topic names? The cloud ones sort of self explanatory but for example what's the difference between aft_mapped_to_init and laser_odom_to_init? I would be glad if someone can explain. Thanks.
Thank you for your excellent work.
There are some own data which are not from velodyne, is it possible to run own dataset? If so, what kind of data form is needed?
Looking forward to hearing from you soon!
Is there a way to get point cloud map with intensity??
Now I am trying to test A-LOAM on kitti (velodyne laser data, 80 GB), as far as I know, we should try to transform them into ROS bag at first. (if it is not true, please point it out).
When I use the kitti_helper.launch
, the output is only a .bag file about 4kB in total.
This is the terminal information:
`... logging to /home/objloc/.ros/log/c787383e-8951-11ea-b5c0-9cebe8b95aff/roslaunch-deeplearning-12255.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://deeplearning:xxxxx/
PARAMETERS
NODES
/
kittiHelper (aloam_velodyne/kittiHelper)
auto-starting new master
process[master]: started with pid [12267]
ROS_MASTER_URI=http://localhost:xxxxx
setting /run_id to c787383e-8951-11ea-b5c0-9cebe8b95aff
process[rosout-1]: started with pid [12282]
started core service [/rosout]
process[kittiHelper-2]: started with pid [12300]
Reading sequence 004 from /home/objloc/OBJLOC/A-LOAM/
Done
[kittiHelper-2] process has finished cleanly
log file: /home/objloc/.ros/log/c787383e-8951-11ea-b5c0-9cebe8b95aff/kittiHelper-2*.log
`
any suggestion or advice for it?
if (!halfPassed)
{ //确保-pi/2 < ori - startOri < 3*pi/2
if (ori < startOri - M_PI / 2)
{
ori += 2 * M_PI;
}
else if (ori > startOri + M_PI * 3 / 2)
{
ori -= 2 * M_PI;
}
if (ori - startOri > M_PI)
{
halfPassed = true;
}
}
else
{ //确保-3*pi/2 < ori - endOri < pi/2
ori += 2 * M_PI;
if (ori < endOri - M_PI * 3 / 2)
{
ori += 2 * M_PI;
}
else if (ori > endOri + M_PI / 2)
{
ori -= 2 * M_PI;
}
}
float relTime = (ori - startOri) / (endOri - startOri);
您好,我想问一下关于这块的公式是正确的吗?M_PI < endOri - startOri < 3 * M_PI,-pi/2 < ori - startOri < 3*pi/2
我发现计算出的结果是错误的,我不知道是不是我的理解有问题,能帮吗解答一下吗?在我理解中,应该将ori按照endori的方式,加2π,然后再分类讨论,才能得出正确的时间结果。
I'm using a-loam as part of a ros workflow to help stabilize point clouds captured with an ouster lidar scanner. I feed a-loam data played from a bag (referred to as pc.bag
) containing PointCloud2 and imu messages while recording the the /velodyne_cloud_registered topic of PointCloud2 messages.
My issue when I visualize this data is I only see colored rings from bottom to top instead of intensity values.
After inspecting some of the code base I see that there is a line setting the intensity value to something else
A-LOAM/src/scanRegistration.cpp
Line 239 in e51f88c
Is there some where in the code where I can specify that I want the original values which my pc.bag
has?
I have run successfully to get result of KITTI 00~09. But when I test Sequence 10, Error happens:
ThinkStation:~/catkin_ws$ roslaunch aloam_velodyne kitti_helper.launch
... logging to /home/*/.ros/log/22327ae4-994a-11e9-b2df-cc52af3d9390/roslaunch-dlr-ThinkStation-14860.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://ThinkStation:34326/
SUMMARY
========
PARAMETERS
* /kittiHelper/dataset_folder: /home/*/Project...
* /kittiHelper/output_bag_file: /home/*/catkin_...
* /kittiHelper/publish_delay: 1
* /kittiHelper/sequence_number: 10
* /kittiHelper/to_bag: True
* /rosdistro: kinetic
* /rosversion: 1.12.14
NODES
/
kittiHelper (aloam_velodyne/kittiHelper)
ROS_MASTER_URI=http://localhost:11311
process[kittiHelper-1]: started with pid [14877]
Reading sequence 10 from /home/*/Project/ORB_SLAM2/Examples/kitti-benchmark/dataset/
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
[kittiHelper-1] process has died [pid 14877, exit code -6, cmd /home/*/catkin_ws/devel/lib/aloam_velodyne/kittiHelper __name:=kittiHelper __log:=/home/*/.ros/log/22327ae4-994a-11e9-b2df-cc52af3d9390/kittiHelper-1.log].
log file: /home/*/.ros/log/22327ae4-994a-11e9-b2df-cc52af3d9390/kittiHelper-1*.log
all processes on machine have died, roslaunch will exit
shutting down processing monitor...
... shutting down processing monitor complete
done
Could you help me with it?
Thanks in advance~
can you explain the logic of L171.
I'm using VLP16 lidar, attaching my scanID and Vertcal angle relationship diagram
I have tried running A-LOAM on Velodyne lidar .bag file recordings and encountered a bug when processing point-clouds.
In laserOdometry.cpp, at line 390:
kdtreeCornerLast->nearestKSearch(pointSel, 1, pointSearchInd, pointSearchSqDis);
pointSearchInd is later used to refer to values from laserCloudCornerLast->points[] list
...
closestPointInd = pointSearchInd[0];
...
int closestPointScanID = int(laserCloudCornerLast->points[closestPointInd].intensity);
...
It happens that the index obtained from nearestKSearch() is a number that exceeds the length of the laserCloudCornerLast->points list and causes this node to stop.
What I added was index check after line 395:
if (closestPointInd >= 0 && closestPointInd < (int)laserCloudCornerLast->points.size()){
... lines 397 to 481...
}
and the remainder of the code for that block (line 394-482) should go inside if-block to make sure list is not invoked with invalid index.
On my computer, the whole laserOdometry time is about 15ms, and the mapping optimization time is about 300 ms, the lidar type is velodyne's VLP16, the config of my computer is :
Intel® Core™ i7-8750H CPU @ 2.20GHz × 12
32G RAM
I confuse that is it realtime on your computer? or is there other options to speed up the a-loam?
Hi, if I want to use the data collected from Quanergy M8 Lidar, what should I do? I find the map can not be generated when I play the data collected with Quanergy M8. Thanks
ceres::CostFunction *cost_function = LidarPlaneFactor::Create(curr_point, last_point_a, last_point_b, last_point_c, s);
I'm interested in capturing in a ros bag the pose and orientation values applied to the /velodyne_cloud_registered, would I be capturing the right topic if I used /aft_mapped_to_init
?
My thinking is that if I can't preserve the intensity values going into the aloam process then perhaps I can use these pose and orientation values to transform the pointcloud messages so each time step aligns correctly.
If there's a different way to get the pose and orientation values that get applied to the point cloud on the /velodyne_cloud_registered topic I'd love to know! Thanks
Hello, I want to whether i can run LOAM with a 2D lidar which is fixed on the board?
how to convert KITTI dataset to bag file ?
thank you
Is ros:aloam in hub.docker.com ?
Hello.
I do not know if this feature is alredy implemented, but I would like to reset the position estimated by slam to (x,y,z)=(0m,0m,0m) periodically. For example I move forward from 0=(x,y,z)=(0m,0m,0m) to point A=(x,y,z)=(3m,1m,1.5m), at this moment I would like to restart the estimation in order to go to another point B=(x,y,z)=(6m,1m,1.5m)(absolute position from O), but considering point A as the new origin. So point B will be B=(x,y,z)=(3m,0m,0m) (position of B relative to A).
Is possible to do such a thing? There are any problems of stability? Someone have already do this?
秦通大神您好,在使用您A-LOAM代码的VLP-16.launch时,发现rviz界面中鼠标无法拖动界面变化,导致时间久了机器人就消失在画面外了,请问如何在.rviz文件中修改这一项
Hi, is it possible to save the laser cloud map from the rviz?
I tried the rosbag record, the topic of laser_cloud_map looks a little weird.
Is there a method to save the map?
I have download the Kitti Velodyne bag files into my data folder, but it doesn't work. Should I download the color sequences or the gray sequency to the same folder?
Hi, thanks for sharing your code. I used evo to evaluate the trajectory I got from running your codes in ROS. But the result is not that ideal like you got in KITTI ranking. So there may be something wrong with my evaluation or steps. Could you please give me some advices on evaluating or tuning?
After running velodyne aloam_velodyne_64.launch I played rosbag of 00 sequence (2011_10_03_drive_0027) instead of kitti_helper.launch and odom data in folders. The running speed of bag was set to 0.1. And I remapped the published topic of point cloud to "/velodyne_points". The command "rostopic echo /laser_odom_to_unit/pose/pose > result.txt" is used to record the trajectory.
Thanks.
if (to_bag)
{
bag_out.write("/image_left", ros::Time::now(), image_left_msg);
bag_out.write("/image_right", ros::Time::now(), image_right_msg);
bag_out.write("/velodyne_points", ros::Time::now(), laser_cloud_msg);
bag_out.write("/path_gt", ros::Time::now(), pathGT);
bag_out.write("/odometry_gt", ros::Time::now(), odomGT);
}
是不是应该写成:
if(timestamp == 0.0)
{
bag_out.write("/image_left", ros::TIME_MIN, image_left_msg);
bag_out.write("/image_right", ros::TIME_MIN, image_right_msg);
bag_out.write("/velodyne_points", ros::TIME_MIN, laser_cloud_msg);
bag_out.write("/path_gt", ros::TIME_MIN, pathGT);
bag_out.write("/odometry_gt", ros::TIME_MIN, odomGT);
}
else
{
bag_out.write("/image_left", ros::Time().fromSec(timestamp), image_left_msg);
bag_out.write("/image_right", ros::Time().fromSec(timestamp), image_right_msg);
bag_out.write("/velodyne_points", ros::Time().fromSec(timestamp), laser_cloud_msg);
bag_out.write("/path_gt", ros::Time().fromSec(timestamp), pathGT);
bag_out.write("/odometry_gt", ros::Time().fromSec(timestamp), odomGT);
}
Hi, thanks for the great work.
I'm trying to evaluate the algorithm in a Velodyne HDL 32 mounted with a 45° inclination. Can you please point out if there are any changes in the pipeline I should implement in order to achieve better results?
Thank you!
hi,when I compile A-LOAM package,I meet some errors as fellow,
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Solve(cs_di_symbolic*, cs_di_numeric*, double*)': cxsparse.cc:(.text+0x92): undefined reference to
cs_di_ipvec'
cxsparse.cc:(.text+0xa6): undefined reference to cs_di_lsolve' cxsparse.cc:(.text+0xba): undefined reference to
cs_di_ltsolve'
cxsparse.cc:(.text+0xd3): undefined reference to cs_di_pvec' cxsparse.cc:(.text+0x108): undefined reference to
cs_di_free'
cxsparse.cc:(.text+0x114): undefined reference to cs_di_malloc' /usr/local/lib/libceres.a(cxsparse.cc.o): In function
ceres::internal::CXSparse::SolveCholesky(cs_di_sparse*, double*)':
cxsparse.cc:(.text+0x31a): undefined reference to cs_di_cholsol' /usr/local/lib/libceres.a(cxsparse.cc.o): In function
ceres::internal::CXSparse::BlockAnalyzeCholesky(cs_di_sparse*, std::vector<int, std::allocator > const&, std::vector<int, std::allocator > const&)':
cxsparse.cc:(.text+0x438): undefined reference to cs_di_amd' cxsparse.cc:(.text+0x4ba): undefined reference to
cs_di_free'
cxsparse.cc:(.text+0x4f6): undefined reference to cs_di_calloc' cxsparse.cc:(.text+0x506): undefined reference to
cs_di_pinv'
cxsparse.cc:(.text+0x516): undefined reference to cs_di_symperm' cxsparse.cc:(.text+0x523): undefined reference to
cs_di_etree'
cxsparse.cc:(.text+0x532): undefined reference to cs_di_post' cxsparse.cc:(.text+0x546): undefined reference to
cs_di_counts'
cxsparse.cc:(.text+0x551): undefined reference to cs_di_free' cxsparse.cc:(.text+0x559): undefined reference to
cs_di_spfree'
cxsparse.cc:(.text+0x569): undefined reference to cs_di_malloc' cxsparse.cc:(.text+0x57b): undefined reference to
cs_di_cumsum'
cxsparse.cc:(.text+0x58d): undefined reference to cs_di_free' cxsparse.cc:(.text+0x60c): undefined reference to
cs_di_sfree'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::CreateSparseMatrix(ceres::internal::TripletSparseMatrix*)': cxsparse.cc:(.text+0x802): undefined reference to
cs_di_compress'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::ApproximateMinimumDegreeOrdering(cs_di_sparse*, int*)': cxsparse.cc:(.text+0x890): undefined reference to
cs_di_amd'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::~CXSparse()': cxsparse.cc:(.text+0x2b): undefined reference to
cs_di_free'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Cholesky(cs_di_sparse*, cs_di_symbolic*)': cxsparse.cc:(.text+0x47): undefined reference to
cs_di_chol'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::AnalyzeCholesky(cs_di_sparse*)': cxsparse.cc:(.text+0x336): undefined reference to
cs_di_schol'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::AnalyzeCholeskyWithNaturalOrdering(cs_di_sparse*)': cxsparse.cc:(.text+0x343): undefined reference to
cs_di_schol'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::ApproximateMinimumDegreeOrdering(cs_di_sparse*, int*)': cxsparse.cc:(.text+0x8b7): undefined reference to
cs_di_free'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::TransposeMatrix(cs_di_sparse*)': cxsparse.cc:(.text+0x8c9): undefined reference to
cs_di_transpose'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::MatrixMatrixMultiply(cs_di_sparse*, cs_di_sparse*)': cxsparse.cc:(.text+0x8d7): undefined reference to
cs_di_multiply'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Free(cs_di_sparse*)': cxsparse.cc:(.text+0x8e4): undefined reference to
cs_di_spfree'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Free(cs_di_symbolic*)': cxsparse.cc:(.text+0x8f4): undefined reference to
cs_di_sfree'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Free(cs_di_numeric*)': cxsparse.cc:(.text+0x904): undefined reference to
cs_di_nfree'
collect2: error: ld returned 1 exit status
A-LOAM/CMakeFiles/alaserOdometry.dir/build.make:437: recipe for target '/home/nari/catkin_ws/devel/lib/aloam_velodyne/alaserOdometry' failed
make[2]: *** [/home/nari/catkin_ws/devel/lib/aloam_velodyne/alaserOdometry] Error 1
CMakeFiles/Makefile2:2458: recipe for target 'A-LOAM/CMakeFiles/alaserOdometry.dir/all' failed
make[1]: *** [A-LOAM/CMakeFiles/alaserOdometry.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Solve(cs_di_symbolic*, cs_di_numeric*, double*)': cxsparse.cc:(.text+0x92): undefined reference to
cs_di_ipvec'
cxsparse.cc:(.text+0xa6): undefined reference to cs_di_lsolve' cxsparse.cc:(.text+0xba): undefined reference to
cs_di_ltsolve'
cxsparse.cc:(.text+0xd3): undefined reference to cs_di_pvec' cxsparse.cc:(.text+0x108): undefined reference to
cs_di_free'
cxsparse.cc:(.text+0x114): undefined reference to cs_di_malloc' /usr/local/lib/libceres.a(cxsparse.cc.o): In function
ceres::internal::CXSparse::SolveCholesky(cs_di_sparse*, double*)':
cxsparse.cc:(.text+0x31a): undefined reference to cs_di_cholsol' /usr/local/lib/libceres.a(cxsparse.cc.o): In function
ceres::internal::CXSparse::BlockAnalyzeCholesky(cs_di_sparse*, std::vector<int, std::allocator > const&, std::vector<int, std::allocator > const&)':
cxsparse.cc:(.text+0x438): undefined reference to cs_di_amd' cxsparse.cc:(.text+0x4ba): undefined reference to
cs_di_free'
cxsparse.cc:(.text+0x4f6): undefined reference to cs_di_calloc' cxsparse.cc:(.text+0x506): undefined reference to
cs_di_pinv'
cxsparse.cc:(.text+0x516): undefined reference to cs_di_symperm' cxsparse.cc:(.text+0x523): undefined reference to
cs_di_etree'
cxsparse.cc:(.text+0x532): undefined reference to cs_di_post' cxsparse.cc:(.text+0x546): undefined reference to
cs_di_counts'
cxsparse.cc:(.text+0x551): undefined reference to cs_di_free' cxsparse.cc:(.text+0x559): undefined reference to
cs_di_spfree'
cxsparse.cc:(.text+0x569): undefined reference to cs_di_malloc' cxsparse.cc:(.text+0x57b): undefined reference to
cs_di_cumsum'
cxsparse.cc:(.text+0x58d): undefined reference to cs_di_free' cxsparse.cc:(.text+0x60c): undefined reference to
cs_di_sfree'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::CreateSparseMatrix(ceres::internal::TripletSparseMatrix*)': cxsparse.cc:(.text+0x802): undefined reference to
cs_di_compress'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::ApproximateMinimumDegreeOrdering(cs_di_sparse*, int*)': cxsparse.cc:(.text+0x890): undefined reference to
cs_di_amd'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::~CXSparse()': cxsparse.cc:(.text+0x2b): undefined reference to
cs_di_free'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Cholesky(cs_di_sparse*, cs_di_symbolic*)': cxsparse.cc:(.text+0x47): undefined reference to
cs_di_chol'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::AnalyzeCholesky(cs_di_sparse*)': cxsparse.cc:(.text+0x336): undefined reference to
cs_di_schol'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::AnalyzeCholeskyWithNaturalOrdering(cs_di_sparse*)': cxsparse.cc:(.text+0x343): undefined reference to
cs_di_schol'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::ApproximateMinimumDegreeOrdering(cs_di_sparse*, int*)': cxsparse.cc:(.text+0x8b7): undefined reference to
cs_di_free'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::TransposeMatrix(cs_di_sparse*)': cxsparse.cc:(.text+0x8c9): undefined reference to
cs_di_transpose'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::MatrixMatrixMultiply(cs_di_sparse*, cs_di_sparse*)': cxsparse.cc:(.text+0x8d7): undefined reference to
cs_di_multiply'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Free(cs_di_sparse*)': cxsparse.cc:(.text+0x8e4): undefined reference to
cs_di_spfree'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Free(cs_di_symbolic*)': cxsparse.cc:(.text+0x8f4): undefined reference to
cs_di_sfree'
/usr/local/lib/libceres.a(cxsparse.cc.o): In function ceres::internal::CXSparse::Free(cs_di_numeric*)': cxsparse.cc:(.text+0x904): undefined reference to
cs_di_nfree'
collect2: error: ld returned 1 exit status
A-LOAM/CMakeFiles/alaserMapping.dir/build.make:437: recipe for target '/home/nari/catkin_ws/devel/lib/aloam_velodyne/alaserMapping' failed
make[2]: *** [/home/nari/catkin_ws/devel/lib/aloam_velodyne/alaserMapping] Error 1
CMakeFiles/Makefile2:1963: recipe for target 'A-LOAM/CMakeFiles/alaserMapping.dir/all' failed
make[1]: *** [A-LOAM/CMakeFiles/alaserMapping.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2
Can you give me some advices how to resolve these problems?Thank you!
Hi @shaozu , thanks for your share. According to kitti_development_kit/readme.txt, GT pose is left camera(Z-front, X-right, Y-down) in left_camera_0th(world) pose. when convert GT pose into loam's camera_init frame(Z-front, X-left, Y-up), use R_transform << 0, 0, 1, -1, 0, 0, 0, -1, 0;. I think R_camInit_world = Rz(-pi), p_camInit = R_camInit_world * GT_pose, should be R_transform << -1, 0, 0, 0, -1, 0, 0, 0, 1
?
When publish "/velodyne_points" to loam, each points is in camera_init loam's world frame, why not is velodyne frame?
Thanks in advance!
Hi, is there any way to reset the mapping while it is runnning?
Thanks in advance!
No imu data found in code, is imu data necessary for A-LOAM?
I build this A-LOAM on my ubuntu14.04(x64, virtual machine) , but it seems that the it's not compatiable with some library in ceres and Eigen.
I also build the package in Ubuntu16.04, and this problem didn't occur.
The following is the error information, could you please give me some advice?
In file included from /usr/include/eigen3/Eigen/Geometry:40:0,
from /usr/include/pcl-1.7/pcl/point_cloud.h:47,
from /home/either/catkin_tws/src/A-LOAM/src/laserOdometry.cpp:41:
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h: In instantiation of ‘Eigen::Quaternion<typename Eigen::internal::traits<T>::Scalar> Eigen::QuaternionBase<Derived>::slerp(const Scalar&, const Eigen::QuaternionBase<OtherDerived>&) const [with OtherDerived = Eigen::Quaternion<ceres::Jet<double, 7>, 0>; Derived = Eigen::Quaternion<ceres::Jet<double, 7>, 0>; typename Eigen::internal::traits<T>::Scalar = ceres::Jet<double, 7>; Eigen::QuaternionBase<Derived>::Scalar = ceres::Jet<double, 7>]’:
/home/either/catkin_tws/src/A-LOAM/src/lidarFactor.hpp:81:15: required from ‘bool LidarPlaneFactor::operator()(const T*, const T*, T*) const [with T = ceres::Jet<double, 7>]’
/usr/local/include/ceres/internal/variadic_evaluate.h:168:26: required from ‘static bool ceres::internal::VariadicEvaluate<Functor, T, N0, N1, 0, 0, 0, 0, 0, 0, 0, 0>::Call(const Functor&, const T* const*, T*) [with Functor = LidarPlaneFactor; T = ceres::Jet<double, 7>; int N0 = 4; int N1 = 3]’
/usr/local/include/ceres/internal/autodiff.h:290:45: required from ‘static bool ceres::internal::AutoDiff<Functor, T, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Differentiate(const Functor&, const T* const*, int, T*, T**) [with Functor = LidarPlaneFactor; T = double; int N0 = 4; int N1 = 3; int N2 = 0; int N3 = 0; int N4 = 0; int N5 = 0; int N6 = 0; int N7 = 0; int N8 = 0; int N9 = 0]’
/usr/local/include/ceres/autodiff_cost_function.h:218:25: required from ‘bool ceres::AutoDiffCostFunction<CostFunctor, kNumResiduals, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Evaluate(const double* const*, double*, double**) const [with CostFunctor = LidarPlaneFactor; int kNumResiduals = 1; int N0 = 4; int N1 = 3; int N2 = 0; int N3 = 0; int N4 = 0; int N5 = 0; int N6 = 0; int N7 = 0; int N8 = 0; int N9 = 0]’
/home/either/catkin_tws/src/A-LOAM/src/laserOdometry.cpp:602:1: required from here
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: error: no match for ‘operator<’ (operand types are ‘Eigen::QuaternionBase<Eigen::Quaternion<ceres::Jet<double, 7>, 0> >::Scalar {aka ceres::Jet<double, 7>}’ and ‘int’)
if(d<0) scale1 = -scale1;
^
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: note: candidates are:
In file included from /usr/local/include/ceres/internal/autodiff.h:145:0,
from /usr/local/include/ceres/autodiff_cost_function.h:132,
from /usr/local/include/ceres/ceres.h:37,
from /home/either/catkin_tws/src/A-LOAM/src/lidarFactor.hpp:4,
from /home/either/catkin_tws/src/A-LOAM/src/laserOdometry.cpp:57:
/usr/local/include/ceres/jet.h:416:1: note: template<class T, int N> bool ceres::operator<(const ceres::Jet<T, N>&, const T&)
CERES_DEFINE_JET_COMPARISON_OPERATOR( < ) // NOLINT
^
/usr/local/include/ceres/jet.h:416:1: note: template argument deduction/substitution failed:
In file included from /usr/include/eigen3/Eigen/Geometry:40:0,
from /usr/include/pcl-1.7/pcl/point_cloud.h:47,
from /home/either/catkin_tws/src/A-LOAM/src/laserOdometry.cpp:41:
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: note: deduced conflicting types for parameter ‘const T’ (‘double’ and ‘int’)
if(d<0) scale1 = -scale1;
^
In file included from /usr/local/include/ceres/internal/autodiff.h:145:0,
from /usr/local/include/ceres/autodiff_cost_function.h:132,
from /usr/local/include/ceres/ceres.h:37,
from /home/either/catkin_tws/src/A-LOAM/src/lidarFactor.hpp:4,
from /home/either/catkin_tws/src/A-LOAM/src/laserOdometry.cpp:57:
/usr/local/include/ceres/jet.h:416:1: note: template<class T, int N> bool ceres::operator<(const T&, const ceres::Jet<T, N>&)
CERES_DEFINE_JET_COMPARISON_OPERATOR( < ) // NOLINT
^
/usr/local/include/ceres/jet.h:416:1: note: template argument deduction/substitution failed:
In file included from /usr/include/eigen3/Eigen/Geometry:40:0,
from /usr/include/pcl-1.7/pcl/point_cloud.h:47,
from /home/either/catkin_tws/src/A-LOAM/src/laserOdometry.cpp:41:
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: note: mismatched types ‘const ceres::Jet<T, N>’ and ‘int’
if(d<0) scale1 = -scale1;
^
In file included from /usr/local/include/ceres/internal/autodiff.h:145:0,
from /usr/local/include/ceres/autodiff_cost_function.h:132,
from /usr/local/include/ceres/ceres.h:37,
from /home/either/catkin_tws/src/A-LOAM/src/lidarFactor.hpp:4,
from /home/either/catkin_tws/src/A-LOAM/src/laserOdometry.cpp:57:
/usr/local/include/ceres/jet.h:416:1: note: template<class T, int N> bool ceres::operator<(const ceres::Jet<T, N>&, const ceres::Jet<T, N>&)
CERES_DEFINE_JET_COMPARISON_OPERATOR( < ) // NOLINT
^
/usr/local/include/ceres/jet.h:416:1: note: template argument deduction/substitution failed:
In file included from /usr/include/eigen3/Eigen/Geometry:40:0,
from /usr/include/pcl-1.7/pcl/point_cloud.h:47,
from /home/either/catkin_tws/src/A-LOAM/src/laserOdometry.cpp:41:
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: note: mismatched types ‘const ceres::Jet<T, N>’ and ‘int’
if(d<0) scale1 = -scale1;
^
make[2]: *** [A-LOAM/CMakeFiles/alaserOdometry.dir/src/laserOdometry.cpp.o] 错误 1
make[1]: *** [A-LOAM/CMakeFiles/alaserOdometry.dir/all] 错误 2
make[1]: *** 正在等待未完成的任务....
In file included from /usr/include/eigen3/Eigen/Geometry:40:0,
from /usr/include/pcl-1.7/pcl/point_cloud.h:47,
from /usr/include/pcl-1.7/pcl/conversions.h:50,
from /opt/ros/indigo/include/pcl_conversions/pcl_conversions.h:44,
from /home/either/catkin_tws/src/A-LOAM/src/laserMapping.cpp:43:
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h: In instantiation of ‘Eigen::Quaternion<typename Eigen::internal::traits<T>::Scalar> Eigen::QuaternionBase<Derived>::slerp(const Scalar&, const Eigen::QuaternionBase<OtherDerived>&) const [with OtherDerived = Eigen::Quaternion<ceres::Jet<double, 7>, 0>; Derived = Eigen::Quaternion<ceres::Jet<double, 7>, 0>; typename Eigen::internal::traits<T>::Scalar = ceres::Jet<double, 7>; Eigen::QuaternionBase<Derived>::Scalar = ceres::Jet<double, 7>]’:
/home/either/catkin_tws/src/A-LOAM/src/lidarFactor.hpp:81:15: required from ‘bool LidarPlaneFactor::operator()(const T*, const T*, T*) const [with T = ceres::Jet<double, 7>]’
/usr/local/include/ceres/internal/variadic_evaluate.h:168:26: required from ‘static bool ceres::internal::VariadicEvaluate<Functor, T, N0, N1, 0, 0, 0, 0, 0, 0, 0, 0>::Call(const Functor&, const T* const*, T*) [with Functor = LidarPlaneFactor; T = ceres::Jet<double, 7>; int N0 = 4; int N1 = 3]’
/usr/local/include/ceres/internal/autodiff.h:290:45: required from ‘static bool ceres::internal::AutoDiff<Functor, T, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Differentiate(const Functor&, const T* const*, int, T*, T**) [with Functor = LidarPlaneFactor; T = double; int N0 = 4; int N1 = 3; int N2 = 0; int N3 = 0; int N4 = 0; int N5 = 0; int N6 = 0; int N7 = 0; int N8 = 0; int N9 = 0]’
/usr/local/include/ceres/autodiff_cost_function.h:218:25: required from ‘bool ceres::AutoDiffCostFunction<CostFunctor, kNumResiduals, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Evaluate(const double* const*, double*, double**) const [with CostFunctor = LidarPlaneFactor; int kNumResiduals = 1; int N0 = 4; int N1 = 3; int N2 = 0; int N3 = 0; int N4 = 0; int N5 = 0; int N6 = 0; int N7 = 0; int N8 = 0; int N9 = 0]’
/home/either/catkin_tws/src/A-LOAM/src/laserMapping.cpp:939:1: required from here
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: error: no match for ‘operator<’ (operand types are ‘Eigen::QuaternionBase<Eigen::Quaternion<ceres::Jet<double, 7>, 0> >::Scalar {aka ceres::Jet<double, 7>}’ and ‘int’)
if(d<0) scale1 = -scale1;
^
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: note: candidates are:
In file included from /usr/local/include/ceres/internal/autodiff.h:145:0,
from /usr/local/include/ceres/autodiff_cost_function.h:132,
from /usr/local/include/ceres/ceres.h:37,
from /home/either/catkin_tws/src/A-LOAM/src/laserMapping.cpp:54:
/usr/local/include/ceres/jet.h:416:1: note: template<class T, int N> bool ceres::operator<(const ceres::Jet<T, N>&, const T&)
CERES_DEFINE_JET_COMPARISON_OPERATOR( < ) // NOLINT
^
/usr/local/include/ceres/jet.h:416:1: note: template argument deduction/substitution failed:
In file included from /usr/include/eigen3/Eigen/Geometry:40:0,
from /usr/include/pcl-1.7/pcl/point_cloud.h:47,
from /usr/include/pcl-1.7/pcl/conversions.h:50,
from /opt/ros/indigo/include/pcl_conversions/pcl_conversions.h:44,
from /home/either/catkin_tws/src/A-LOAM/src/laserMapping.cpp:43:
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: note: deduced conflicting types for parameter ‘const T’ (‘double’ and ‘int’)
if(d<0) scale1 = -scale1;
^
In file included from /usr/local/include/ceres/internal/autodiff.h:145:0,
from /usr/local/include/ceres/autodiff_cost_function.h:132,
from /usr/local/include/ceres/ceres.h:37,
from /home/either/catkin_tws/src/A-LOAM/src/laserMapping.cpp:54:
/usr/local/include/ceres/jet.h:416:1: note: template<class T, int N> bool ceres::operator<(const T&, const ceres::Jet<T, N>&)
CERES_DEFINE_JET_COMPARISON_OPERATOR( < ) // NOLINT
^
/usr/local/include/ceres/jet.h:416:1: note: template argument deduction/substitution failed:
In file included from /usr/include/eigen3/Eigen/Geometry:40:0,
from /usr/include/pcl-1.7/pcl/point_cloud.h:47,
from /usr/include/pcl-1.7/pcl/conversions.h:50,
from /opt/ros/indigo/include/pcl_conversions/pcl_conversions.h:44,
from /home/either/catkin_tws/src/A-LOAM/src/laserMapping.cpp:43:
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: note: mismatched types ‘const ceres::Jet<T, N>’ and ‘int’
if(d<0) scale1 = -scale1;
^
In file included from /usr/local/include/ceres/internal/autodiff.h:145:0,
from /usr/local/include/ceres/autodiff_cost_function.h:132,
from /usr/local/include/ceres/ceres.h:37,
from /home/either/catkin_tws/src/A-LOAM/src/laserMapping.cpp:54:
/usr/local/include/ceres/jet.h:416:1: note: template<class T, int N> bool ceres::operator<(const ceres::Jet<T, N>&, const ceres::Jet<T, N>&)
CERES_DEFINE_JET_COMPARISON_OPERATOR( < ) // NOLINT
^
/usr/local/include/ceres/jet.h:416:1: note: template argument deduction/substitution failed:
In file included from /usr/include/eigen3/Eigen/Geometry:40:0,
from /usr/include/pcl-1.7/pcl/point_cloud.h:47,
from /usr/include/pcl-1.7/pcl/conversions.h:50,
from /opt/ros/indigo/include/pcl_conversions/pcl_conversions.h:44,
from /home/either/catkin_tws/src/A-LOAM/src/laserMapping.cpp:43:
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:712:7: note: mismatched types ‘const ceres::Jet<T, N>’ and ‘int’
if(d<0) scale1 = -scale1;
^
make[2]: *** [A-LOAM/CMakeFiles/alaserMapping.dir/src/laserMapping.cpp.o] 错误 1
make[1]: *** [A-LOAM/CMakeFiles/alaserMapping.dir/all] 错误 2
make: *** [all] 错误 2
Invoking "make -j4 -l4" failed
either@ubuntu:~/catkin_tws$
thank you!
Hi, How can I change the coordinate system for a new Lidar?
I want to run A-LOAM with ouster OS1 64 ,but I am confused with mapping_line_resolution and mapping_plane_resolution. How can I set these parameters?
Does anyone know how to save the trajectory results in KITTI groundtruth format?
Sorry to bother you, but when I launch the ascanRegistration from aloam_velodyne_64.launch, I obtained this error and I saw
" #7 std::vector<pcl::PointXYZI, Eigen::aligned_allocatorpcl::PointXYZI >::~vector (this=0x7fffffffc758, __in_chrg=)
"
"#8 pcl::PointCloudpcl::PointXYZI::~PointCloud (this=0x7fffffffc720, __in_chrg=)" in gdb, maybe something is wrong with eigen, Can you help me ?
Hello, thank you for your great work!
I found that you disenabled the operation to transform corner features and plane features to the scan end point.
I enabled this operation and run the project again. However, I found nothing changed. Maybe I missed something.
Could you tell me why would you disenable this operation?
Hi, I want to mount the Velodyne VLP 16 sensor vertically for my simulations as shown below. However, when I tried the A-LOAM package with that sensor setup, the state estimation and mapping were not accurate enough. I did not change any coordinate frames in this case. Does anyone know whether this is possible and whether anything needs to be changed in the code?
kittiHelper.cpp 中code
left_image_path 应改成 right_image_path
Hi, I'm confused about the residual computed by LidarEdgeFactor in lidarFactor.hpp:
Eigen::Matrix<T, 3, 1> nu = (lp - lpa).cross(lp - lpb);
Eigen::Matrix<T, 3, 1> de = lpa - lpb;
residual[0] = nu.x() / de.norm();
residual[1] = nu.y() / de.norm();
residual[2] = nu.z() / de.norm();
What's the meaning of this residual?
Since the residual of LidarPlaneFactor means the distance from the point to the plane, shouldn't the residual of LidarEdgeFactor mean the distance from the point to the line? How to explain that
the residual is 3-dimensional? Thank you~
ceres::CostFunction *cost_function = LidarPlaneFactor::Create(curr_point, last_point_a, last_point_b, last_point_c, s);
located in file src/laserMapping.cpp
q_wmap_wodom and t_wmap_wodom are updated by function transformUpdate in the thread of process while they are read and sent by function laserOdometryHandler.
It is possible to send corrupted data.
Thanks for the nice code from your guys,
after studying the detail of it there is one question here.
In LaserOdometry since Kitti provide undistortion pointcloud, distortion is turn off in the code.
But for our own data(VLP16), turning on distortion to true makes the result much poor, the path oscillate and sometimes diverge, we have notice that TransformToEnd shoud turn on too...
Pictures of turning on distortion(Upper) and turning off(Lower) for same data are shown below, any advice here?
As is shown in step4, I want to use kitti_helper.launch to test it, but I cannot use it directly. it is said we need to debug, however, I have no idea how to debug.
Then I tried to save it into .bag, but when I use kitti2bag, there are 3 parameters to select,{raw_synced,odom_color,odom_gray}
, in our case, I just want to use laser points , so which one should I choose?
By the way, there is also an image showing in the example, should we download clour or grey images?
Thank you for any advice!
Has anyone ever encountered this problem? A-loam is running successfully on my desktop, however, it can't work on the jetson which has same environment. The error is shown in fig. The catkin_make is passed and can execute .launch file normally. Unfortunately, the process will die when we play .bag file.
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.