[kimera-multi]ubuntu运行过程


(本来不打算写了,没想到还有不少需要注意的地方,于是一并提及)
本文是关于 kimera-multi开源代码在原作者提供的数据集上运行时的(踩坑)经验。安装部分详见我的 上一篇文章

1 关于数据集

首先,数据集开源了,但没有完全开源,指不能直接在指定的github仓库中找到,需要发邮件给作者团队。不过作者团队设置了自动回复,给出了链接,故可以得到存放数据集的 Google drive(网盘)链接。

1.1 无法登录 Google drive

墙内特有的问题。自行找梯子,且备好充好的流量下载。

1.2 浏览器下载速度慢且容易失败

这个问题困扰了我非常久。根本原因在于梯子+大文件。尝试了 wgetcurl 等命令行下载方式以及浏览器插件 xdm,无一例外失败了。不过,在寻找方法的过程中,我找到了这个帖子:

解决命令行下载Google Drive大文件出现的问题

按照帖子里的方法走是可以的,但是注意,限时1.5小时,过了就不能下载了,需要重新获取 Access token。但是可以使用 -C - 来继续下载,我在该帖子下评论了。

首先获取文件的 FILE_ID。通过点击数据包那一行右侧竖直的3个点,再点击共享,最后点击复制链接,得到一个链接,形式为:

https://drive.google.com/drive/folders/{FILE_ID}?usp=drive_link

下载的全部步骤如下(需要注册 Google 账号):

  1. 进入 OAuth 2.0 Playground
  2. Select the Scope 栏粘贴 https://www.googleapis.com/auth/drive.readonly 上去并点击Authorize APIs
  3. Google 验证身份,可以选择 更多验证方式 中的发送手机验证码进行验证
  4. 点击 Exchange authorization code for tokens
  5. 复制 Access token,即 Access token=xxx 后面部分作为 {Access token}
  6. 在命令行终端运行:
    curl -H "Authorization: Bearer {ACCESS_TOKEN}" -C - https://www.googleapis.com/drive/v3/files/{FILE_ID}?alt=media -o {FILE_NAME}
    
    其中 {Access toekn}{FILE_ID} 在上面已获取到, {FILE_NAME} 作为下载文件的名称可自行命名,按照原名称命名即可。与链接中提供的命令相比,多了 -C - ,表示可以继续下载未完成的文件

2 怎么跑数据集

参考原仓库中的 README.md 文件中的:

CATKIN_WS=<path-to-catkin-ws> DATA_PATH=<path-to-campus-outdoor-data-folder> LOG_DIR=<path-to-log-folder> tmuxp load 1014-example.yaml
  • 其中 tmuxp 是多进程运行的命令,详细可自行搜索。此命令需要先安装:

    参考tmuxp仓库,我是用 apt 安装的

    sudo apt install tmuxp tmux
    
  • load 是加载该 yaml 文件,里面有一些比较规范的格式,这里不去详细解释,可自行搜索。
  • 其他的参数是该 yaml 文件定义的一些需要传进去的参数,对应为工作空间、数据集所在路径和输出文件的路径。由于设置和修改比较麻烦,所以我建议写一个包含上述跑数据集的命令的脚本,如 run.sh,方便修改,修改后可以通过 bash run.sh 来运行。

3 跑数据集过程中的问题

3.1 RLException: run_id on parameter server does not match declared run_id

参考 run_id on parameter server does not match declared run_id 解决方式

原因在于该 yaml 文件中的 roscoreroslaunch 之后运行,有冲突。在该 yaml 文件里已经添加了 sleep ,但是显然时间不够,这个需要根据个人情况设置,我设置成全部都是 15 秒。

3.2 找不到 mit_voc.yml

(确实,我也找不到[bushi])
一开始以为是bug,后来搜索 src 里面的文件内容(vscode 就可以),特别是 kimera_multi_lcd 里面的(因为就是在这里面找不到),发现在 kimera_multi_lcd/CMakeLists.txt 里有这么一段:

### Download and unzip the vocabularly file
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/vocab/mit_voc.yml)
  message(STATUS "Downloading vocabulary file from drive.")
  file(DOWNLOAD
       https://drive.google.com/uc?export=download&confirm=9iBg&id=1N4y0HbgA3PHQ73ZxFJvy5dgvV_0cTBYF
       ${CMAKE_CURRENT_SOURCE_DIR}/vocab.zip
       SHOW_PROGRESS
       STATUS voc_download_success
       TIMEOUT 60)
  if(voc_download_success)
    message(STATUS "Unzipping vocabulary file.")

    execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_CURRENT_SOURCE_DIR}/vocab.zip
                            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/)
    execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/vocab.zip)
  else(voc_download_success)
    message(STATUS "Failed to download vocabulary file. Please download manually.")
  endif(voc_download_success)
