python中 使用EVO工具 批量评估里程计 脚本
程序员文章站
2022-05-12 22:37:11
背景从win10远程ubuntu服务器跑代码,使用slam的evo工具在KITTI odometry数据集上对网络预测的位姿序列进行评估,一共十个序列,需要输10次命令行(evo_traj/ evo_ape/evo_rpe…balabala),非常不方便,因此想写在python文件的test.py里面,输出预测位姿后保存到文件然后调用命令行直接评估,同时保存评估结果.理想丰满,现实就不是了: 发现编辑的脚本文件跑不通,查了下发现是dos与unix的底层字符不一样(\\n 和\n的区别),以及脚本语言太底...
背景
从win10远程ubuntu服务器跑代码,
使用slam的evo工具在KITTI odometry数据集上对网络预测的位姿序列进行评估,
一共十个序列,需要输10次命令行(evo_traj/ evo_ape/evo_rpe…balabala),非常不方便,
因此想写在python文件的test.py里面,输出预测位姿后保存到文件然后调用命令行直接评估,同时保存评估结果.
理想丰满,现实就不是了:
- 发现编辑的脚本文件跑不通,查了下发现是dos与unix的底层字符不一样(\ \ \n 和\n的区别),
- 脚本语言太底层了还涉及到环境变量非常麻烦.
解决问题:
- dos 与unix字符不同的问题:
在编辑完.sh脚本之后转换一下:os.system(f"dos2unix ./utils/evo.sh") os.system(f"sed -i 's/\r//' ./utils/evo.sh")
- 环境变量问题
ssh远程的终端有login和unlogin的区别(还有个忘记名字了), 造成的结果是ssh的终端的环境变量不一定和pycharm里面设置好的远程解释器的环境变量一样, 解决办法:
test.py 最后添加代码:
上面的环境变量中只有第一个和第二个是需要改成自己的,后面的一般都一样.os.putenv("PATH", "/home/phy12321/anaconda3/envs/torch17/bin:/home/phy12321/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin")
然后在python文件中就可以运行脚本了.
上代码
- 首先是evo脚本 “evo.sh”, 后面test.py文件会调用它.
#!/bin/bash
function echo_and_run { echo -e "\$ $@" ; read input; "$@" ; read input; }
echo "********** EVO Testing ************"
echo "evo on sequence $2"
cd /home/phy12321/code/Multi_view_Cylinder_Net/Logs/"${1}" || exit
ref_pose="/dataset/kitti/poses/${2}.txt"
pred_pose="${1}/pred_pose_${2}.txt"
save_results="${1}/evo_ape_${2}.zip"
save_plot="${1}/ape_${2}.pdf"
echo -e "\n\n" | echo_and_run evo_ape kitti "${ref_pose}" "${pred_pose}" --save_results "${save_results}" -v --plot_mode xz --save_plot "${save_plot}"
ref_pose="/dataset/kitti/poses/${2}.txt"
pred_pose="${1}/pred_pose_${2}.txt"
save_results="${1}/evo_rpe_${2}.zip"
save_plot="${1}/results/rpe_${2}.pdf"
echo -e "\n\n" | echo_and_run evo_rpe kitti "${ref_pose}" "${pred_pose}" -v --save_results "${save_results}" -va --plot_mode xz --save_plot "${save_plot}"
需要把相对路径都提前改好. $1 和$2是调用脚本时传进去的参数, 分别对应保存的文件夹名称和kitti序列号
- test.py
## first save predict pose to pred_pose_XX.txt, then do:
import subprocess
import os
os.system(f"dos2unix ./utils/evo.sh")
os.system(f"sed -i 's/\r//' ./utils/evo.sh")
os.putenv("PATH", "/home/phy12321/anaconda3/envs/torch17/bin:/home/phy12321/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin")
seq_list = ['00','01','02','03','04','05','06','07','08','09','10']
pose_path = ''
for seq in seq_list:
subprocess.call(f"bash ./utils/evo.sh path {seq}", shell=True)
本文地址:https://blog.csdn.net/phy12321/article/details/109902015
下一篇: python第四次