1. 增加称重抖动参数。

2. 称重稳定后重量继续增长,重新计算稳定重量。
main
baocm 8 months ago
parent 25c7483055
commit 6b0cf0c025

@ -40,6 +40,13 @@ bool MsgHandler::SetEmptyWeight(const int& empty_weight)
return true; return true;
} }
bool MsgHandler::SetJitterWeight(const int& jitter_weight)
{
this->jitter_weight = jitter_weight;
return true;
}
int MsgHandler::SendDeviceMsg(const std::vector<uint8_t>& data) int MsgHandler::SendDeviceMsg(const std::vector<uint8_t>& data)
{ {
std::cout << "write to " << this->device << std::endl; std::cout << "write to " << this->device << std::endl;

@ -11,6 +11,7 @@ public:
int fd; int fd;
std::string device; std::string device;
int empty_weight; int empty_weight;
int jitter_weight;
std::vector<uint8_t> m_WeightData; std::vector<uint8_t> m_WeightData;
MsgHandler(); MsgHandler();
@ -21,6 +22,7 @@ public:
bool HandleDeviceMsg(T& msg); bool HandleDeviceMsg(T& msg);
bool SetDevice(const std::string& device); bool SetDevice(const std::string& device);
bool SetEmptyWeight(const int& empty_weight); bool SetEmptyWeight(const int& empty_weight);
bool SetJitterWeight(const int& jitter_weight);
virtual bool OpenPort(const std::string& port, const std::string& baudrate); virtual bool OpenPort(const std::string& port, const std::string& baudrate);
virtual int SendDeviceMsg(const std::vector<uint8_t>& data); virtual int SendDeviceMsg(const std::vector<uint8_t>& data);

@ -153,15 +153,15 @@ void PublisherApp::run(std::shared_ptr<MsgHandler> handler)
{ {
// 配置检测器 - 使用更合理的参数 // 配置检测器 - 使用更合理的参数
WeightStabilityDetector::Config config; WeightStabilityDetector::Config config;
config.jitter_threshold = 30.0f; // 30kg抖动阈值 config.jitter_threshold = handler->jitter_weight; // 30kg抖动阈值
config.min_weight_threshold = handler->empty_weight; // 300kg开始检测 config.min_weight_threshold = handler->empty_weight; // 300kg开始检测
config.empty_car_threshold = handler->empty_weight; // 默认300kg为空车 config.empty_car_threshold = handler->empty_weight; // 默认300kg为空车
config.fast_drop_threshold = 1000.0f; // 快速下降1吨认为车辆离开 config.fast_drop_threshold = 1000.0f; // 快速下降1吨认为车辆离开
config.required_stable_count = 20; // 20次稳定即可 config.required_stable_count = 24; // 20次稳定即可
config.min_jitter_count = 2; // 至少2次非增长 config.min_jitter_count = 4; // 至少4次非增长
config.timeout_extra = 3; // 超时额外次数 config.timeout_extra = 4; // 超时额外次数
config.window_size = 8; // 窗口大小8 config.window_size = 8; // 窗口大小8
config.max_std_dev = 30.0f; // 最大标准差30kg config.max_std_dev = handler->jitter_weight; // 最大标准差30kg
config.enable_debug_log = false; config.enable_debug_log = false;
config.reset_window_on_vehicle_on = true; config.reset_window_on_vehicle_on = true;
config.leave_reset_delay_ms = 500; // 0.5秒后重置 config.leave_reset_delay_ms = 500; // 0.5秒后重置
@ -241,7 +241,7 @@ void PublisherApp::run(std::shared_ptr<MsgHandler> handler)
// 如果稳定,显示稳定重量 // 如果稳定,显示稳定重量
WeighingSystem::ScaleInfo info; WeighingSystem::ScaleInfo info;
info.State() = 1; info.State() = true;
if (weight < handler->empty_weight) if (weight < handler->empty_weight)
{ {
info.HasVehicle() = 0; info.HasVehicle() = 0;
@ -252,13 +252,13 @@ void PublisherApp::run(std::shared_ptr<MsgHandler> handler)
} }
if (detector.isStable()) if (detector.isStable())
{ {
info.WeightOK() = 1; info.WeightOK() = true;
info.Value() = weight/1000; info.Value() = weight/1000;
info.StableValue() = weight/1000; info.StableValue() = weight/1000;
} }
else else
{ {
info.WeightOK() = 0; info.WeightOK() = false;
info.Value() = weight/1000; info.Value() = weight/1000;
info.StableValue() = 0; info.StableValue() = 0;
} }

@ -274,6 +274,9 @@ void WeightStabilityDetector::checkStateTransition(float weight_kg) {
if (isVehicleLeaving(weight_kg) || checkFastDrop(weight_kg)) { if (isVehicleLeaving(weight_kg) || checkFastDrop(weight_kg)) {
transitionToState(VehicleState::VEHICLE_LEAVING); transitionToState(VehicleState::VEHICLE_LEAVING);
} }
else if (isVehicleShaking(weight_kg)) {
transitionToState(VehicleState::VEHICLE_ON);
}
break; break;
} }
@ -343,6 +346,18 @@ bool WeightStabilityDetector::isVehicleLeaving(float weight_kg) const {
return weight_kg < config_.empty_car_threshold; return weight_kg < config_.empty_car_threshold;
} }
bool WeightStabilityDetector::isVehicleShaking(float weight_kg) {
if (std::abs(weight_kg - previous_weight_) > config_.jitter_threshold)
{
is_leaving_state_ = false; // 清除离开状态标记
stable_count_ = 0; // 重置稳定计数
continuous_increase_count_ = 0; // 重置连续增长计数
vehicle_weight_window_.clear(); // 重置重量窗口
return true;
}
return false;
}
bool WeightStabilityDetector::checkFastDrop(float weight_kg) const { bool WeightStabilityDetector::checkFastDrop(float weight_kg) const {
// 检查快速下降:当前重量远低于历史最高重量 // 检查快速下降:当前重量远低于历史最高重量
if (max_weight_ > config_.min_weight_threshold) { if (max_weight_ > config_.min_weight_threshold) {

@ -148,6 +148,7 @@ private:
bool isJitterExceeded(float weight_diff) const; bool isJitterExceeded(float weight_diff) const;
bool isVehicleOn(float weight_kg) const; bool isVehicleOn(float weight_kg) const;
bool isVehicleLeaving(float weight_kg) const; bool isVehicleLeaving(float weight_kg) const;
bool isVehicleShaking(float weight_kg);
bool checkFastDrop(float weight_kg) const; bool checkFastDrop(float weight_kg) const;
bool checkStableCondition() const; bool checkStableCondition() const;

@ -79,6 +79,7 @@ int main(int argc, char** argv)
const char* baudrate = "9600"; const char* baudrate = "9600";
const char* device = "Keli"; const char* device = "Keli";
int empty_weight = 300; int empty_weight = 300;
int jitter_weight = 30;
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++)
{ {
@ -106,6 +107,10 @@ int main(int argc, char** argv)
{ {
empty_weight = atoi(argv[++i]); empty_weight = atoi(argv[++i]);
} }
else if (strcmp(argv[i], "--jitter") == 0 && i + 1 < argc)
{
jitter_weight = atoi(argv[++i]);
}
else if (strcmp(argv[i], "--version") == 0) else if (strcmp(argv[i], "--version") == 0)
{ {
std::cout << "Vesrion: " << PROGRAM_VERSION << "\n"; std::cout << "Vesrion: " << PROGRAM_VERSION << "\n";
@ -121,6 +126,7 @@ int main(int argc, char** argv)
<< " --port Set port name (e.g., ttyS1)\n" << " --port Set port name (e.g., ttyS1)\n"
<< " --device Set device name (e.g., Toledo)\n" << " --device Set device name (e.g., Toledo)\n"
<< " --empty Set empty weight (e.g., 300)\n" << " --empty Set empty weight (e.g., 300)\n"
<< " --jitter Set jitter weight (e.g., 30)\n"
<< " --version Show software Version\n" << " --version Show software Version\n"
<< " --help Show this help message\n"; << " --help Show this help message\n";
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -135,6 +141,8 @@ int main(int argc, char** argv)
<< " --baudrate Set baudrate (e.g., 9600)\n" << " --baudrate Set baudrate (e.g., 9600)\n"
<< " --port Set port name (e.g., ttyS1)\n" << " --port Set port name (e.g., ttyS1)\n"
<< " --device Set device name (e.g., Toledo)\n" << " --device Set device name (e.g., Toledo)\n"
<< " --empty Set empty weight (e.g., 300)\n"
<< " --jitter Set jitter weight (e.g., 30)\n"
<< " --version Show software Version\n" << " --version Show software Version\n"
<< " --help Show this help message\n"; << " --help Show this help message\n";
return EXIT_FAILURE; return EXIT_FAILURE;
@ -148,6 +156,7 @@ int main(int argc, char** argv)
dev->OpenPort(port, baudrate); dev->OpenPort(port, baudrate);
dev->SetDevice(device); dev->SetDevice(device);
dev->SetEmptyWeight(empty_weight); dev->SetEmptyWeight(empty_weight);
dev->SetJitterWeight(jitter_weight);
std::thread pub_thread(&PublisherApp::run, pub, dev); std::thread pub_thread(&PublisherApp::run, pub, dev);

Loading…
Cancel
Save