main.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. "os"
  8. "sync"
  9. "time"
  10. )
  11. type HeartBeatInfo struct {
  12. msg.Package `ros:"diag_msgs"`
  13. ModuleName string `rosname:"module_name"`
  14. Rate int8 `rosname:"rate"`
  15. Timestamp float64 `rosname:"timestamp"`
  16. }
  17. var lastTime time.Time
  18. var mutex sync.Mutex
  19. var sub *goroslib.Subscriber
  20. func main() {
  21. lastTime = time.Now()
  22. // 1 启动 shell 脚本 dpi_start.sh
  23. _, s, err := util.ExecuteWithDirSync("/data", "sh", "dpi_start.sh")
  24. if err != nil {
  25. fmt.Println("执行启动命令报错,执行结果为:", s, ",错误信息为:", err)
  26. os.Exit(1)
  27. }
  28. fmt.Println("执行启动命令 sh dpi_start.sh 成功,执行结果为:", s)
  29. time.Sleep(5 * time.Second)
  30. // 2 监听 ros 话题 /heartbeat_info
  31. rosNode, _ := goroslib.NewNode(goroslib.NodeConf{
  32. Name: "dpi_with_heartbeatInfo",
  33. MasterAddress: "127.0.0.1:11311",
  34. })
  35. sub, err = goroslib.NewSubscriber(goroslib.SubscriberConf{
  36. Node: rosNode,
  37. Topic: "/heartbeat_info",
  38. Callback: func(data *HeartBeatInfo) {
  39. fmt.Println("监听到数据:", data)
  40. lastTime = time.Now()
  41. }})
  42. if err != nil {
  43. fmt.Println("监听话题/heartbeat_info报错", err)
  44. os.Exit(1)
  45. }
  46. // 3 超过5秒没有接收到数据则执行 dpi_stop.sh 和 dpi_start.sh
  47. for {
  48. time.Sleep(1 * time.Second)
  49. if time.Since(lastTime).Seconds() > 5.00 {
  50. fmt.Println("超过5秒没有监听到/heartbeat_info数据,即将重启dpi。")
  51. _, s, err := util.ExecuteWithDirSync("/data", "sh", "dpi_stop.sh")
  52. if err != nil {
  53. fmt.Println("执行停止命令报错,执行结果为:", s, ",错误信息为:", err)
  54. continue
  55. }
  56. fmt.Println("执行停止命令 sh dpi_stop.sh 成功,执行结果为:", s)
  57. sub.Close()
  58. _, s, err = util.ExecuteWithDirSync("/data", "sh", "dpi_start.sh")
  59. if err != nil {
  60. fmt.Println("执行启动命令报错,执行结果为:", s, ",错误信息为:", err)
  61. continue
  62. }
  63. fmt.Println("执行启动命令 sh dpi_start.sh 成功,执行结果为:", s)
  64. time.Sleep(5 * time.Second)
  65. sub, err = goroslib.NewSubscriber(goroslib.SubscriberConf{
  66. Node: rosNode,
  67. Topic: "/heartbeat_info",
  68. Callback: func(data *HeartBeatInfo) {
  69. fmt.Println("监听到数据:", data)
  70. lastTime = time.Now()
  71. }})
  72. if err != nil {
  73. fmt.Println("监听话题/heartbeat_info报错", err)
  74. os.Exit(1)
  75. }
  76. lastTime = time.Now()
  77. }
  78. }
  79. }