背景

从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/"" || exit
ref_pose="/dataset/kitti/poses/.txt"
pred_pose="/pred_pose_.txt"
save_results="/evo_ape_.zip"
save_plot="/ape_.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/.txt"
pred_pose="/pred_pose_.txt"
save_results="/evo_rpe_.zip"
save_plot="/results/rpe_.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