文章目录
- 1 关于数据集
- 1.1 无法登录 `Google drive`
- 1.2 浏览器下载速度慢且容易失败
- 2 怎么跑数据集
- 3 跑数据集过程中的问题
- 3.1 `RLException: run_id on parameter server does not match declared run_id`
- 3.2 找不到 `mit_voc.yml`
- 3.3 `rviz` 空白,弹出窗口:"Sorry, the application republish has stopped unexpectedly"
- 3.4 `rviz` 无法显示图像
- 3.5* 【提升部分】
- 补充: `tmuxp` 操作指令
(本来不打算写了,没想到还有不少需要注意的地方,于是一并提及)
本文是关于 kimera-multi开源代码在原作者提供的数据集上运行时的(踩坑)经验。安装部分详见我的 上一篇文章
1 关于数据集
首先,数据集开源了,但没有完全开源,指不能直接在指定的github仓库中找到,需要发邮件给作者团队。不过作者团队设置了自动回复,给出了链接,故可以得到存放数据集的 Google drive
(网盘)链接。
1.1 无法登录 Google drive
墙内特有的问题。自行找梯子,且备好充好的流量下载。
1.2 浏览器下载速度慢且容易失败
这个问题困扰了我非常久。根本原因在于梯子+大文件。尝试了 wget
、curl
等命令行下载方式以及浏览器插件 xdm
,无一例外失败了。不过,在寻找方法的过程中,我找到了这个帖子:
按照帖子里的方法走是可以的,但是注意,限时1.5小时,过了就不能下载了,需要重新获取 Access token
。但是可以使用 -C -
来继续下载,我在该帖子下评论了。
首先获取文件的 FILE_ID
。通过点击数据包那一行右侧竖直的3个点,再点击共享
,最后点击复制链接
,得到一个链接,形式为:
https://drive.google.com/drive/folders/{FILE_ID}?usp=drive_link
下载的全部步骤如下(需要注册 Google
账号):
- 进入 OAuth 2.0 Playground
- 在
Select the Scope
栏粘贴https://www.googleapis.com/auth/drive.readonly
上去并点击Authorize APIs
Google
验证身份,可以选择更多验证方式
中的发送手机验证码进行验证- 点击
Exchange authorization code for tokens
- 复制
Access token
,即Access token=xxx
后面部分作为{Access token}
- 在命令行终端运行:
其中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
文件中的 roscore
在 roslaunch
之后运行,有冲突。在该 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
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_tracks
的话题除了看到图像还能看到特征点;要么直接在该 .rviz
文件中修改话题名称,将 robot0
修改为对应在 1014-example.yaml
中 ROBOT0
的值,其他像 robot1
、 robot2
和 robot3
也是这样修改,同时也可以加上若干个类似的,因为不只有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的仓库。