run_simulation.sh 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/bin/bash
  2. # 检查到未定义的变量则停止执行并报错
  3. set -u
  4. source /home/cicv/work/pji_desktop/config.sh
  5. # 检查参数数量
  6. if [ "$#" -ne 7 ]; then
  7. echo "Error: Incorrect number of arguments"
  8. echo "Usage: $0 RANDOM_FLAG COUNT OBSTACLE_FLAG DEFAULT_START_FLAG DEFAULT_END_FLAG START_POINT END_POINT"
  9. exit 1
  10. fi
  11. RANDOM_FLAG=$1
  12. COUNT=$2
  13. OBSTACLE_FLAG=$3
  14. DEFAULT_START_FLAG=$4
  15. DEFAULT_END_FLAG=$5
  16. START_POINT=$(echo "$6" | tr ',' ' ')
  17. END_POINT=$(echo "$7" | tr ',' ' ')
  18. MAP_BAG_NAME="origin_map.bag"
  19. #SIMULATION_PATH="/home/cicv/work/pji_desktop/simulation"
  20. SIMULATION_RANDOM_LOG_PATH="$SIMULATION_PATH/logs/simulation_random.log"
  21. SIMULATION_CUSTOM_LOG_PATH="$SIMULATION_PATH/logs/simulation_custom.log"
  22. RECORD_BAG_LOG_PATH="$SIMULATION_PATH/logs/record_bag.log"
  23. RECORD_BAG_FINISH_FLAG="killing the process"
  24. EVALUATION_FINISH_FLAG="Evaluation finished"
  25. # 自定义起终点,数量重置为1
  26. if [ "$RANDOM_FLAG" == "false" ]; then
  27. COUNT=1
  28. fi
  29. # 激活conda环境
  30. source activate simulation
  31. # 清除历史文件
  32. ## 删除录制的rosbag
  33. safe-rm -f "${SIMULATION_PATH:?}"/data/record_bag/* # ${var:?}避免删除其他位置的文件,当变量不存在时会报错,而不是误删除根目录的文件
  34. ## 删除历史日志
  35. if [ -f "$RECORD_BAG_LOG_PATH" ]; then
  36. safe-rm "$RECORD_BAG_LOG_PATH"
  37. fi
  38. if [ -f "$SIMULATION_RANDOM_LOG_PATH" ]; then
  39. safe-rm "$SIMULATION_RANDOM_LOG_PATH"
  40. fi
  41. if [ -f "$SIMULATION_CUSTOM_LOG_PATH" ]; then
  42. safe-rm "$SIMULATION_CUSTOM_LOG_PATH"
  43. fi
  44. # 判断是否为随机起终点
  45. if [ "$RANDOM_FLAG" == "true" ]; then # 随机起终点
  46. echo "Use random start/end point"
  47. command="cd $SIMULATION_PATH/random_install && source install/setup.bash && rosrun random_point random_point $SIMULATION_PATH/data/mapBuf $COUNT"
  48. # 清除环境
  49. pkill -f "rosbag_record"
  50. pkill -f "random_point"
  51. sleep 0.5
  52. # 执行命令
  53. nohup script -q -c bash -c "$command" > "$SIMULATION_RANDOM_LOG_PATH" 2>&1 &
  54. disown
  55. # 录包
  56. command="python $SIMULATION_PATH/rosbag_record.py $SIMULATION_PATH/data/record_bag $COUNT"
  57. nohup script -q -c bash -c "$command" > "$RECORD_BAG_LOG_PATH" 2>&1 &
  58. disown
  59. elif [ "$RANDOM_FLAG" == "false" ]; then # 给定起终点
  60. # 起点设置
  61. if [ "$DEFAULT_START_FLAG" == "true" ]; then
  62. # 默认起点
  63. echo "Use default start point"
  64. ## 配置默认起点
  65. command="cd $SIMULATION_PATH/custom_point && source install/setup.bash && rosrun goal_publish custom $SIMULATION_PATH/data/map_bag/$MAP_BAG_NAME"
  66. ### 清除环境
  67. pkill -f "goal_publish/initialPose"
  68. pkill -f "goal_publish/custom"
  69. sleep 1
  70. echo 'bash -c '\""$command"\"
  71. nohup bash -c "$command" >/dev/null 2>&1 &
  72. sleep 1
  73. elif [ "$DEFAULT_START_FLAG" == "false" ]; then
  74. # 自定义起点
  75. echo "Setting start point: $START_POINT"
  76. ## 发布自定义起点 - gazebo
  77. command="cd $SIMULATION_PATH/catkin_ws && catkin_make && source devel/setup.bash && rosrun goal_publish initialPose $START_POINT"
  78. ### 清除环境
  79. pkill -f "goal_publish/initialPose"
  80. sleep 0.5
  81. echo 'bash -c '\""$command"\"
  82. nohup bash -c "$command" >/dev/null 2>&1 &
  83. sleep 1
  84. ## 发布自定义起点 - rviz
  85. command="cd $SIMULATION_PATH/catkin_ws && catkin_make && source devel/setup.bash && rosrun goal_publish initialPose_rviz $START_POINT"
  86. ### 清除环境
  87. pkill -f "goal_publish/initialPose_rviz"
  88. sleep 0.5
  89. echo 'bash -c '\""$command"\"
  90. nohup bash -c "$command" >/dev/null 2>&1 &
  91. ### 这里必须设置不少于5s的延迟时间,否则rviz中的起点设置会出现问题
  92. sleep 5
  93. echo "Start point: $START_POINT has been set"
  94. fi
  95. # 终点设置
  96. if [ "$DEFAULT_END_FLAG" == "true" ]; then
  97. # 默认终点
  98. echo "Use default end point"
  99. ## 发布默认终点
  100. command="cd $SIMULATION_PATH/catkin_ws && catkin_make && source devel/setup.bash && rosrun goal_publish pub_node $SIMULATION_PATH/data/map_bag/$MAP_BAG_NAME $SIMULATION_PATH/data/map_bag/example.bag"
  101. ## 清除环境
  102. pkill -f "goal_publish/goal" # 下发自定义/默认终点前必须先清除goal,不能只清除pub_node
  103. pkill -f "goal_publish/pub_node"
  104. pkill -f "rosbag record"
  105. sleep 1
  106. echo 'bash -c '\""$command"\"
  107. ## 录包
  108. nohup python "$SIMULATION_PATH/rosbag_record.py" "$SIMULATION_PATH/data/record_bag/" 1 > "$RECORD_BAG_LOG_PATH" 2>&1 &
  109. disown
  110. ## 设置终点并执行
  111. nohup bash -c "$command" > "$SIMULATION_CUSTOM_LOG_PATH" 2>&1 &
  112. disown
  113. elif [ "$DEFAULT_END_FLAG" == "false" ]; then
  114. # 自定义终点
  115. echo "Setting end point: $END_POINT"
  116. ## 发布自定义终点
  117. command="cd $SIMULATION_PATH/catkin_ws && catkin_make && source devel/setup.bash && rosrun goal_publish goal $END_POINT"
  118. ## 清除环境
  119. pkill -f "goal_publish/goal"
  120. pkill -f "goal_publish/pub_node"
  121. pkill -f "rosbag record"
  122. sleep 1
  123. echo 'bash -c '\""$command"\"
  124. ## 录包
  125. nohup python "$SIMULATION_PATH/rosbag_record.py" "$SIMULATION_PATH/data/record_bag/" 1 > "$RECORD_BAG_LOG_PATH" 2>&1 &
  126. disown
  127. ## 设置终点并执行
  128. nohup bash -c "$command" > "$SIMULATION_CUSTOM_LOG_PATH" 2>&1 &
  129. disown
  130. echo "End point: $END_POINT has been set"
  131. fi
  132. fi
  133. # 是否加载障碍物
  134. if [ "$OBSTACLE_FLAG" == "true" ]; then # 加载
  135. echo "Loading default obstacle..."
  136. # 动态加载障碍物
  137. command="cd $SIMULATION_PATH/pji_work && safe-rm -r build devel && catkin_make && source devel/setup.bash && rosrun test demo $SIMULATION_PATH/merge_obstacles_data/merged_obstacles_new.csv"
  138. nohup bash -c "$command" >/dev/null 2>&1 &
  139. sleep 0.5
  140. echo 'bash -c '"$command"
  141. echo "Default obstacle loaded"
  142. fi
  143. ## 检查录包是否完成 - 执行算法评价
  144. tail -F "$RECORD_BAG_LOG_PATH" | while read LINE; do
  145. echo "$LINE"
  146. # 检查录包完成标志
  147. if echo "$LINE" | grep -q "$RECORD_BAG_FINISH_FLAG"; then # 已完成
  148. # 启动算法评价
  149. ## 清理环境
  150. # killall -9 roscore # 如果提示未找到进程不用管,继续执行下一条
  151. # killall -9 rosmaster
  152. ## 清理历史文件
  153. safe-rm -rf "$SIMULATION_PATH"/data/evaluation/* # *必须在外面才代表通配符
  154. ## 配置环境
  155. cd "$SIMULATION_PATH"/track_space
  156. sudo safe-rm -rf "$SIMULATION_PATH/track_space/build" "$SIMULATION_PATH/track_space/devel"
  157. catkin_make
  158. source devel/setup.bash
  159. ## 运行roscore
  160. nohup roscore >/dev/null 2>&1 &
  161. sleep 2
  162. ## 循环评价录制的rosbag
  163. for ((i = 1; i <= COUNT; i++)); do
  164. echo "Evaluating test-$i.bag..."
  165. save_folder="$SIMULATION_PATH/data/evaluation/$i"
  166. if [ ! -d "$save_folder" ]; then
  167. echo "Creating folder: $save_folder..."
  168. mkdir -p "$save_folder"
  169. mkdir -p "$save_folder/trackPicture"
  170. mkdir -p "$save_folder/result"
  171. echo "Folder: $save_folder created successfully"
  172. fi
  173. ## 生成轨迹图片
  174. echo "Creating the track picture..."
  175. rosrun trajectory demo_node "$SIMULATION_PATH/data/map_bag/map.bag" \
  176. "$SIMULATION_PATH/data/record_bag/" \
  177. "$SIMULATION_PATH/data/evaluation/$i/trackPicture/test.png"
  178. echo "The track picture: $SIMULATION_PATH/data/evaluation/$i/trackPicture/test.png created successfully"
  179. ## 执行算法评价
  180. cd "$SIMULATION_PATH"/pji_single/run
  181. ./pji_single "$SIMULATION_PATH/data/record_bag/test-$i.bag" \
  182. "$SIMULATION_PATH/data/evaluation/$i/result" \
  183. "$SIMULATION_PATH/data/evaluation/$i/trackPicture/test.png"
  184. echo "Rosbag test-$i.bag evaluation results generated successfully"
  185. done
  186. echo "$EVALUATION_FINISH_FLAG"
  187. break
  188. fi
  189. done