saturn_controller.hpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include <spdlog/spdlog.h>
  2. #include <geometry_msgs/msg/pose_stamped.hpp>
  3. #include <geometry_msgs/msg/twist.hpp>
  4. #include <nav_msgs/msg/odometry.hpp>
  5. #include <rclcpp/rclcpp.hpp>
  6. #include <rclcpp_components/register_node_macro.hpp>
  7. #include <sensor_msgs/msg/battery_state.hpp>
  8. #include <sensor_msgs/msg/imu.hpp>
  9. #include <sensor_msgs/msg/joint_state.hpp>
  10. #include <std_msgs/msg/float32_multi_array.hpp>
  11. #include <std_msgs/msg/int32.hpp>
  12. #include <std_msgs/msg/string.hpp>
  13. #include <std_msgs/msg/u_int32.hpp>
  14. #include <std_msgs/msg/u_int8.hpp>
  15. #include <std_srvs/srv/set_bool.hpp>
  16. #include "common.h"
  17. #include "config_handler.hpp"
  18. #include "daystar_navigation_msgs/msg/guardian.hpp"
  19. #include "daystar_navigation_msgs/srv/guardian.hpp"
  20. #include "mc_client_interface.h"
  21. #include "saturn_msgs/msg/common_status.hpp"
  22. #include "saturn_msgs/msg/joints_status.hpp"
  23. #include "ysc_robot_msgs/srv/robot_command.hpp"
  24. namespace saturn_ros2 {
  25. enum class Robot_Gait : uint8_t {
  26. TROT = 0, // 正常步态
  27. NORMAL_STAIR = 1, // 楼梯步态
  28. SLOPE = 2, // 斜坡步态
  29. SENSE_STAIR = 6, // 感知楼梯步态
  30. };
  31. class SaturnController {
  32. public:
  33. // type alias
  34. using Twist = geometry_msgs::msg::Twist;
  35. using Imu = sensor_msgs::msg::Imu;
  36. using BatteryState = sensor_msgs::msg::BatteryState;
  37. using Odometry = nav_msgs::msg::Odometry;
  38. using Bool = std_msgs::msg::Bool;
  39. using UInt32 = std_msgs::msg::UInt32;
  40. using Int32 = std_msgs::msg::Int32;
  41. using UInt8 = std_msgs::msg::UInt8;
  42. using GuardianMsg = daystar_navigation_msgs::msg::Guardian;
  43. using SetBool = std_srvs::srv::SetBool;
  44. using RobotCommand = ysc_robot_msgs::srv::RobotCommand;
  45. using GuardianSrv = daystar_navigation_msgs::srv::Guardian;
  46. using JointsState = saturn_msgs::msg::JointsStatus;
  47. SaturnController(const rclcpp::NodeOptions &options);
  48. rclcpp::node_interfaces::NodeBaseInterface::SharedPtr
  49. get_node_base_interface() const;
  50. private:
  51. std::shared_ptr<rclcpp::Node> node_;
  52. std::shared_ptr<ConfigHandler> config_handler_;
  53. rclcpp::CallbackGroup::SharedPtr main_timer_cbg_;
  54. rclcpp::TimerBase::SharedPtr main_timer_;
  55. rclcpp::CallbackGroup::SharedPtr imu_timer_cbg_;
  56. rclcpp::TimerBase::SharedPtr imu_timer_;
  57. rclcpp::CallbackGroup::SharedPtr leg_odom_timer_cbg_;
  58. rclcpp::TimerBase::SharedPtr legged_odom_timer_;
  59. rclcpp::CallbackGroup::SharedPtr joint_state_timer_cbg_;
  60. rclcpp::TimerBase::SharedPtr joint_state_timer_;
  61. // subscription
  62. // 订阅导航速度指令
  63. rclcpp::CallbackGroup::SharedPtr cmd_vel_callback_cg_;
  64. rclcpp::Subscription<Twist>::SharedPtr cmd_vel_sub_;
  65. // 订阅从navigation发出的停障结果,用于遥控器停障
  66. rclcpp::CallbackGroup::SharedPtr guardian_callback_cg_;
  67. rclcpp::Subscription<GuardianMsg>::SharedPtr guardian_sub_;
  68. // 订阅是否处于sub状态
  69. rclcpp::CallbackGroup::SharedPtr task_mode_callback_cg_;
  70. rclcpp::Subscription<Bool>::SharedPtr task_mode_sub_;
  71. // publisher
  72. // 六足机器人腿部里程计
  73. rclcpp::Publisher<Odometry>::SharedPtr legged_odom_publisher_;
  74. // 六足机器人IMU数据
  75. rclcpp::Publisher<Imu>::SharedPtr imu_publisher_;
  76. // 机器人基本状态
  77. enum class ROBOT_STATE : uint32_t {
  78. LIE_DOWN = 0,
  79. STANDING_UP = 1,
  80. STAND_UP = 2,
  81. ENABLE_FORCECONTROL = 3,
  82. STEPPING = 4,
  83. SITTING_DOWN = 5,
  84. FALL_DOWN = 6,
  85. };
  86. rclcpp::Publisher<UInt32>::SharedPtr robot_state_publisher_;
  87. // dock_state(std_msgs::msg::UInt32): 机器人上桩状态
  88. enum class DOCK_STATE : uint32_t {
  89. IDLE = 0,
  90. GOING_TO_DOCK = 1,
  91. STND_ABOVE_DOCK = 2,
  92. ADJUST_POSE = 3,
  93. LIE_ON_DOCKER = 4,
  94. STANDING_AFTER_CHARGING = 5,
  95. LEAVING_DOCK = 6,
  96. LEAVE_DOCK = 7,
  97. };
  98. rclcpp::Publisher<UInt32>::SharedPtr docking_state_publisher_;
  99. enum class CONTROL_MODE : uint8_t {
  100. JOY_CONTROL = 0, // 0 -> 手持遥控
  101. NAVI_CONTROL = 1, // 1 -> 导航
  102. NULL_MODE = 2,
  103. };
  104. rclcpp::Publisher<UInt8>::SharedPtr control_mode_publisher_;
  105. // 设置六足机器人场景
  106. // 0 -> null
  107. // 1 -> 趴下
  108. // 2 -> 行走步态
  109. // 3 -> 楼梯步态
  110. // 4 -> 充电
  111. rclcpp::Publisher<UInt8>::SharedPtr gait_publisher_;
  112. // 电池电量信息,目前只有percentage字段有意义
  113. rclcpp::Publisher<BatteryState>::SharedPtr battery_state_publisher_;
  114. // 机器人模式,用于向巡检平台上报
  115. // 0 ->空闲(默认)
  116. // 1 ->手持遥控
  117. // 2 ->任务
  118. // 3 ->充电中
  119. rclcpp::Publisher<Int32>::SharedPtr robot_mode_publisher_;
  120. // 机器人在充电桩充电返回true,否则返回false
  121. rclcpp::Publisher<Bool>::SharedPtr charging_state_publisher_;
  122. // Joint statue publisher
  123. rclcpp::Publisher<JointsState>::SharedPtr joints_state_publisher_;
  124. // services
  125. rclcpp::CallbackGroup::SharedPtr robot_command_service_cgb_;
  126. rclcpp::Service<RobotCommand>::SharedPtr robot_command_service_;
  127. // 用于导航停障中的服务接口
  128. rclcpp::CallbackGroup::SharedPtr guardian_service_cgb_;
  129. rclcpp::Service<GuardianSrv>::SharedPtr guardian_service_;
  130. robot_control::common::MC_MOTION_IMU_DATA imu_data_;
  131. robot_control::common::JETSON_VISUAL_FOOTHOLD_STATE foothold_state_data_;
  132. robot_control::common::ROBOT_COMMON_STATUS common_status_data_;
  133. // Joint state data
  134. robot_control::common::ROBOT_JOINTS_STATUS joints_state_data_;
  135. bool is_robot_in_idle_state_ = true;
  136. long int robot_heartbeat_ = 0;
  137. // 确保线程安全
  138. std::atomic<float> guardian_velocity_decay_ratio_;
  139. bool is_getting_com_success_ = true;
  140. bool is_getting_imu_success_ = true;
  141. bool is_getting_vf_success_ = true;
  142. int reconnect_count_ = 0;
  143. bool common_status_result_ = false;
  144. void init();
  145. void cmdVelCallback(const Twist::ConstSharedPtr vel_msg);
  146. void robotCommandCallback(const RobotCommand::Request::SharedPtr request,
  147. RobotCommand::Response::SharedPtr response);
  148. bool goToDock();
  149. bool leaveDock();
  150. bool waitForDockFinishing(bool is_on_dock, size_t time_out_s);
  151. void guardianCallback(const GuardianMsg::ConstSharedPtr guardian_msg);
  152. void guardianServiceCallback(const GuardianSrv::Request::SharedPtr request,
  153. GuardianSrv::Response::SharedPtr response);
  154. void taskModeCallback(const Bool::SharedPtr task_mode);
  155. void mainTimerCallback();
  156. void imuTimerCallback();
  157. void leggedOodmTimerCallback();
  158. void publishRobotState();
  159. void publishDockingState();
  160. void publishControlMode();
  161. void publishGait();
  162. void publishBatteryState();
  163. void publishChargingState();
  164. void publishRobotMode();
  165. void publishLeggedOdom();
  166. void publishJointState();
  167. };
  168. } // namespace saturn_ros2