Explorar o código

refactor:增强删除安全保护机制

HeWang hai 9 meses
pai
achega
40fda14e0e

+ 3 - 41
map_update/run_map_update.sh

@@ -14,52 +14,14 @@ DOWNLOAD_FILE_PATH=$2
 UPDATE_DATA_PATH="/home/cicv/work/pji_desktop/map_update/data"
 UPDATE_DATA_PATH="/home/cicv/work/pji_desktop/map_update/data"
 CONTAINER_WORKSPACE="/home/cartographer_detailed_comments_ws-master"
 CONTAINER_WORKSPACE="/home/cartographer_detailed_comments_ws-master"
 
 
-# 敏感目录列表
-SENSITIVE_DIRS=(
-  "/"
-  "/bin"
-  "/boot"
-  "/dev"
-  "/etc"
-  "/home"
-  "/lib"
-  "/lib64"
-  "/opt"
-  "/proc"
-  "/root"
-  "/sbin"
-  "/sys"
-  "/tmp"
-  "/usr"
-  "/var"
-  "/home/cicv"
-)
-# 判断某目录是否为敏感目录
-is_sensitive_directory() {
-  local dir="$1"
-
-  for sensitive_dir in "${SENSITIVE_DIRS[@]}"; do
-    if [[ "$dir" == "$sensitive_dir" ]]; then
-      return 0 # 敏感目录
-    fi
-  done
-
-  return 1 # 非敏感目录
-}
-
 # 清除历史文件
 # 清除历史文件
-# 检查要删除的目录是否为空
+## 检查要删除的目录是否为空
 if [[ -z "$UPDATE_DATA_PATH" ]]; then
 if [[ -z "$UPDATE_DATA_PATH" ]]; then
   echo "Error: Variable UPDATE_DATA_PATH is not set or empty"
   echo "Error: Variable UPDATE_DATA_PATH is not set or empty"
   exit 1
   exit 1
 fi
 fi
-# 检查要删除的目录是否为敏感目录
-if is_sensitive_directory "$UPDATE_DATA_PATH"; then
-    echo "Error: '$UPDATE_DATA_PATH' is a sensitive directory and can not be deleted!"
-    exit 1
-fi
-# 删除对应目录
-sudo rm -rf "$UPDATE_DATA_PATH"
+## 删除对应目录
+safe-rm -rf "$UPDATE_DATA_PATH"
 
 
 # 解压地图更新对应的压缩包
 # 解压地图更新对应的压缩包
 unzip "$DOWNLOAD_FILE_PATH" -d "$UPDATE_DATA_PATH"
 unzip "$DOWNLOAD_FILE_PATH" -d "$UPDATE_DATA_PATH"

BIN=BIN
simulation/data/record_bag/test01.bag


BIN=BIN
simulation/data/record_bag/test02.bag


BIN=BIN
simulation/data/record_bag/test03.bag


BIN=BIN
simulation/data/record_bag/test04.bag


BIN=BIN
simulation/data/record_bag/test05.bag


+ 5 - 44
simulation/data_preparation.sh

@@ -21,54 +21,15 @@ else
   exit 1
   exit 1
 fi
 fi
 
 
-# 敏感目录列表
-SENSITIVE_DIRS=(
-  "/"
-  "/bin"
-  "/boot"
-  "/dev"
-  "/etc"
-  "/home"
-  "/lib"
-  "/lib64"
-  "/opt"
-  "/proc"
-  "/root"
-  "/sbin"
-  "/sys"
-  "/tmp"
-  "/usr"
-  "/var"
-  "/home/cicv"
-)
-# 判断某目录是否为敏感目录
-is_sensitive_directory() {
-  local dir="$1"
-
-  for sensitive_dir in "${SENSITIVE_DIRS[@]}"; do
-    if [[ "$dir" == "$sensitive_dir" ]]; then
-      return 0 # 敏感目录
-    fi
-  done
-
-  return 1 # 非敏感目录
-}
-
 # 清除历史文件
 # 清除历史文件
-# 检查要删除的目录是否为空
+## 检查要删除的目录是否为空
 if [[ -z "$UNZIP_DATA_PATH" ]]; then
 if [[ -z "$UNZIP_DATA_PATH" ]]; then
   echo "Error: Variable UPDATE_DATA_PATH is not set or empty"
   echo "Error: Variable UPDATE_DATA_PATH is not set or empty"
   exit 1
   exit 1
 fi
 fi
