You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双路径输送箱防碰撞逻辑优化咨询(含s1/s2/s3传感器)

输送箱无碰撞通行逻辑设计与C++实现

问题概述

现场有两个输送箱起点pointA、pointB,需保证不同路径的输送箱在交汇区域无碰撞,部署了3个传感器s1、s2、s3用于检测对应位置前方的箱体。原有逻辑存在缺陷:当pointB方向(对应s3)有密集连续箱体时,s1处箱体在s2检测到第一个pointB箱体到达后启动,会与后续的pointB箱体发生碰撞。

无碰撞通行逻辑规则

核心是精准跟踪交汇区域占用状态,以及pointB方向的连续箱体通行队列,具体规则如下:

  • 定义两个核心状态变量:
    • is_junction_occupied:标记交汇区域是否有箱体(由s2的状态变化结合通行逻辑更新)
    • s3_boxes_pending:记录pointB方向待进入交汇区域的箱体数量
  • 通行优先级与触发条件:
    1. pointB方向箱体优先通行:
      • 当s3检测到箱体,且交汇区域未被占用时,允许该箱体进入交汇区域
      • 若pointB有连续箱体,需等待前一个箱体完全离开交汇区域(s2检测不到该箱体信号)后,再放行下一个pointB箱体
    2. pointA方向箱体放行条件:
      • 仅当交汇区域无箱体且pointB方向无待进入交汇区域的箱体时,才允许s1处的箱体启动进入交汇区域
    3. 状态更新逻辑:
      • s3检测到新箱体时,s3_boxes_pending加1;s2检测到箱体离开(信号从有到无)时,s3_boxes_pending减1,同时将is_junction_occupied设为false
      • s1处箱体启动后,is_junction_occupied设为true;s2检测到该箱体离开时,is_junction_occupied设为false

C++实现示例

以下是基于上述逻辑的封装实现,包含传感器状态读取、箱体控制与循环调度:

#include <atomic>
#include <chrono>
#include <thread>
#include <iostream>

// 传感器状态枚举
enum class SensorState {
    NO_BOX,
    BOX_DETECTED
};

class ConveyorSystem {
private:
    // 核心状态变量,原子类型保证多线程安全
    std::atomic<bool> is_junction_occupied = false;
    std::atomic<int> s3_pending_boxes = 0;

    // 模拟硬件传感器读取(实际场景替换为硬件驱动接口)
    SensorState read_sensor(int sensor_id) {
        // 此处可根据测试需求模拟传感器状态,例如:
        // if (sensor_id == 3) return SensorState::BOX_DETECTED;
        return SensorState::NO_BOX;
    }

    // 模拟箱体启停控制(实际场景替换为硬件控制指令)
    void toggle_box(int start_point, bool enable) {
        const char* point_name = (start_point == 1) ? "pointA" : "pointB";
        if (enable) {
            std::cout << "[CONTROL] 启动" << point_name << "箱体\n";
        } else {
            std::cout << "[CONTROL] 停止" << point_name << "箱体\n";
        }
    }

public:
    void start_control_loop() {
        // 记录传感器上一周期状态,用于检测状态变化
        SensorState prev_s1 = SensorState::NO_BOX;
        SensorState prev_s2 = SensorState::NO_BOX;
        SensorState prev_s3 = SensorState::NO_BOX;

        while (true) {
            // 读取当前传感器状态
            SensorState curr_s1 = read_sensor(1);
            SensorState curr_s2 = read_sensor(2);
            SensorState curr_s3 = read_sensor(3);

            // 更新pointB待处理箱体计数:检测到新箱体时递增
            if (prev_s3 == SensorState::NO_BOX && curr_s3 == SensorState::BOX_DETECTED) {
                s3_pending_boxes++;
            }

            // 更新交汇区域状态与待处理计数:箱体离开交汇区域时更新
            if (prev_s2 == SensorState::BOX_DETECTED && curr_s2 == SensorState::NO_BOX) {
                is_junction_occupied = false;
                if (s3_pending_boxes > 0) {
                    s3_pending_boxes--;
                }
            } else if (prev_s2 == SensorState::NO_BOX && curr_s2 == SensorState::BOX_DETECTED) {
                is_junction_occupied = true;
            }

            // 处理pointB方向箱体通行
            if (curr_s3 == SensorState::BOX_DETECTED) {
                if (!is_junction_occupied) {
                    toggle_box(2, true);
                } else {
                    toggle_box(2, false);
                }
            }

            // 处理pointA方向箱体通行
            bool a_can_pass = !is_junction_occupied && (s3_pending_boxes == 0);
            if (curr_s1 == SensorState::BOX_DETECTED) {
                if (a_can_pass) {
                    toggle_box(1, true);
                } else {
                    toggle_box(1, false);
                }
            }

            // 更新上一周期传感器状态
            prev_s1 = curr_s1;
            prev_s2 = curr_s2;
            prev_s3 = curr_s3;

            // 模拟硬件采样间隔(可根据实际需求调整)
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
    }
};

int main() {
    ConveyorSystem system;
    system.start_control_loop();
    return 0;
}

适配现场的补充建议

  1. 若传感器支持箱体计数功能,可直接用传感器返回的箱体数量更新s3_pending_boxes,无需通过状态变化计数,提升准确性
  2. 根据箱体移动速度、传感器间距,调整循环采样间隔与状态判断的时间阈值,避免因箱体快速移动导致的误判
  3. 若涉及多线程操作硬件接口,需添加互斥锁或使用更严格的线程同步机制,确保状态变量的一致性

内容的提问来源于stack exchange,提问作者Hemant Bhargava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:05:26