else()
  message(STATUS "Vocabulary file exists, will not download.")
endif()

这里设置是自动下载,但应该失败了,手动下载就好。之后:

# 在下载的路径下,移动到所需的地方 
mv vocab.zip {your_work_space_path}/src/kimera_multi_lcd/vocab/

# 解压,因为压缩包有 vocab文件夹,所以不需要再新建目录
unzip vocab.zip

# 删除压缩包
rm -rf vocab.zip

3.3 rviz 空白,弹出窗口:“Sorry, the application republish has stopped unexpectedly”

看了一下所有的命令行,都没有问题,是 ros-noetic-image-transport 的问题,这个已经安装了,缺的其实是下面这个,安装即可:

sudo apt-get install ros-noetic-image-transport-plugins

参考:issue6:RViZ no Visualization in world frame and path

3.4 rviz 无法显示图像

原因在于 kimera_distributed/rviz/single_machine.rviz 中对于图像话题的订阅有误,而 1014-example.yaml 又是调用这个 .rviz 文件的:

rviz -d $(rospack find kimera_distributed)/rviz/single_machine.rviz

所以需要修改,修改方式也很简单,要么在 RViz 界面内重新选择订阅的话题名称,选择包含 /feature_track 的话题除了看到图像还能看到特征点;要么直接在该 .rviz 文件中修改话题名称,将 robot0 修改为对应在 1014-example.yamlROBOT0 的值,其他像 robot1robot2robot3 也是这样修改,同时也可以加上若干个类似的,因为不只有4个机器人。
此问题已在原仓库提交PR。

3.5* 【提升部分】

RViz 中展示世界坐标系下各机器人单机VIO的轨迹(对应话题 acl_jackal/kimera_vio_ros/optimized_trajectory):kimera-multi-issue3
应使用 kimera_distributed_poses_xxx.csv 与真值对比,而非 trajectory_optimized.csv ,后者经过了降采样 ,参考 kimera-multi-issue8

以下部分已在我的仓库 中进行更新,详情请移步。
跑代码过程中产生非常多优化后的位姿文件 kimera_distributed_poses_xxx.csv,占用较多的存储空间,一种方法是修改代码,使得生成的文件名称一样,这样可以直接覆盖;另一种方法是自动删除,我另外写了一个 shell 脚本,定时(此处设置为1分钟)删除位姿文件,只保留第一个和最新一个位姿文件。这里感谢 kimi大模型 的代码生成。以下是我的脚本 del_poses_files.sh

#!/bin/sh
# Input: Path for log files
ROBOT_NAMES=("acl_jackal" "acl_jackal2" "sparkal1" "sparkal2" "hathor" "thoth")

while true; do
    for robot_name in "${ROBOT_NAMES[@]}"; do
        # 查找所有匹配的文件并按修改时间排序
        sorted_files=($(find $1/${robot_name}/distributed -type f -name "kimera_distributed_poses_*" -printf "%T@ %p\n" | sort -n | cut -d' ' -f2-))

        # 如果找到的文件数量大于2,进行处理
        if [ ${#sorted_files[@]} -gt 2 ]; then

            # 获取最旧的和最新的文件
            min_file=${sorted_files[0]}
            max_file=${sorted_files[-1]}

            # 遍历所有文件,删除除了最旧的和最新的文件之外的所有文件
            for file in "${sorted_files[@]}"; do
                if [ "$file" != "$min_file" ] && [ "$file" != "$max_file" ]; then
                    rm "$file"
                fi
            done
        fi
    done

    # 等待1分钟(60秒)
    sleep 60
done

脚本需要接收文件存放的总路径,即 $1 部分。因此,调用此脚本需要将总路径(请自行修改)传进去:

bash del_poses_files.sh "path/to/your/log/data"

补充: tmuxp 操作指令

运行后出现一个命令行形式的窗口(windows)以及若干个窗格(panes)。但是若没有别的操作,只能观察当前窗口并在最后的窗格操作,非常局限。以下提供部分操作的指令。

参考 tmuxp 官网给出的 技术文档中关于tmux的部分

这里给出我比较常用的:
首先按下 Ctrl+b ,放开,然后迅速再按:

  • p :切换到上一个窗口
  • n :切换到下一个窗口
  • 上下左右键 :在当前窗口切换到其他窗格
  • &:杀死当前窗口(注意,要是 & 键与数字键 7 放一块,需要同时按下 Shift 键才算输入了 &键)
  • x:杀死当前窗格
    更多指令参考技术文档。

大功告成。由于输出文件不兼容 evo,故目前还不能输出轨迹。但是基本没有问题了。更多更新可以关注我fork的仓库

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值