benz-obstacle-detection/BenzObstacleDetect/Detection.cs

126 lines
6.3 KiB
C#
Raw Permalink Normal View History

2025-03-17 11:58:24 +08:00
using System;
2025-03-17 14:28:42 +08:00
using System.Linq;
2025-03-17 11:58:24 +08:00
using System.Net;
2025-03-17 14:28:42 +08:00
using Autolabor.Benz.ObstacleDetection.DataType;
2025-03-17 11:58:24 +08:00
using Autolabor.Robobase;
using Autolabor.Robobase.Component.Algorithm.LidarDetection;
using Autolabor.Robobase.Component.Algorithm.LidarDetection.DataType;
using Autolabor.Robobase.Component.Business.Benz;
using Autolabor.Robobase.Component.Driver;
using Autolabor.Robobase.Component.Driver.SerialRelay;
namespace Autolabor.Benz.ObstacleDetection
{
[Serializable]
public class Detection : GroupComponent
{
// 驱动层组件
private Ld19DriverNew _lidarDriver;
private SerialRelayDriver _serialRelay;
// 算法层组件
2025-03-20 13:28:29 +08:00
private LidarRoiFilter _lidarFrontRoiFilter;
private LidarRoiFilter _lidarRearRoiFilter;
private ObstacleDetector _frontObstacleDetector;
private ObstacleDetector _rearObstacleDetector;
2025-03-17 11:58:24 +08:00
private BenzObstacleControl _benzObstacleController;
// 模拟器配置
private int _FrontLidarRpcPort = 50120;
private int _FrontLidarListenPort = 40120;
private IPAddress _serverIp = IPAddress.Loopback;
// 配置过滤区域
2025-03-20 13:28:29 +08:00
private LidarRoi[] _lidarFrontRoi;
private LidarRoi[] _lidarRearRoi;
2025-03-17 11:58:24 +08:00
2025-03-17 14:28:42 +08:00
public Detection(RectRoiSettings roiSettings)
2025-03-17 11:58:24 +08:00
{
2025-03-17 14:28:42 +08:00
// 1. 获取感兴趣区域
var rois = roiSettings.RectRois.Select(roi => LidarRoiFactory.Make(roi.LeftUpX, roi.LeftUpY, roi.RightDownX, roi.RightDownY)).ToList();
2025-03-20 13:28:29 +08:00
_lidarFrontRoi = rois.Take(1).ToArray();
_lidarRearRoi = rois.Skip(1).ToArray();
2025-03-17 14:28:42 +08:00
2025-03-17 11:58:24 +08:00
// 2. 创建各个功能组件
// 驱动组件
_lidarDriver = new Ld19DriverNew();
_serialRelay = new SerialRelayDriver();
// 算法组件
2025-03-20 13:28:29 +08:00
_frontObstacleDetector = new ObstacleDetector();
_rearObstacleDetector = new ObstacleDetector();
2025-03-17 11:58:24 +08:00
_benzObstacleController = new BenzObstacleControl();
2025-03-20 13:28:29 +08:00
_lidarRearRoiFilter = new LidarRoiFilter();
_lidarFrontRoiFilter = new LidarRoiFilter();
2025-03-17 11:58:24 +08:00
// 连接到绘图
// var lidarRender = DataRenderFactory.Make<Pose2D[]>("Benz","lidar",false,true);
// var obstacleRender = DataRenderFactory.Make<Pose2D[]>("Benz","obstacle",false,true);
// Add(lidarRender);
// Add(obstacleRender);
// _lidarDriver.OutputLocalLidarPose2D.Connect(lidarRender.Input);
2025-03-20 13:28:29 +08:00
// _frontObstacleDetector.OutputObstaclePoses.Connect(obstacleRender.Input);
2025-03-17 11:58:24 +08:00
// 3. 添加组件到容器
Add(_lidarDriver);
Add(_serialRelay);
2025-03-20 13:28:29 +08:00
Add(_lidarRearRoiFilter);
Add(_lidarFrontRoiFilter);
Add(_frontObstacleDetector);
Add(_rearObstacleDetector);
2025-03-17 11:58:24 +08:00
Add(_benzObstacleController);
2025-03-17 11:58:24 +08:00
// 4. 配置组件
// 激光雷达配置
2025-03-17 13:56:42 +08:00
_lidarDriver.SetProperty("lidar.port", "/dev/autolabor_ld19");
2025-03-17 11:58:24 +08:00
_lidarDriver.SetProperty("lidar.x", 0.0);
_lidarDriver.SetProperty("lidar.y", 0.0);
_lidarDriver.SetProperty("lidar.originName", "frontLidarOrigin");
_lidarDriver.SetProperty("lidar.rotation", Math.PI / 2.0);
_lidarDriver.SetProperty("lidar.startRad", -Math.PI); // 要提取的数据范围
_lidarDriver.SetProperty("lidar.rangeRad", 2.0 * Math.PI);
_lidarDriver.SetProperty("lidar.display.interval", 1000);
_lidarDriver.SetProperty("lidar.intensityLevel", 200.0);
_lidarDriver.SetProperty("sim.lidar.server.ip", _serverIp);
_lidarDriver.SetProperty("sim.lidar.rpc.port", _FrontLidarRpcPort);
_lidarDriver.SetProperty("sim.lidar.listen.port", _FrontLidarListenPort);
// 串口继电器配置
2025-03-17 13:56:42 +08:00
_serialRelay.SetProperty("serial.relay.port", "/dev/autolabor_relay");
2025-03-17 11:58:24 +08:00
// 配置过滤器
2025-03-20 13:28:29 +08:00
_lidarFrontRoiFilter.SetProperty("roiArray", _lidarFrontRoi);
_lidarRearRoiFilter.SetProperty("roiArray", _lidarRearRoi);
2025-03-17 11:58:24 +08:00
// 障碍物检测器配置
2025-03-20 13:28:29 +08:00
_frontObstacleDetector.SetProperty("MinClusterDistance", 0.05);
_frontObstacleDetector.SetProperty("MinClusterSize", 3);
_frontObstacleDetector.SetProperty("MaxPrjDistance", 0.05);
_frontObstacleDetector.SetProperty("GuessDistance", 1.0);
_rearObstacleDetector.SetProperty("MinClusterDistance", 0.05);
_rearObstacleDetector.SetProperty("MinClusterSize", 3);
_rearObstacleDetector.SetProperty("MaxPrjDistance", 0.05);
_rearObstacleDetector.SetProperty("GuessDistance", 1.0);
2025-03-17 11:58:24 +08:00
// 配置发现和丢失次数
2025-03-17 14:28:42 +08:00
_benzObstacleController.SetProperty("FoundObstacleThreshold", 2);
_benzObstacleController.SetProperty("LostObstacleThreshold", 3);
2025-03-17 11:58:24 +08:00
// 5. 连接组件
// 雷达数据流向避障检测
2025-03-20 13:28:29 +08:00
_lidarDriver.OutputLocalLidarPose2D.Connect(_lidarFrontRoiFilter.InputLidarPoints);
_lidarFrontRoiFilter.OutputFilteredPoints.Connect(_frontObstacleDetector.InputLidarPoints);
_lidarDriver.OutputLocalLidarPose2D.Connect(_lidarRearRoiFilter.InputLidarPoints);
_lidarRearRoiFilter.OutputFilteredPoints.Connect(_rearObstacleDetector.InputLidarPoints);
2025-03-17 11:58:24 +08:00
// 雷达诊断信号连接到奔驰障碍物控制器
_lidarDriver.OutputLidarDiagnostic.Connect(_benzObstacleController.InputLidarDiagnostics);
2025-03-17 11:58:24 +08:00
// 避障检测结果流向奔驰避障控制器
2025-03-20 13:28:29 +08:00
_frontObstacleDetector.OutputObstacles.Connect(_benzObstacleController.InputFrontObstacles);
_rearObstacleDetector.OutputObstacles.Connect(_benzObstacleController.InputRearObstacles);
2025-03-17 11:58:24 +08:00
// 奔驰避障控制器输出到继电器
_benzObstacleController.OutputRelayControl.Connect(_serialRelay.InputRelayControl);
_benzObstacleController.OutputRelayQuery.Connect(_serialRelay.InputRelayQuery);
_serialRelay.OutputRelayFeedback.Connect(_benzObstacleController.InputRelayStatus);
_serialRelay.OutputSerialConnect.Connect(_benzObstacleController.InputSerialConnect);
2025-03-17 11:58:24 +08:00
}
}
}