欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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的区别),
  • 脚本语言太底层了还涉及到环境变量非常麻烦.

解决问题:

  1. dos 与unix字符不同的问题:
    在编辑完.sh脚本之后转换一下:
    os.system(f"dos2unix ./utils/evo.sh")
    os.system(f"sed -i 's/\r//' ./utils/evo.sh")
    
  2. 环境变量问题
    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文件中就可以运行脚本了.

上代码

  1. 首先是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序列号

  1. 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