w111liang222 / lidar-slam-detection

LSD (LiDAR SLAM & Detection) is an open source perception architecture for autonomous vehicle/robotic
Apache License 2.0
453 stars 103 forks source link

Unable to find the 'Merge Maps' option in the http://localhost/editor #2

Open hwh666 opened 1 year ago

hwh666 commented 1 year ago

When I open http://localhost/editor When there is no 'merge map' option under the file, I have already pulled the latest library. The following is the output log information at startup

root@dns:/home/znqc/work/lidar-slam-detection# tools/scripts/start_system.sh run server python script dpkg-query: no packages found matching nvidia-l4t-core Running on board: IPC, machine: x86_64, jetpack: 20.04 2023-04-28 09:42:16,937[27174:27174][module_manager.py: 47] pipeline: Source connect to SLAM 2023-04-28 09:42:16,937[27174:27174][module_manager.py: 47] pipeline: SLAM connect to Sink 2023-04-28 09:42:16,937[27174:27174][module_manager.py: 71] start to setup module: SLAM 2023-04-28 09:42:16.937[27174:27182][localization.cpp:13] Localization: release static resources 2023-04-28 09:42:16.937[27174:27182][hdl_graph_slam_nodelet.cpp:122] releasing hdl graph nodelet... 2023-04-28 09:42:16,937[27174:27182][ slam.py: 51] SLAM use sensors: ['IMU', '0-RS-LiDAR-16', 'flir:0'] 2023-04-28 09:42:16,937[27174:27174][module_manager.py: 73] setup module: SLAM, done 2023-04-28 09:42:16,937[27174:27174][module_manager.py: 71] start to setup module: Sink iKD-Tree Multi thread started 2023-04-28 09:42:16.942[27174:27182][prefiltering_nodelet.cpp:39] downsample: VOXELGRID 0.15 2023-04-28 09:42:16.942[27174:27182][prefiltering_nodelet.cpp:78] outlier_removal: NONE 2023-04-28 09:42:16.942[27174:27182][hdl_graph_slam_nodelet.cpp:51] initializing hdl graph nodelet... 2023-04-28 09:42:16.942[27174:27182][graph_slam.cpp:56] construct solver: lm_var

Using CSparse poseDim -1 landMarkDim -1 blockordering 0

2023-04-28 09:42:16.942[27174:27182][loop_detector.hpp:50] initializing loop detection... 2023-04-28 09:42:16.942[27174:27182][registrations.cpp:57] registration: FAST_VGICP 2023-04-28 09:42:16.942[27174:27182][registrations.cpp:34] registration: FAST_GICP 2023-04-28 09:42:16,950[27188:27188][sink_template.py: 58] deamon UdpSink starts 2023-04-28 09:42:16,950[27174:27174][module_manager.py: 73] setup module: Sink, done 2023-04-28 09:42:16,950[27174:27174][module_manager.py: 71] start to setup module: Source 2023-04-28 09:42:16,954[27174:27174][player_data_manager.py:135] /home/znqc/work/slam_mapping_demo 2023-04-28 09:42:16,954[27174:27174][player_data_manager.py:136] player have 1942 frames, duration 194.099473 s

w111liang222 commented 1 year ago

Hi, Following the steps, you can find the "Merge Map":

  1. In "Config" => "Device" page, change the work mode to "SLAM" and upload config.
  2. In the detailed "SLAM" setting which at the left column, change to "Localization" mode and upload config.
  3. Refresh the editor page, you can see the "Merge Map" option.

The reason is that we do not have the "editor" mode, so the "localization" mode is reused.

w111liang222 commented 1 year ago

Currently, LSD read/save the maps in the default path (LSD read the /proc/mounts and find the external disk which is mounted in /media and use it as the default path).

If you want to save/read the maps, you can simulate an external disk by: ''' mount --bind /home/znqc/work/ /media/external/ ''' Then, you can see the external disk in the "home" page.

hwh666 commented 1 year ago

Hi, Following the steps, you can find the "Merge Map":

  1. In "Config" => "Device" page, change the work mode to "SLAM" and upload config.
  2. In the detailed "SLAM" setting which at the left column, change to "Localization" mode and upload config.
  3. Refresh the editor page, you can see the "Merge Map" option.

The reason is that we do not have the "editor" mode, so the "localization" mode is reused.

Thank you for your answer. The problem has been resolved

hwh666 commented 1 year ago

Currently, LSD read/save the maps in the default path (LSD read the /proc/mounts and find the external disk which is mounted in /media and use it as the default path).

If you want to save/read the maps, you can simulate an external disk by: ''' mount --bind /home/znqc/work/ /media/external/ ''' Then, you can see the external disk in the "home" page.

Okay, thank you very much for your reminder. Thank you very much for your project

I found this problem before, I set a fixed folder /map_data locally and by modifying the has_extension_disk() function, it was able to do the read and save functions as well,Here is my code

