Auto commit at 2025-05-29 13:59:40
This commit is contained in:
parent
5149e042fa
commit
2414e08b18
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user