-# 检查要删除的目录是否为敏感目录
-if is_sensitive_directory "$UNZIP_DATA_PATH"; then
-    echo "Error: '$UNZIP_DATA_PATH' is a sensitive directory and can not be deleted!"
-    exit 1
-fi
-
 echo "Starting deleting old files: $UNZIP_DATA_PATH..."
 echo "Starting deleting old files: $UNZIP_DATA_PATH..."
-# 删除对应目录
-sudo rm -rf "$UNZIP_DATA_PATH"
+## 删除对应目录
+sudo safe-rm -rf "$UNZIP_DATA_PATH"
 echo "Old files deleted: $UNZIP_DATA_PATH"
 echo "Old files deleted: $UNZIP_DATA_PATH"
 
 
 # 解压文件
 # 解压文件
@@ -82,12 +43,12 @@ echo "Zip file decompressed: $ZIP_FILE_PATH"
 # 复制文件到项目目录
 # 复制文件到项目目录
 ## data目录
 ## data目录
 echo "Starting copying directory: $UNZIP_DATA_PATH/data to $SIMULATION_PATH/data/pjirobot..."
 echo "Starting copying directory: $UNZIP_DATA_PATH/data to $SIMULATION_PATH/data/pjirobot..."
-rm -rf "$SIMULATION_PATH"/data/pjirobot/data/*
+safe-rm -rf "$SIMULATION_PATH"/data/pjirobot/data/*
 sudo cp -r "$UNZIP_DATA_PATH/data" "$SIMULATION_PATH/data/pjirobot/"
 sudo cp -r "$UNZIP_DATA_PATH/data" "$SIMULATION_PATH/data/pjirobot/"
 echo "Directory copy successfully"
 echo "Directory copy successfully"
 ## mapBuf
 ## mapBuf
 echo "Starting copying directory: $UNZIP_DATA_PATH/data/mapBuf to $SIMULATION_PATH/data..."
 echo "Starting copying directory: $UNZIP_DATA_PATH/data/mapBuf to $SIMULATION_PATH/data..."
-rm -rf "$SIMULATION_PATH"/data/mapBuf/*
+safe-rm -rf "$SIMULATION_PATH"/data/mapBuf/*
 sudo cp -r "$UNZIP_DATA_PATH/data/mapBuf" "$SIMULATION_PATH/data/"
 sudo cp -r "$UNZIP_DATA_PATH/data/mapBuf" "$SIMULATION_PATH/data/"
 echo "Directory copy successfully"
 echo "Directory copy successfully"
 ## origin_map.bag
 ## origin_map.bag

+ 4 - 4
simulation/generate_world.sh

@@ -25,16 +25,16 @@ source activate simulation
 rosnode kill --all
 rosnode kill --all
 ## 删除历史日志
 ## 删除历史日志
 if [ -f "$MAP2GAZEBO_LOG_PATH" ]; then
 if [ -f "$MAP2GAZEBO_LOG_PATH" ]; then
-  rm "$MAP2GAZEBO_LOG_PATH"
+  safe-rm "$MAP2GAZEBO_LOG_PATH"
 fi
 fi
 ## 删除旧STL文件
 ## 删除旧STL文件
 if [ -f "$MAP_STL_PATH" ]; then
 if [ -f "$MAP_STL_PATH" ]; then
-  rm "$MAP_STL_PATH"
+  safe-rm "$MAP_STL_PATH"
 fi
 fi
 sleep 0.5
 sleep 0.5
 
 
 # 执行命令
 # 执行命令
-command="cd $SIMULATION_PATH/catkin_map2gazebo && rm -r build devel && catkin_make && source devel/setup.bash && roslaunch --screen map2gazebo map2gazebo.launch"
+command="cd $SIMULATION_PATH/catkin_map2gazebo && safe-rm -r build devel && catkin_make && source devel/setup.bash && roslaunch --screen map2gazebo map2gazebo.launch"
 nohup script -q -c bash -c "$command" > "$MAP2GAZEBO_LOG_PATH" 2>&1 &
 nohup script -q -c bash -c "$command" > "$MAP2GAZEBO_LOG_PATH" 2>&1 &
 disown
 disown
 
 
@@ -59,7 +59,7 @@ tail -f "$MAP2GAZEBO_LOG_PATH" | while read LINE; do
       echo "Service map2gazebo stopped."
       echo "Service map2gazebo stopped."
 
 
       # 执行命令
       # 执行命令
-      command="cd $SIMULATION_PATH/catkin_map2gazebo && rm -r build devel && catkin_make && source devel/setup.bash && roslaunch --screen map2gazebo gazebo_world.launch"
+      command="cd $SIMULATION_PATH/catkin_map2gazebo && safe-rm -r build devel && catkin_make && source devel/setup.bash && roslaunch --screen map2gazebo gazebo_world.launch"
       nohup script -q -c bash -c "$command" > "$GAZEBO_WORLD_LOG_PATH" 2>&1 &
       nohup script -q -c bash -c "$command" > "$GAZEBO_WORLD_LOG_PATH" 2>&1 &
       disown
       disown
     fi
     fi

+ 1 - 1
simulation/play_rosbag.sh

@@ -24,7 +24,7 @@ source activate simulation
 
 
 cd $WORD_GENERATION
 cd $WORD_GENERATION
 
 
-rm -r build devel
+safe-rm -r build devel
 catkin_make
 catkin_make
 source devel/setup.bash
 source devel/setup.bash
 
 

+ 40 - 11
simulation/rosbag_record.py

@@ -1,3 +1,11 @@
+'''
+Description: 
+Version: 1.0
+Autor: Sun Yalun
+Date: 2024-09-05 14:53:32
+LastEditors: Sun Yalun
+LastEditTime: 2024-09-05 15:46:54
+'''
 #!/usr/bin/env python
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 
 
@@ -12,7 +20,7 @@ from move_base_msgs.msg import MoveBaseActionGoal
 from datetime import datetime
 from datetime import datetime
 
 
 class RosbagRecorder:
 class RosbagRecorder:
-    def __init__(self, path):
+    def __init__(self, bag_dir, count):
         rospy.init_node('rosbag_recorder', anonymous=True)
         rospy.init_node('rosbag_recorder', anonymous=True)
         rospy.set_param('/use_sim_time', False)
         rospy.set_param('/use_sim_time', False)
         self.goal_sub = rospy.Subscriber('/move_base/goal', MoveBaseActionGoal, self.goal_callback)
         self.goal_sub = rospy.Subscriber('/move_base/goal', MoveBaseActionGoal, self.goal_callback)
@@ -24,15 +32,25 @@ class RosbagRecorder:
         self.recording = False
         self.recording = False
         self.pose_position = None
         self.pose_position = None
         self.cmd_vel = None
         self.cmd_vel = None
-        self.bag_path = path
+        self.bag_dir = bag_dir
+        self.bag_count = 1
+        self.total_count = int(count)
 
 
     def goal_callback(self, msg):
     def goal_callback(self, msg):
+        # 如果当前已录制的 bag 文件数量大于等于传入的 count 参数,就不再录制
+        if self.bag_count > self.total_count:
+            rospy.loginfo("Recording limit reached. Exiting...")
+            self.shutdown_node()
+            return
         # 更新时间戳为当前时间
         # 更新时间戳为当前时间
         msg.header.stamp = rospy.Time.now()
         msg.header.stamp = rospy.Time.now()
         self.goal_position = msg.goal.target_pose.pose.position
         self.goal_position = msg.goal.target_pose.pose.position
         rospy.loginfo("Goal received, starting rosbag recording...")
         rospy.loginfo("Goal received, starting rosbag recording...")
-        self.start_recording()
 
 
+        bag_file_name = f"test{self.bag_count:02d}.bag"
+        bag_file_path = os.path.join(self.bag_dir, bag_file_name)
+        self.bag_path = bag_file_path  
+        self.start_recording()
     def pose_callback(self, msg):
     def pose_callback(self, msg):
         # 更新时间戳为当前时间
         # 更新时间戳为当前时间
         msg.header.stamp = rospy.Time.now()
         msg.header.stamp = rospy.Time.now()
@@ -47,25 +65,28 @@ class RosbagRecorder:
 
 
     def start_recording(self):
     def start_recording(self):
         if not self.recording:
         if not self.recording:
-            # self.bag_process = subprocess.Popen(['rosbag', 'record', '/amcl_pose', '/cmd_vel', '/some_topic1', '/some_topic2'])
             self.bag_process = subprocess.Popen(['rosbag', 'record', '-O', self.bag_path, '/amcl_pose', '/imu', '/obstacle_detection', '/odom', '/sys_info'], preexec_fn=os.setsid)
             self.bag_process = subprocess.Popen(['rosbag', 'record', '-O', self.bag_path, '/amcl_pose', '/imu', '/obstacle_detection', '/odom', '/sys_info'], preexec_fn=os.setsid)
             self.recording = True
             self.recording = True
 
 
     def stop_recording(self):
     def stop_recording(self):
         if self.recording and self.bag_process:
         if self.recording and self.bag_process:
             rospy.loginfo("Stopping rosbag recording...")
             rospy.loginfo("Stopping rosbag recording...")
-            # self.bag_process.terminate()
-            # self.bag_process.wait(timeout=10)
             # os.killpg(os.getpgid(self.bag_process.pid), signal.SIGTERM)  # 首先发送SIGTERM信号
             # os.killpg(os.getpgid(self.bag_process.pid), signal.SIGTERM)  # 首先发送SIGTERM信号
             os.killpg(os.getpgid(self.bag_process.pid), signal.SIGINT)  # 首先发送SIGINT信号
             os.killpg(os.getpgid(self.bag_process.pid), signal.SIGINT)  # 首先发送SIGINT信号
-            # self.bag_process.wait(timeout=10)
             try:
             try:
                 self.bag_process.wait(timeout=5)  # 等待进程终止,如果超过5秒,进行强制终止
                 self.bag_process.wait(timeout=5)  # 等待进程终止,如果超过5秒,进行强制终止
             except subprocess.TimeoutExpired:
             except subprocess.TimeoutExpired:
                 rospy.logwarn("Rosbag process did not terminate, sending SIGKILL...")
                 rospy.logwarn("Rosbag process did not terminate, sending SIGKILL...")
                 os.killpg(os.getpgid(self.bag_process.pid), signal.SIGKILL)  # 强制终止
                 os.killpg(os.getpgid(self.bag_process.pid), signal.SIGKILL)  # 强制终止
-                self.bag_process.wait()  # 再次等待确保进程已经被终止
+                self.bag_process.wait()  # 再次等待确保进程已经被终止                      
             self.recording = False
             self.recording = False
+            self.bag_count += 1
+
+            # 如果录制的包数量达到总数,停止整个节点
+            if self.bag_count > self.total_count:
+                rospy.loginfo("All recordings completed. Exiting...")
+                rospy.sleep(2)  # 等待一秒,确保rosbag_recorder节点已经退出
+                self.shutdown_node()
 
 
     def check_stop_condition(self):
     def check_stop_condition(self):
         if self.goal_position and self.pose_position and self.cmd_vel:
         if self.goal_position and self.pose_position and self.cmd_vel:
@@ -76,10 +97,18 @@ class RosbagRecorder:
     def calculate_distance(self, pos1, pos2):
     def calculate_distance(self, pos1, pos2):
         return ((pos1.x - pos2.x) ** 2 + (pos1.y - pos2.y) ** 2) ** 0.5
         return ((pos1.x - pos2.x) ** 2 + (pos1.y - pos2.y) ** 2) ** 0.5
 
 
+    def shutdown_node(self):
+        """停止ROS节点和当前进程"""
+        rospy.loginfo("Shutting down ROS node and killing the process.")
+        rospy.sleep(2)  # 等待三秒,确保rosbag_recorder节点已经退出
+        rospy.signal_shutdown("Completed all recordings.")
+        sys.exit(0)  # 终止Python脚本
+
 if __name__ == '__main__':
 if __name__ == '__main__':
     try:
     try:
-        bag_path = sys.argv[1]
-        recorder = RosbagRecorder(bag_path)
+        bag_folder_path = sys.argv[1]
+        count = sys.argv[2]
+        recorder = RosbagRecorder(bag_folder_path, count)
         rospy.spin()
         rospy.spin()
     except rospy.ROSInterruptException:
     except rospy.ROSInterruptException:
-        pass
+        pass

+ 11 - 40
simulation/rosbag_record_0905.py → simulation/rosbag_record_old.py

@@ -1,11 +1,3 @@
-'''
-Description: 
-Version: 1.0
-Autor: Sun Yalun
-Date: 2024-09-05 14:53:32
-LastEditors: Sun Yalun
-LastEditTime: 2024-09-05 15:46:54
-'''
 #!/usr/bin/env python
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 
 
@@ -20,7 +12,7 @@ from move_base_msgs.msg import MoveBaseActionGoal
 from datetime import datetime
 from datetime import datetime
 
 
 class RosbagRecorder:
 class RosbagRecorder:
-    def __init__(self, bag_dir, count):
+    def __init__(self, path):
         rospy.init_node('rosbag_recorder', anonymous=True)
         rospy.init_node('rosbag_recorder', anonymous=True)
         rospy.set_param('/use_sim_time', False)
         rospy.set_param('/use_sim_time', False)
         self.goal_sub = rospy.Subscriber('/move_base/goal', MoveBaseActionGoal, self.goal_callback)
         self.goal_sub = rospy.Subscriber('/move_base/goal', MoveBaseActionGoal, self.goal_callback)
@@ -32,25 +24,15 @@ class RosbagRecorder:
         self.recording = False
         self.recording = False
         self.pose_position = None
         self.pose_position = None
         self.cmd_vel = None
         self.cmd_vel = None
-        self.bag_dir = bag_dir
-        self.bag_count = 1
-        self.total_count = int(count)
+        self.bag_path = path
 
 
     def goal_callback(self, msg):
     def goal_callback(self, msg):
-        # 如果当前已录制的 bag 文件数量大于等于传入的 count 参数,就不再录制
-        if self.bag_count > self.total_count:
-            rospy.loginfo("Recording limit reached. Exiting...")
-            self.shutdown_node()
-            return
         # 更新时间戳为当前时间
         # 更新时间戳为当前时间
         msg.header.stamp = rospy.Time.now()
         msg.header.stamp = rospy.Time.now()
         self.goal_position = msg.goal.target_pose.pose.position
         self.goal_position = msg.goal.target_pose.pose.position
         rospy.loginfo("Goal received, starting rosbag recording...")
         rospy.loginfo("Goal received, starting rosbag recording...")
-
-        bag_file_name = f"test{self.bag_count:02d}.bag"
-        bag_file_path = os.path.join(self.bag_dir, bag_file_name)
-        self.bag_path = bag_file_path  
         self.start_recording()
         self.start_recording()
+
     def pose_callback(self, msg):
     def pose_callback(self, msg):
         # 更新时间戳为当前时间
         # 更新时间戳为当前时间
         msg.header.stamp = rospy.Time.now()
         msg.header.stamp = rospy.Time.now()
@@ -65,28 +47,25 @@ class RosbagRecorder:
 
 
     def start_recording(self):
     def start_recording(self):
         if not self.recording:
         if not self.recording:
+            # self.bag_process = subprocess.Popen(['rosbag', 'record', '/amcl_pose', '/cmd_vel', '/some_topic1', '/some_topic2'])
             self.bag_process = subprocess.Popen(['rosbag', 'record', '-O', self.bag_path, '/amcl_pose', '/imu', '/obstacle_detection', '/odom', '/sys_info'], preexec_fn=os.setsid)
             self.bag_process = subprocess.Popen(['rosbag', 'record', '-O', self.bag_path, '/amcl_pose', '/imu', '/obstacle_detection', '/odom', '/sys_info'], preexec_fn=os.setsid)
             self.recording = True
             self.recording = True
 
 
     def stop_recording(self):
     def stop_recording(self):
         if self.recording and self.bag_process:
         if self.recording and self.bag_process:
             rospy.loginfo("Stopping rosbag recording...")
             rospy.loginfo("Stopping rosbag recording...")
+            # self.bag_process.terminate()
+            # self.bag_process.wait(timeout=10)
             # os.killpg(os.getpgid(self.bag_process.pid), signal.SIGTERM)  # 首先发送SIGTERM信号
             # os.killpg(os.getpgid(self.bag_process.pid), signal.SIGTERM)  # 首先发送SIGTERM信号
             os.killpg(os.getpgid(self.bag_process.pid), signal.SIGINT)  # 首先发送SIGINT信号
             os.killpg(os.getpgid(self.bag_process.pid), signal.SIGINT)  # 首先发送SIGINT信号
+            # self.bag_process.wait(timeout=10)
             try:
             try:
                 self.bag_process.wait(timeout=5)  # 等待进程终止,如果超过5秒,进行强制终止
                 self.bag_process.wait(timeout=5)  # 等待进程终止,如果超过5秒,进行强制终止
             except subprocess.TimeoutExpired:
             except subprocess.TimeoutExpired:
                 rospy.logwarn("Rosbag process did not terminate, sending SIGKILL...")
                 rospy.logwarn("Rosbag process did not terminate, sending SIGKILL...")
                 os.killpg(os.getpgid(self.bag_process.pid), signal.SIGKILL)  # 强制终止
                 os.killpg(os.getpgid(self.bag_process.pid), signal.SIGKILL)  # 强制终止
-                self.bag_process.wait()  # 再次等待确保进程已经被终止                      
+                self.bag_process.wait()  # 再次等待确保进程已经被终止
             self.recording = False
             self.recording = False
-            self.bag_count += 1
-
-            # 如果录制的包数量达到总数,停止整个节点
-            if self.bag_count > self.total_count:
-                rospy.loginfo("All recordings completed. Exiting...")
-                rospy.sleep(2)  # 等待一秒,确保rosbag_recorder节点已经退出
-                self.shutdown_node()
 
 
     def check_stop_condition(self):
     def check_stop_condition(self):
         if self.goal_position and self.pose_position and self.cmd_vel:
         if self.goal_position and self.pose_position and self.cmd_vel:
@@ -97,18 +76,10 @@ class RosbagRecorder:
     def calculate_distance(self, pos1, pos2):
     def calculate_distance(self, pos1, pos2):
         return ((pos1.x - pos2.x) ** 2 + (pos1.y - pos2.y) ** 2) ** 0.5
         return ((pos1.x - pos2.x) ** 2 + (pos1.y - pos2.y) ** 2) ** 0.5
 
 
-    def shutdown_node(self):
-        """停止ROS节点和当前进程"""
-        rospy.loginfo("Shutting down ROS node and killing the process.")
-        rospy.sleep(2)  # 等待三秒,确保rosbag_recorder节点已经退出
-        rospy.signal_shutdown("Completed all recordings.")
-        sys.exit(0)  # 终止Python脚本
-
 if __name__ == '__main__':
 if __name__ == '__main__':
     try:
     try:
-        bag_folder_path = sys.argv[1]
-        count = sys.argv[2]
-        recorder = RosbagRecorder(bag_folder_path, count)
+        bag_path = sys.argv[1]
+        recorder = RosbagRecorder(bag_path)
         rospy.spin()
         rospy.spin()
     except rospy.ROSInterruptException:
     except rospy.ROSInterruptException:
-        pass
+        pass

+ 1 - 1
simulation/run_evaluation.sh

@@ -19,7 +19,7 @@ killall -9 roscore # 如果提示未找到进程不用管,继续执行下一
 killall -9 rosmaster
 killall -9 rosmaster
 ## 配置环境
 ## 配置环境
 cd "$SIMULATION_PATH"/track_space
 cd "$SIMULATION_PATH"/track_space
-rm -r build devel
+safe-rm -r build devel
 catkin_make
 catkin_make
 source devel/setup.bash
 source devel/setup.bash
 ## 在新终端中运行roscore
 ## 在新终端中运行roscore

+ 2 - 2
simulation/run_map2gazebo.sh

@@ -13,11 +13,11 @@ source activate simulation
 ## kill ros节点
 ## kill ros节点
 rosnode kill --all
 rosnode kill --all
 ## 删除历史日志
 ## 删除历史日志
-rm "$MAP2GAZEBO_LOG_PATH"
+safe-rm "$MAP2GAZEBO_LOG_PATH"
 sleep 0.5
 sleep 0.5
 
 
 # 执行命令
 # 执行命令
-command="cd $SIMULATION_PATH/catkin_map2gazebo && rm -r build devel && catkin_make && source devel/setup.bash && roslaunch --screen map2gazebo map2gazebo.launch "
+command="cd $SIMULATION_PATH/catkin_map2gazebo && safe-rm -r build devel && catkin_make && source devel/setup.bash && roslaunch --screen map2gazebo map2gazebo.launch "
 nohup script -q -c bash -c "$command" > "$MAP2GAZEBO_LOG_PATH" 2>&1 &
 nohup script -q -c bash -c "$command" > "$MAP2GAZEBO_LOG_PATH" 2>&1 &
 disown
 disown
 
 

+ 15 - 17
simulation/run_simulation.sh

@@ -25,12 +25,18 @@ RECORD_BAG_LOG_PATH="$SIMULATION_PATH/logs/record_bag.log"
 # 激活conda环境
 # 激活conda环境
 source activate simulation
 source activate simulation
 
 
+# 清除历史文件
+## 删除录制的rosbag
+safe-rm -f "${SIMULATION_PATH:?}"/data/record_bag/* # ${var:?}避免删除其他位置的文件,当变量不存在时会报错,而不是误删除根目录的文件
+
 # 判断是否为随机起终点
 # 判断是否为随机起终点
 if [ "$RANDOM_FLAG" == "true" ]; then # 随机起终点
 if [ "$RANDOM_FLAG" == "true" ]; then # 随机起终点
   command="cd $SIMULATION_PATH/random_install && source install/setup.bash && rosrun random_point random_point $SIMULATION_PATH/data/mapBuf $COUNT"
   command="cd $SIMULATION_PATH/random_install && source install/setup.bash && rosrun random_point random_point $SIMULATION_PATH/data/mapBuf $COUNT"
+  # 清除环境
+  pkill -f "rosbag_record"
   nohup script -q -c bash -c "$command" > "$SIMULATION_RANDOM_LOG_PATH" 2>&1 &
   nohup script -q -c bash -c "$command" > "$SIMULATION_RANDOM_LOG_PATH" 2>&1 &
   # 录包
   # 录包
-  nohup python "$SIMULATION_PATH/rosbag_record_0905.py" "$SIMULATION_PATH/data/record_bag/" "$COUNT" > "$RECORD_BAG_LOG_PATH" 2>&1
+  nohup python "$SIMULATION_PATH/rosbag_record.py" "$SIMULATION_PATH/data/record_bag/" "$COUNT" > "$RECORD_BAG_LOG_PATH" 2>&1 &
 elif [ "$RANDOM_FLAG" == "false" ]; then # 给定起终点
 elif [ "$RANDOM_FLAG" == "false" ]; then # 给定起终点
   # 起点设置
   # 起点设置
   if [ "$DEFAULT_START_FLAG" == "true" ]; then
   if [ "$DEFAULT_START_FLAG" == "true" ]; then
@@ -74,39 +80,32 @@ elif [ "$RANDOM_FLAG" == "false" ]; then # 给定起终点
     # 默认终点
     # 默认终点
     echo "Use default end point"
     echo "Use default end point"
     ## 发布默认终点
     ## 发布默认终点
-  #  command="cd $SIMULATION_PATH/catkin_ws && source devel/setup.bash && rosrun goal_publish pub_node $SIMULATION_PATH/data/build_map_bag/$BUILD_MAP_NAME $SIMULATION_PATH/evaluation_bag/example_0821_4.bag"
-    command="cd $SIMULATION_PATH/catkin_ws && rm -r build devel && catkin_make && source devel/setup.bash && rosrun goal_publish pub_node $SIMULATION_PATH/data/map_bag/$MAP_BAG_NAME $SIMULATION_PATH/data/old_bag/example.bag"
-    ## 录包
-    ### 激活conda环境
-  #  source activate simulation
-  #  nohup python "$SIMULATION_PATH"/rosbag_record.py "$SIMULATION_PATH"/data/record_bag/test.bag >/dev/null 2>&1 &
+    command="cd $SIMULATION_PATH/catkin_ws && safe-rm -r build devel && catkin_make && source devel/setup.bash && rosrun goal_publish pub_node $SIMULATION_PATH/data/map_bag/$MAP_BAG_NAME $SIMULATION_PATH/data/old_bag/example.bag"
     ## 清除环境
     ## 清除环境
     pkill -f "goal_publish/goal" # 下发自定义/默认终点前必须先清除goal,不能只清除pub_node
     pkill -f "goal_publish/goal" # 下发自定义/默认终点前必须先清除goal,不能只清除pub_node
     pkill -f "goal_publish/pub_node"
     pkill -f "goal_publish/pub_node"
     pkill -f "rosbag_record"
     pkill -f "rosbag_record"
     sleep 1
     sleep 1
     echo 'bash -c '\""$command"\"
     echo 'bash -c '\""$command"\"
-    nohup python "$SIMULATION_PATH"/rosbag_record.py "$SIMULATION_PATH"/data/record_bag/test.bag >record_bag.log 2>&1 &
+    ## 录包
+    nohup python "$SIMULATION_PATH/rosbag_record.py" "$SIMULATION_PATH/data/record_bag/" 1 > "$RECORD_BAG_LOG_PATH" 2>&1 &
     ## 设置终点并执行
     ## 设置终点并执行
     nohup bash -c "$command" > "$SIMULATION_CUSTOM_LOG_PATH" 2>&1 &
     nohup bash -c "$command" > "$SIMULATION_CUSTOM_LOG_PATH" 2>&1 &
   elif [ "$DEFAULT_END_FLAG" == "false" ]; then
   elif [ "$DEFAULT_END_FLAG" == "false" ]; then
     # 自定义终点
     # 自定义终点
     echo "Setting end point: $END_POINT"
     echo "Setting end point: $END_POINT"
     ## 发布自定义终点
     ## 发布自定义终点
-    command="cd $SIMULATION_PATH/catkin_ws && rm -r build devel && catkin_make && source devel/setup.bash && rosrun goal_publish goal $END_POINT"
-    ## 录包
-    ### 激活conda环境
-  #  source activate simulation
-
+    command="cd $SIMULATION_PATH/catkin_ws && safe-rm -r build devel && catkin_make && source devel/setup.bash && rosrun goal_publish goal $END_POINT"
     ## 清除环境
     ## 清除环境
     pkill -f "goal_publish/goal"
     pkill -f "goal_publish/goal"
     pkill -f "goal_publish/pub_node"
     pkill -f "goal_publish/pub_node"
     pkill -f "rosbag_record"
     pkill -f "rosbag_record"
     sleep 1
     sleep 1
     echo 'bash -c '\""$command"\"
     echo 'bash -c '\""$command"\"
-    nohup python "$SIMULATION_PATH"/rosbag_record.py "$SIMULATION_PATH"/data/record_bag/test.bag >/dev/null 2>&1 &
-     nohup bash -c "$command" > "$SIMULATION_CUSTOM_LOG_PATH" 2>&1 &
+    ## 录包
+    nohup python "$SIMULATION_PATH/rosbag_record.py" "$SIMULATION_PATH/data/record_bag/" 1 > "$RECORD_BAG_LOG_PATH" 2>&1 &
     ## 设置终点并执行
     ## 设置终点并执行
+    nohup bash -c "$command" > "$SIMULATION_CUSTOM_LOG_PATH" 2>&1 &
     echo "End point: $END_POINT has been set"
     echo "End point: $END_POINT has been set"
   fi
   fi
 fi
 fi
@@ -117,8 +116,7 @@ if [ "$OBSTACLE_FLAG" == "true" ]; then # 加载
   # 动态加载障碍物
   # 动态加载障碍物
   command="cd $SIMULATION_PATH/pji_work && source devel/setup.bash && rosrun test demo $SIMULATION_PATH/merge_obstacles_data/merged_obstacles_new_0517_1.csv"
   command="cd $SIMULATION_PATH/pji_work && source devel/setup.bash && rosrun test demo $SIMULATION_PATH/merge_obstacles_data/merged_obstacles_new_0517_1.csv"
   nohup bash -c "$command" >/dev/null 2>&1 &
   nohup bash -c "$command" >/dev/null 2>&1 &
-#  gnome-terminal --tab -e 'bash -c '\""$command"\"
   sleep 0.5
   sleep 0.5
   echo 'bash -c '"$command"
   echo 'bash -c '"$command"
   echo "Default obstacle loaded"
   echo "Default obstacle loaded"
-fi
+fi

+ 1 - 1
simulation/start_container.sh

@@ -43,7 +43,7 @@ MAP_PGM_PATH="$SIMULATION_PATH"/catkin_ws/src/Navigation/map/"$MAP_PGM_NAME"
 yq e '.image = '\""$MAP_PGM_PATH"\" -i "$SIMULATION_PATH"/catkin_ws/src/Navigation/map/"$MAP_YAML_NAME"
 yq e '.image = '\""$MAP_PGM_PATH"\" -i "$SIMULATION_PATH"/catkin_ws/src/Navigation/map/"$MAP_YAML_NAME"
 ### 启动仿真
 ### 启动仿真
 cd "$SIMULATION_PATH"/catkin_ws
 cd "$SIMULATION_PATH"/catkin_ws
-rm -r build devel
+safe-rm -r build devel
 catkin_make
 catkin_make
 source devel/setup.bash
 source devel/setup.bash
 #### 清除过时任务
 #### 清除过时任务