start_container.sh 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #!/bin/bash
  2. # 检查到未定义的变量则停止执行并报错
  3. set -u
  4. # 检查参数数量
  5. if [ "$#" -ne 6 ]; then
  6. echo "Error: Incorrect number of arguments"
  7. echo "Usage: $0 IMAGE_NAME CONTAINER_NAME WORLD_NAME MAP_PGM_NAME MAP_YAML_NAME BUILD_MAP_NAME"
  8. exit 1
  9. fi
  10. IMAGE_NAME=$1
  11. CONTAINER_NAME=$2
  12. WORLD_NAME=$3
  13. MAP_PGM_NAME=$4
  14. MAP_YAML_NAME=$5
  15. BUILD_MAP_NAME=$6
  16. SIMULATION_PATH="/home/cicv/work/pji_desktop/simulation"
  17. # 检查容器是否存在
  18. container_id=$(docker ps -aqf name=^"${CONTAINER_NAME}"$)
  19. if [ -n "$container_id" ]; then
  20. echo "Container $CONTAINER_NAME already exists,removing..."
  21. docker rm -f "$container_id"
  22. echo "Container removed"
  23. fi
  24. # 开启容器
  25. echo "Start container..."
  26. ## 创建容器
  27. docker run -itd --name "$CONTAINER_NAME" --net=host -v /home/cicv/work/pji_desktop/simulation/data/pjirobot/data:/root/pjirobot/data "$IMAGE_NAME" /bin/bash
  28. ## 检查容器是否已启动
  29. container_id=$(docker ps -aqf name=^"${CONTAINER_NAME}"$)
  30. if [ -n "$container_id" ]; then
  31. echo "Container $CONTAINER_NAME started"
  32. fi
  33. # 容器依赖服务配置
  34. ## 激活conda环境
  35. source activate simulation
  36. ## 默认起点配置
  37. python "$SIMULATION_PATH"/catkin_ws/src/goal_publish/script/send_initial_pos_0521.py \
  38. "$SIMULATION_PATH"/data/build_map_bag/"$BUILD_MAP_NAME" \
  39. "$SIMULATION_PATH"/catkin_ws/src/SimulationEnvs/launch/env_node.launch \
  40. "$SIMULATION_PATH"/catkin_ws/src/Navigation/launch/amcl.launch
  41. ## 启动仿真环境
  42. ### 选择场景文件
  43. #### 修改env_node.launch中的world_name参数
  44. xmlstarlet ed -u "/launch/include/arg[@name='world_name']/@value" \
  45. -v '$(find SimulationEnvs)/worlds/'"$WORLD_NAME" "$SIMULATION_PATH"/catkin_ws/src/SimulationEnvs/launch/env_node.launch | sponge "$SIMULATION_PATH"/catkin_ws/src/SimulationEnvs/launch/env_node.launch # -v后面如果有$必须为单引号才会被当作字符串
  46. ### 选择地图
  47. #### 修改map_server.launch中的map参数
  48. xmlstarlet ed -u "/launch/arg[@name='map']/@default" \
  49. -v "$MAP_YAML_NAME" "$SIMULATION_PATH"/catkin_ws/src/Navigation/launch/map_server.launch | sponge "$SIMULATION_PATH"/catkin_ws/src/Navigation/launch/map_server.launch
  50. #### 修改map.yaml中的pgm路径
  51. MAP_PGM_PATH="$SIMULATION_PATH"/catkin_ws/src/Navigation/map/"$MAP_PGM_NAME"
  52. #echo '.image = '\""$map_pgm_path"\"
  53. yq e '.image = '\""$MAP_PGM_PATH"\" -i "$SIMULATION_PATH"/catkin_ws/src/Navigation/map/"$MAP_YAML_NAME"
  54. ### 启动仿真
  55. cd "$SIMULATION_PATH"/catkin_ws
  56. rm -r build devel
  57. catkin_make
  58. source devel/setup.bash
  59. #### 清除过时任务
  60. pkill -f "gazebo"
  61. pkill -f "rviz"
  62. rosnode kill --all
  63. sleep 1
  64. nohup roslaunch SimulationEnvs env_node.launch > "$SIMULATION_PATH"/logs/env_node.launch.log 2>&1 &
  65. sleep 1
  66. disown
  67. nohup roslaunch Navigation navigation.launch > "$SIMULATION_PATH"/logs/navigation.launch.log 2>&1 &
  68. disown
  69. sleep 1
  70. ##roslaunch SimulationEnvs env_node.launch
  71. #roslaunch Navigation navigation.launch
  72. # 容器初始配置
  73. # 容器内路径参数
  74. MAP_SERVICE_PATH="/home/load_map_service"
  75. PJI_NAV_PATH="/home/pji_nav"
  76. PJI_ENGINE_PATH="/home/pji_engine"
  77. # 启动加载地图服务
  78. command="cd $MAP_SERVICE_PATH && source devel/setup.bash && nohup rosrun load_map load_map >/dev/null 2>&1 &"
  79. docker exec "$CONTAINER_NAME" /bin/bash -c "$command"
  80. sleep 0.5
  81. # 启动导航节点
  82. command="cd $PJI_NAV_PATH && source install/setup.bash && nohup roslaunch pji_navigation navigation.launch >/dev/null 2>&1 &"
  83. docker exec "$CONTAINER_NAME" /bin/bash -c "$command"
  84. sleep 0.5
  85. # 启动engine节点
  86. command="cd $PJI_ENGINE_PATH && source install/setup.bash && nohup roslaunch pji_launch pji_engine.launch >/dev/null 2>&1 &"
  87. docker exec "$CONTAINER_NAME" /bin/bash -c "$command"
  88. sleep 0.5
  89. echo "done"