main.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package main
  2. import (
  3. "cicv-data-closedloop/common/util"
  4. "fmt"
  5. "github.com/bluenviron/goroslib/v2"
  6. "github.com/bluenviron/goroslib/v2/pkg/msg"
  7. "sync"
  8. "time"
  9. )
  10. type HeartBeatInfo struct {
  11. msg.Package `ros:"diag_msgs"`
  12. ModuleName string `rosname:"module_name"`
  13. Rate int8 `rosname:"rate"`
  14. timestamp float64 `rosname:"timestamp"`
  15. }
  16. var lastTime time.Time
  17. var mutex sync.Mutex
  18. func main() {
  19. lastTime = time.Now()
  20. // 1 启动 shell 脚本 dpi_start.sh
  21. _, s, err := util.ExecuteWithDirSync("/data", "sh", "dpi_start.sh")
  22. if err != nil {
  23. fmt.Println("执行启动命令报错,执行结果为:", s, ",错误信息为:", err)
  24. }
  25. // 2 监听 ros 话题 /heartbeat_info
  26. rosNode, _ := goroslib.NewNode(goroslib.NodeConf{
  27. Name: "dpi_with_heartbeatInfo",
  28. MasterAddress: "127.0.0.1:11311",
  29. })
  30. _, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
  31. Node: rosNode,
  32. Topic: "/heartbeat_info",
  33. Callback: func(data *HeartBeatInfo) {
  34. fmt.Println("监听到数据:", data)
  35. mutex.Lock()
  36. lastTime = time.Now()
  37. mutex.Unlock()
  38. }})
  39. // 3 超过5秒没有接收到数据则执行 dpi_stop.sh 和 dpi_start.sh
  40. for {
  41. time.Sleep(1 * time.Second)
  42. mutex.Lock()
  43. if time.Since(lastTime) > 5.00 {
  44. fmt.Println("超过5秒没有监听到/heartbeat_info数据,即将重启dpi。")
  45. _, s, err = util.ExecuteWithDirSync("/data", "sh", "dpi_stop.sh")
  46. if err != nil {
  47. fmt.Println("执行停止命令报错,执行结果为:", s, ",错误信息为:", err)
  48. }
  49. _, s, err = util.ExecuteWithDirSync("/data", "sh", "dpi_start.sh")
  50. if err != nil {
  51. fmt.Println("执行启动命令报错,执行结果为:", s, ",错误信息为:", err)
  52. }
  53. }
  54. mutex.Unlock()
  55. }
  56. }