def has_extension_disk():
    has_disk = True
    disk_name = '/home/znqc/work/map_data'
    with open('/proc/mounts') as f:
        for v in f:
            v = v.split()
            mount_name = v[1]
            if '/media' in mount_name:
                has_disk = True
                disk_name = mount_name
                break
    return has_disk, disk_name

I would like to ask if using a local path would be more convenient and compatible,Or what is the necessity of using a disk for reading and saving

w111liang222 commented 1 year ago

Currently, LSD read/save the maps in the default path (LSD read the /proc/mounts and find the external disk which is mounted in /media and use it as the default path). If you want to save/read the maps, you can simulate an external disk by: ''' mount --bind /home/znqc/work/ /media/external/ ''' Then, you can see the external disk in the "home" page.

Okay, thank you very much for your reminder. Thank you very much for your project

I found this problem before, I set a fixed folder /map_data locally and by modifying the has_extension_disk() function, it was able to do the read and save functions as well,Here is my code

def has_extension_disk():
    has_disk = True
    disk_name = '/home/znqc/work/map_data'
    with open('/proc/mounts') as f:
        for v in f:
            v = v.split()
            mount_name = v[1]
            if '/media' in mount_name:
                has_disk = True
                disk_name = mount_name
                break
    return has_disk, disk_name

I would like to ask if using a local path would be more convenient and compatible,Or what is the necessity of using a disk for reading and saving

We use the external disk to store the data because the LSD can be running on both PC and embedded board like Xavier NX. These embedded boards normally don't have enough storage to save maps.

hwh666 commented 1 year ago

Hello, when I tested the "Map Merge" function, the two maps were stacked and not aligned

Here is how I tested it: I split a dataset into two parts, build a map of both datasets, and then perform a map merge,These two maps use the same cfg.yaml file

I think the possible reasons: The parameters in the /graph/map_info.txt file are all 0

Here is my log: ---------------------------------start merge Map 2023-05-05 18:39:52.622[433912:433912][map_loader.cpp:114] Localization: meta_file /home/znqc/work/map_data/lp_log/map/nofix2/graph/map_info.txt load graph map origin: 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 mOriginIsSet: false 2023-05-05 18:39:52.634[433912:433912][map_loader.cpp:38] Localization: total 60 key frames 2023-05-05 18:39:52.634[433912:433912][hdl_graph_slam_nodelet.cpp:51] initializing hdl graph nodelet... 2023-05-05 18:39:52.634[433912:433912][graph_slam.cpp:56] construct solver: lm_var

Using CSparse poseDim -1 landMarkDim -1 blockordering 0

2023-05-05 18:39:52.634[433912:433912][loop_detector.hpp:50] initializing loop detection... 2023-05-05 18:39:52.634[433912:433912][registrations.cpp:57] registration: FAST_VGICP 2023-05-05 18:39:52.634[433912:433912][registrations.cpp:34] registration: FAST_GICP 2023-05-05 18:39:52.634[433912:433912][graph_slam.cpp:355] loading pose graph... 2023-05-05 18:39:52.634[433912:433912][graph_slam.cpp:363] nodes : 60 2023-05-05 18:39:52.634[433912:433912][graph_slam.cpp:364] edges : 59 2023-05-05 18:39:52.634[433912:433912][robust_kernel_io.cpp:138] kernels: 0 2023-05-05 18:39:52.634[433912:433912][hdl_graph_slam_nodelet.cpp:1154] Graph: max_se3_vertex_id 65, max_normal_vertex_id 100000, max_edge_id 79 2023-05-05 18:39:52.635[433912:433912][map_loader.cpp:204] Localization: after resample to 20 key frames 2023-05-05 18:39:52.635[433912:433912][map_loader.cpp:225] Localization: after voxel filter to 16 key frames 2023-05-05 18:39:52.635[433912:433912][map_loader.cpp:75] Merged Map: total 126 key frames ---------------------------------merge Map finish 2023-05-05 18:39:52,645[433912:433912][module_manager.py: 95] system is paused 2023-05-05 18:39:52.759[433912:433912][hdl_graph_slam_nodelet.cpp:286] start wait for flush keyframe queue 2023-05-05 18:39:52.759[433912:433912][hdl_graph_slam_nodelet.cpp:309] flush keyframe queue done 2023-05-05 18:39:52.761[433912:433912][hdl_graph_slam_nodelet.cpp:286] start wait for flush keyframe queue 2023-05-05 18:39:52.761[433912:433912][hdl_graph_slam_nodelet.cpp:309] flush keyframe queue done

w111liang222 commented 1 year ago

Hi,

These two maps are created at the origin of the coordinate (0, 0, 0). So, when you perform map merging, you need to find out the two connected vertices in the maps and add an edge by manually (you can refer this). Then, the pose graph will be optimized automatically and you will see the full aligned map.

In outdoor environment, if the GPS sensor is avaliable, you can specify the origin of the two maps by the same latitude and longitude, then, these two map can be merged easily because they are in the same coordinate system.

w111liang222 commented 1 year ago

hold "CTRL" key and click the vertex to select it

hwh666 commented 1 year ago

Thank you for your reply. After using manual loopback, it can be aligned