Auto commit at 2025-06-18 16:59:19

This commit is contained in:
cxh 2025-06-18 16:59:19 +08:00
parent 624c7d1ea2
commit bffaa1f396
2 changed files with 113 additions and 73 deletions

View File

@ -3,4 +3,5 @@
#include "mc/can_driver.h" #include "mc/can_driver.h"
#include "mc/dumper.h" #include "mc/dumper.h"
// 注册所有定时器任务
void setupTimers(rclcpp::Node::SharedPtr node, DumperController &dumper, CANDriver &canctl); void setupTimers(rclcpp::Node::SharedPtr node, DumperController &dumper, CANDriver &canctl);

View File

@ -7,20 +7,19 @@ extern std::atomic<bool> vcu_awake;
extern std::atomic<bool> vcu_msg_received; extern std::atomic<bool> vcu_msg_received;
extern rclcpp::Time last_vcu_msg_time; extern rclcpp::Time last_vcu_msg_time;
void setupTimers(rclcpp::Node::SharedPtr node, DumperController &dumper, CANDriver &canctl) // 定时器回调VCU 唤醒
void wakeupTimerTask(const rclcpp::Node::SharedPtr &node, CANDriver &canctl)
{ {
static auto timer_wakeup = node->create_wall_timer(
std::chrono::seconds(1), [node, &canctl]()
{
if (!vcu_awake.load()) if (!vcu_awake.load())
{ {
RCLCPP_INFO(node->get_logger(), "[TIMER][VCU] Not awake, sending wake-up frame..."); RCLCPP_INFO(node->get_logger(), "[TIMER][VCU] Not awake, sending wake-up frame...");
VCUWakeUp(canctl); VCUWakeUp(canctl);
} }); }
}
static auto timer_watchdog = node->create_wall_timer( // 定时器回调VCU watchdog + Dumper Dial处理
std::chrono::milliseconds(200), [node, &dumper]() void vcuWatchdogTask(const rclcpp::Node::SharedPtr &node, DumperController &dumper)
{ {
auto now = node->now(); auto now = node->now();
if (vcu_msg_received.load() && (now - last_vcu_msg_time > rclcpp::Duration::from_seconds(0.5))) if (vcu_msg_received.load() && (now - last_vcu_msg_time > rclcpp::Duration::from_seconds(0.5)))
{ {
@ -35,40 +34,45 @@ void setupTimers(rclcpp::Node::SharedPtr node, DumperController &dumper, CANDriv
dumper.tryStartup(); dumper.tryStartup();
auto msg = get_safe_control(); auto msg = get_safe_control();
dumper.updateDial(static_cast<int>(msg.dump), dumper.getSimpleState()); dumper.updateDial(static_cast<int>(msg.dump), dumper.getSimpleState());
} }); }
}
static auto timer_dbs = node->create_wall_timer( // 定时器回调DBS 控制
std::chrono::milliseconds(10), [&canctl]() void dbsTimerTask(CANDriver &canctl)
{ {
auto msg = get_safe_control(); auto msg = get_safe_control();
dbs_cmd.setEnabled(msg.ehb_anable); dbs_cmd.setEnabled(msg.ehb_anable);
dbs_cmd.setPressure(msg.ehb_brake_pressure); dbs_cmd.setPressure(msg.ehb_brake_pressure);
canctl.sendFrame(dbs_cmd.toFrame()); }); canctl.sendFrame(dbs_cmd.toFrame());
}
static auto timer_mcu = node->create_wall_timer( // 定时器回调MCU 控制
std::chrono::milliseconds(20), [&canctl]() void mcuTimerTask(CANDriver &canctl)
{ {
auto msg = get_safe_control(); auto msg = get_safe_control();
mcu_cmd.setEnabled(true); mcu_cmd.setEnabled(true);
mcu_cmd.setGear(msg.gear); mcu_cmd.setGear(msg.gear);
mcu_cmd.setRPM(msg.rpm); mcu_cmd.setRPM(msg.rpm);
mcu_cmd.setBrake(msg.brake); mcu_cmd.setBrake(msg.brake);
canctl.sendFrame(mcu_cmd.toFrame()); }); canctl.sendFrame(mcu_cmd.toFrame());
}
static auto timer_eps = node->create_wall_timer( // 定时器回调EPS 控制
std::chrono::milliseconds(50), [&canctl]() void epsTimerTask(CANDriver &canctl)
{ {
auto msg = get_safe_control(); auto msg = get_safe_control();
eps_cmd.setCenterCmd(0); eps_cmd.setCenterCmd(0);
eps_cmd.setAngle(msg.angle); eps_cmd.setAngle(msg.angle);
eps_cmd.setAngularSpeed(msg.angle_speed); eps_cmd.setAngularSpeed(msg.angle_speed);
eps_cmd.pack(); eps_cmd.pack();
canctl.sendFrame(eps_cmd.toFrame()); }); canctl.sendFrame(eps_cmd.toFrame());
}
static auto timer_vcu = node->create_wall_timer( // 定时器回调VCU 灯控、扫地、除尘等功能
std::chrono::milliseconds(100), [&canctl, &dumper]() void vcuTimerTask(CANDriver &canctl, DumperController &dumper)
{ {
auto msg = get_safe_control(); auto msg = get_safe_control();
vcu1_cmd.setLeftLight(msg.left_light); vcu1_cmd.setLeftLight(msg.left_light);
vcu1_cmd.setDustShake(msg.dust_shake); vcu1_cmd.setDustShake(msg.dust_shake);
vcu1_cmd.setHeadLight(msg.headlight); vcu1_cmd.setHeadLight(msg.headlight);
@ -81,9 +85,44 @@ void setupTimers(rclcpp::Node::SharedPtr node, DumperController &dumper, CANDriv
vcu2_cmd.setSpray(msg.spray); vcu2_cmd.setSpray(msg.spray);
vcu2_cmd.setSweeepCtrl(msg.sweep_ctrl); vcu2_cmd.setSweeepCtrl(msg.sweep_ctrl);
// 只有在扫地中并且斗处于收斗状态时才发VCU指令
if (msg.sweep_ctrl && dumper.getSimpleState() == 0) if (msg.sweep_ctrl && dumper.getSimpleState() == 0)
{ {
canctl.sendFrame(vcu1_cmd.toFrame()); canctl.sendFrame(vcu1_cmd.toFrame());
canctl.sendFrame(vcu2_cmd.toFrame()); canctl.sendFrame(vcu2_cmd.toFrame());
} }); }
}
// 注册所有定时器任务
void setupTimers(rclcpp::Node::SharedPtr node, DumperController &dumper, CANDriver &canctl)
{
static auto timer_wakeup = node->create_wall_timer(
std::chrono::seconds(1),
[node, &canctl]()
{ wakeupTimerTask(node, canctl); });
static auto timer_watchdog = node->create_wall_timer(
std::chrono::milliseconds(200),
[node, &dumper]()
{ vcuWatchdogTask(node, dumper); });
static auto timer_dbs = node->create_wall_timer(
std::chrono::milliseconds(10),
[&canctl]()
{ dbsTimerTask(canctl); });
static auto timer_mcu = node->create_wall_timer(
std::chrono::milliseconds(20),
[&canctl]()
{ mcuTimerTask(canctl); });
static auto timer_eps = node->create_wall_timer(
std::chrono::milliseconds(50),
[&canctl]()
{ epsTimerTask(canctl); });
static auto timer_vcu = node->create_wall_timer(
std::chrono::milliseconds(100),
[&canctl, &dumper]()
{ vcuTimerTask(canctl, dumper); });
} }