Auto commit at 2025-05-29 13:59:40

This commit is contained in:
cxh 2025-05-29 13:59:40 +08:00
parent 5149e042fa
commit 2414e08b18

View File

@ -10,6 +10,9 @@
CANDriver canctl; CANDriver canctl;
// 急停状态量
std::atomic<bool> estop_active = false;
struct ControlCache struct ControlCache
{ {
std::mutex mutex; // 防止多线程冲突 std::mutex mutex; // 防止多线程冲突
@ -72,6 +75,7 @@ mc::msg::McCtrl get_safe_control()
return msg; return msg;
} }
// CAN消息接收回调
void receiveHandler(const CANFrame &frame, void *userData) void receiveHandler(const CANFrame &frame, void *userData)
{ {
// 获取 ROS 2 Publisher // 获取 ROS 2 Publisher
@ -103,16 +107,64 @@ void receiveHandler(const CANFrame &frame, void *userData)
} }
std::cout << " Data: "; std::cout << " Data: ";
// 终端打印
for (int i = 0; i < frame.dlc; ++i) for (int i = 0; i < frame.dlc; ++i)
{ {
std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)frame.data[i] << " "; std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)frame.data[i] << " ";
} }
std::cout << std::dec << "\n"; std::cout << std::dec << "\n";
// 检查是否为急停报文
if (frame.id == 0x18FA0121 && frame.dlc >= 3)
{
uint8_t estop_status = (frame.data[2] & 0x0c) >> 2; // 急停状态位
// 急停被按下
if (estop_status != 0x03)
{
if (!estop_active.load())
{
std::cout << "!!! E-STOP TRIGGERED, entering safe mode" << std::endl;
}
estop_active.store(true);
// 立即更新控制缓存,强制进入安全状态
mc::msg::McCtrl safe_msg;
safe_msg.mcu_enabled = false;
safe_msg.brake = 1;
safe_msg.gear = 0;
safe_msg.rpm = 0;
safe_msg.brake_time_ms = 500;
safe_msg.angle = 0;
safe_msg.angle_speed = 120;
safe_msg.main_brush_lift = false;
safe_msg.edge_brush_lift = false;
safe_msg.vacuum = false;
safe_msg.spray = false;
safe_msg.mud_flap = false;
safe_msg.dust_shake = false;
safe_msg.main_brush_spin = false;
safe_msg.edge_brush_spin = false;
control_cache.update(safe_msg); // 用这个覆盖已有控制指令
}
else
{
if (estop_active.load())
{
std::cout << "E-STOP released, resuming control" << std::endl;
}
estop_active.store(false);
}
}
} }
void mcCtrlCallback(const mc::msg::McCtrl::SharedPtr msg) void mcCtrlCallback(const mc::msg::McCtrl::SharedPtr msg)
{ {
if (estop_active)
return;
control_cache.update(*msg); control_cache.update(*msg);
} }