|
@@ -6,11 +6,14 @@ import (
|
|
|
"cicv-data-closedloop/pji/common/cfg"
|
|
|
"cicv-data-closedloop/pji/common/cutil"
|
|
|
"github.com/bluenviron/goroslib/v2"
|
|
|
+ "os"
|
|
|
+ "os/exec"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
// BagRecord 打包rosbag
|
|
|
func BagRecord(nodeName string) {
|
|
|
+ var err error
|
|
|
c_log.GlobalLogger.Info("rosbag record goroutine - 启动")
|
|
|
for {
|
|
|
c_log.GlobalLogger.Info("校验必需的 rosnode 是否全部启动。")
|
|
@@ -36,34 +39,44 @@ func BagRecord(nodeName string) {
|
|
|
// 2 ------- 调用 rosbag 打包命令,该命令自动阻塞 -------
|
|
|
// 不在此处压缩,因为 rosbag filter 时会报错。在上传到oss之前压缩即可。
|
|
|
// 包名格式:2023-11-15-17-35-20_0.bag
|
|
|
- cutil.CreateParentDir(cfg.CloudConfig.BagDataDir)
|
|
|
- //cmd, err := util.ExecuteWithDirAsync(cfg.CloudConfig.BagDataDir, "/opt/ros/melodic/bin/rosbag", command...)
|
|
|
- //if err != nil {
|
|
|
- // c_log.GlobalLogger.Error("执行record命令", command, "出错:", err)
|
|
|
- // continue
|
|
|
- //}
|
|
|
- cmd, output, err := util.ExecuteWithDirSync(cfg.CloudConfig.BagDataDir, "/opt/ros/melodic/bin/rosbag", command...)
|
|
|
- if err != nil {
|
|
|
- c_log.GlobalLogger.Error("执行record命令", command, "出错:【output】=", output, "【err】=", err)
|
|
|
- continue
|
|
|
- }
|
|
|
- c_log.GlobalLogger.Info("启动record命令成功。")
|
|
|
- recordProcessPid := cmd.Process.Pid
|
|
|
+ _ = cutil.CreateParentDir(cfg.CloudConfig.BagDataDir)
|
|
|
+ var recordProcessPid int
|
|
|
var recordSubProcessPid int
|
|
|
+ var cmd *exec.Cmd
|
|
|
+ parent:
|
|
|
for {
|
|
|
- time.Sleep(time.Duration(2) * time.Second)
|
|
|
- recordSubProcessPid, err = util.GetSubProcessPid(recordProcessPid)
|
|
|
+ cmd, err = util.ExecuteWithDirAsync(cfg.CloudConfig.BagDataDir, "/opt/ros/melodic/bin/rosbag", command...)
|
|
|
if err != nil {
|
|
|
- c_log.GlobalLogger.Info("正在等待获取进程 ", recordProcessPid, " 的子进程的pid。")
|
|
|
+ c_log.GlobalLogger.Error("执行record命令", command, "出错:", err)
|
|
|
continue
|
|
|
}
|
|
|
- if recordSubProcessPid != 0 {
|
|
|
- c_log.GlobalLogger.Info("获取进程 ", recordProcessPid, " 的子进程的pid:", recordSubProcessPid)
|
|
|
- break
|
|
|
+ //cmd, output, err := util.ExecuteWithDirSync(cfg.CloudConfig.BagDataDir, "/opt/ros/melodic/bin/rosbag", command...)
|
|
|
+ //if err != nil {
|
|
|
+ // c_log.GlobalLogger.Error("执行record命令", command, "出错:【output】=", output, "【err】=", err)
|
|
|
+ // continue
|
|
|
+ //}
|
|
|
+
|
|
|
+ recordProcessPid = cmd.Process.Pid
|
|
|
+ sub:
|
|
|
+ for {
|
|
|
+ time.Sleep(time.Duration(2) * time.Second)
|
|
|
+ process, err := os.FindProcess(recordProcessPid)
|
|
|
+ if process == nil {
|
|
|
+ continue parent
|
|
|
+ }
|
|
|
+ recordSubProcessPid, err = util.GetSubProcessPid(recordProcessPid)
|
|
|
+ if err != nil {
|
|
|
+ c_log.GlobalLogger.Info("正在等待获取进程 ", recordProcessPid, " 的子进程的pid。")
|
|
|
+ continue sub
|
|
|
+ }
|
|
|
+ if recordSubProcessPid != 0 {
|
|
|
+ c_log.GlobalLogger.Info("获取进程 ", recordProcessPid, " 的子进程的pid:", recordSubProcessPid)
|
|
|
+ break parent
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
// 等待自杀信号
|
|
|
- c_log.GlobalLogger.Info("rosbag record goroutine - 等待自杀信号")
|
|
|
+ c_log.GlobalLogger.Info("启动record命令成功。等待自杀信号。")
|
|
|
select {
|
|
|
case signal := <-ChannelKillRosRecord:
|
|
|
if signal == 1 {
|