主要内容

基于传感器融合的前向碰撞预警

这个例子展示了如何通过融合来自视觉和雷达传感器的数据来跟踪车辆前方的物体来执行前向碰撞预警。

概述

前向碰撞预警(FCW)是驾驶员辅助和自动驾驶系统中的一个重要功能,其目标是在前方车辆即将发生碰撞前向驾驶员提供正确、及时和可靠的警告。为了实现这一目标,车辆配备了前方视觉和雷达传感器。为了提高准确预警的概率,减少错误预警的概率,需要进行传感器融合。

在本示例中,试验车(ego车辆)配备了各种传感器,并记录了其输出。本示例中使用的传感器为:

  1. 视觉传感器,提供观察对象列表及其分类和车道边界信息。对象列表每秒报告10次。车道边界每秒报告20次。

  2. 中程和远程模式的雷达传感器,提供未分类的观测物体清单。对象列表每秒报告20次。

  3. IMU,它每秒报告ego车辆20次的速度和转向率。

  4. 摄像机,记录了车辆前方场景的视频剪辑。注意:跟踪器不使用此视频,仅用于在视频上显示跟踪结果以供验证。

提供正向碰撞警告的过程包括以下步骤:

  1. 从传感器获取数据。

  2. 融合传感器数据以获得轨迹列表,即车辆前方物体的估计位置和速度。

  3. 根据轨道和FCW标准发出警告。FCW标准基于欧洲NCAP AEB测试程序,并考虑到车辆前方物体的相对距离和相对速度。

有关跟踪多个对象的更多信息,请参见多个对象跟踪

使用此示例中的可视化完成monoCamera鸟瞰图.为简洁起见,创建和更新显示的函数被移到本示例之外的辅助函数。有关如何使用这些显示器的更多信息,请参见使用车辆坐标中的检测注释视频可视化传感器覆盖、检测和轨迹

这个例子是一个脚本,这里显示的是主体,接下来的章节中显示的是局部函数形式的助手例程。有关本地函数的详细信息,请参阅向脚本添加函数

%设置显示[videoReader, videoDisplayHandle, bepplotter, sensor] = helperCreateFCWDemoDisplay('01_city_c2s_fcw_10s.mp4'“SensorConfigurationData.mat”);%读取记录的检测文件[视觉对象、雷达对象、惯性测量单位、laneReports、,...timestep,numsteps] = readsensorRecordingsfile('01_city_c2s_fcw_10s_sensor.mat');计算初始自助泳道。如果记录的车道信息是无效,将车道边界定义为半车道的直线%汽车两侧的距离laneWidth=3.6;%米egoLane =结构(“左”,[0平面宽度/2],“对”, [0 0 -laneWidth/2]);%准备一些时间变量时间= 0;%记录开始后的时间currentStep = 0;%当前时间步snapTime=9.3;%捕获显示器快照的时间初始化跟踪器[tracker, positionSelector, velocitySelector] = setupTracker();虽然当前步骤%更新场景计数器currentStep = currentStep + 1;time = time + timeStep;%处理传感器检测作为objectDetection输入到跟踪器[detections,laneBoundaries,egoLane]=处理检测(...VisionObjects(CurrentStep),RadarObjects(CurrentStep),...inertialMeasurementUnit (currentStep), laneReports (currentStep),...egoLane、时间);%使用objectDetections列表,返回更新到时间的轨道确认技术= UpdateTracks(跟踪器,检测,时间);找到最重要的对象并计算前向碰撞%警告mostImportantObject = findMostImportantObject(confirmedTracks, egoLane, positionSelector, velocitySelector);%更新视频和鸟瞰图显示帧= readFrame (videoReader);%读取视频帧Helperupdatefcwdemodisplay(框架,videodisplayhandle,bepplotters,...车道边界,传感器,确认轨道,最重要的对象,位置选择器,...速度选择器、Vision对象(当前步骤)、雷达对象(当前步骤);%捕获快照如果时间> = snaptime&time 结束结束

创建多对象跟踪器

multiObjectTracker根据视觉传感器和雷达传感器报告的目标列表跟踪ego车辆周围的目标。通过融合来自两个传感器的信息,降低了错误碰撞警告的概率。

setupTracker函数返回multiObjectTracker.在创建multiObjectTracker,考虑以下情况:

  1. FilterInitializationFcn:可能的运动和测量模型。在这种情况下,预期对象具有恒定加速度运动。尽管您可以为此模型配置线性卡尔曼滤波器,初始化加速滤波器配置扩展卡尔曼滤波器。参见“定义卡尔曼滤波器”部分。

  2. 分配察觉:检测距离轨迹的距离。此参数的默认值为30。如果有未分配给轨迹的检测,但应该是,请增加此值。如果有分配给过远轨迹的检测,请减小此值。此示例使用35。

  3. DeletionThreshold:当确认轨道时,不应在第一次更新时将其删除,因为没有为其分配任何检测。相反,应使其滑行(预测),直到确定轨道没有获得任何传感器信息来更新它。逻辑是如果轨道丢失P从…里面它应该被删除。此参数的默认值为5-OUT-5。在这种情况下,跟踪器称为秒的20次,并且有两个传感器,因此不需要修改默认值。

  4. ConfirmationThreshold:用于确认轨迹的参数。每个未分配的检测都会初始化新轨迹。其中一些检测可能是错误的,因此所有轨迹都会初始化为“初步”.要确认轨迹,必须至少检测到该轨迹N跟踪更新。的选择N取决于物体的可见度。本例使用默认的3次更新中的2次检测。

输出setupTracker是:

  • 追踪器- 这multiObjectTracker为本例配置的。

  • positionSelector-指定状态向量中哪些元素的位置的矩阵:位置= PositionSelector *状态

  • 速度选择-指定状态向量中哪些元素是速度的矩阵:velocity = velocity selector * State

作用[跟踪器,位置选择,VelocitySelector] = Setuptracker()跟踪器= MultiObjectRacker(...“FilterInitializationFcn”,@initConstantAccelerionFilter,...“AssignmentThreshold”, 35岁,“ConfirmationThreshold”, [2 3],...“删除阈值”5);状态向量为:%在恒定速度下:状态=[x;vx;y;vy]State = [x;vx;ax;y;vy;ay]%定义状态的哪一部分是位置。例如:% In constant velocity: [x;y] = [1 0 0 0;0 0 1 0恒加速度:[x;y] = [1 0 0 0 0 0;0 0 0 1 0 0positionSelector = [1 0 0 0 0;0 0 0 1 0 0];定义状态的哪一部分是速度。例如:恒定速度%:[x; y] = [0 1 0 0;0 0 0 1] *状态恒加速度:[x;y] = [0 1 0 0 0 0;0 0 0 1 0] * StateVelocitySelector = [0 1 0 0 0 0;0 0 0 0 1 0];结束

定义一个卡尔曼滤波器

multiObjectTracker上一节中定义的使用本节中定义的滤波器初始化功能创建卡尔曼滤波器(线性、扩展或无迹)。然后使用该滤波器跟踪车辆周围的每个对象。

作用过滤器= initConstantAccelerationFilter(检测)%此函数显示如何配置恒定加速度过滤器%输入是ObjectDetection,输出是跟踪滤波器。%为清楚起见,此函数显示了如何配置trackingKF,%trackingekf,或trackingukf用于恒定加速度。%创建过滤器的步骤:%1.定义运动模型和状态%2.定义过程噪声% 3。定义测量模型%4.根据测量值初始化状态向量%5.根据测量噪声初始化状态协方差%6.创建正确的过滤器%步骤1:定义运动模型和状态%本例使用恒定加速度模型,因此:stf = @constacc;%状态转移函数,用于EKF和UKFSTFJ = @constaccjac;%状态转移函数雅可比矩阵,仅适用于EKF%运动模型表示状态为[x;vx;ax;y;vy;ay]你也可以使用constvel和constveljac来设置一个常量%速度模型、constturn和constturnjac,用于设置恒定转弯%速率模型,或写自己的模型。步骤2:定义过程噪声dt = 0.05;%已知时间步长大小σ= 1;%未知加速度变化率的幅度沿一维的过程噪声Q1D = [DT ^ 4/4,DT ^ 3/2,DT ^ 2/2;DT ^ 3/2,dt ^ 2,dt;dt ^ 2/2,dt,1] * sigma ^ 2;Q = Blkdiag(Q1D,Q1D);%二维过程噪声步骤3:定义度量模型MF = @fcwmeas;%测量功能,用于EKF和UKFmjf = @fcwmeasjac;%测量雅可比函数,仅用于EKF%步骤4:基于测量初始化一个状态向量传感器测量[x;vx;y;vy]和恒定加速度模型%状态是[x;vx;ax;y;vy;ay],因此状态向量初始化为零。状态= [detection.Measurement (1);detection.Measurement (2);0;detection.Measurement (3);detection.Measurement (4);0);%步骤5:基于测量初始化状态协方差%的噪音。状态中没有直接测量的部分是%指定一个较大的测量噪声值来说明这一点。L = 100;%相对于测量噪声而言,数值很大stateCov = blkdiag(detection.MeasurementNoise(1:2,1:2), L, detection.MeasurementNoise(3:4,3:4), L);步骤6:创建正确的过滤器。%使用'kf'trackingkf,'ekf'for trackingekf,或towninggukf的'ukf'FilterType =“算法”%创建过滤器:转换FilterType案件“算法”过滤器=跟踪EKF(STF、MF、状态、,...“状态协方差”stateCov,...“MeasurementNoise”,检测..easurementnoise(1:4,1:4),...“StateTransitionJacobianFcn”,STFJ,...“MeasurementJacobianFcn”MJF,...“ProcessNoise”,问...);案件“UKF”filter = trackingUKF(STF, MF, state,...“状态协方差”stateCov,...“MeasurementNoise”,检测..easurementnoise(1:4,1:4),...“阿尔法”1 e 1,...“ProcessNoise”,问...);案件KF的%丹尾匹配模型是线性的,可以使用KF%定义测量模型:测量= H *状态% 在这种情况下:%测量=[x;vx;y;vy]=H*[x;vx;ax;y;vy;ay]%SO,H = [1 0 0 0 0 0;0 1 0 0 0 0;0 0 0 1 0 0;0 0 0 0 1 0]方法自动计算ProcessNoise%丹卡卡塞运动模型H=[1 0 0 0;0 1 0 0 0;0 0 0 1 0;0 0 0 0 0 1 0];过滤器=跟踪KF(“MotionModel”“2D恒定加速度”...“测量模型”H,“国家”、州、...“MeasurementNoise”,检测..easurementnoise(1:4,1:4),...“状态协方差”, stateCov);结束结束

处理和格式化检测

记录的信息必须经过处理和格式化,才能供跟踪器使用。这包括以下步骤:

  1. 过滤掉不必要的雷达杂波检测。雷达报告了许多与固定物体相对应的物体,包括:护栏、道路中间、交通标志等。如果在跟踪中使用这些检测,它们会在道路边缘产生固定物体的虚假轨迹,因此必须在调用跟踪器之前将其清除。雷达目标被认为是无杂波的,如果它们是静止在汽车前面或在其附近移动。

  2. 将检测格式化为跟踪器的输入,即objectDetection元素。看到processVideo处理雷达金宝app在此示例结束时支持功能。

作用[detections,laneBoundaries, egoLane] = processDetections...(visionFrame, radarFrame, IMUFrame, laneFrame, egoLane, time)%投入:% visionFrame -视觉传感器在此时间范围内报告的对象%雷达帧-雷达传感器在此时间帧报告的目标%imuframe  - 此时间帧的惯性测量单元数据% lane frame -此时间段的lane报告%egoLane-估计的egoLane%时间-对应于时间范围的时间清除雷达目标的杂波[laneBoundaries, egoLane] = processLanes(laneFrame, egoLane);realRadarObjects = findNonClutterRadarObjects (radarFrame.object,...雷达帧.numObjects、IMUFrame.velocity、laneBoundaries);%如果未报告任何对象,则返回空列表%统计对象总数检测= {};如果(visionFrame。numObjects + numel(realRadarObjects)) == 0回来结束%处理剩余的雷达目标detections = processRadar(detections, realRadarObjects, time);%处理视频对象detections = processVideo(detections, visionFrame, time);结束

更新跟踪器

要更新追踪器,请呼叫UpdateTracks.方法,输入如下:

  1. 追踪器- 这multiObjectTracker这是之前配置的。请参见“创建多对象跟踪器”部分。

  2. 检测-一份objectDetection由创建的对象进程检测

  3. 时间-当前场景时间。

跟踪器的输出是结构体数组的痕迹。

找到最重要的物体并发出向前碰撞警告

最重要的目标(MIO)被定义为在自我车道中距离赛车最近的轨道,即正负最小的轨道x价值。为了降低误报的概率,只考虑已确认的轨迹。

一旦找到了MIO,就可以计算出汽车和MIO之间的相对速度。相对距离和相对速度决定了前向碰撞预警。FCW有3例:

  1. 安全(绿色):在自我车道上没有车(没有MIO), MIO正在远离这辆车,或者与MIO的距离保持不变。

  2. 警告(黄色):MIO正在靠近汽车,但距离仍高于FCW距离。FCW距离使用欧洲NCAP AEB测试协议计算。请注意,此距离随MIO和轿厢之间的相对速度而变化,当关闭速度较高时,此距离更大。

  3. 警告(红色):MIO正在靠近汽车,其距离小于FCW距离,美元d_{结合}$

欧洲NCAP AEB测试协议定义了以下距离计算:

美元d_{结合}= 1.2 * v_ {rel} + \压裂{v_ {rel} ^ 2}{2现代{马克斯}}$

地点:

美元d_{结合}$是向前碰撞警告距离。

$ v_ {rel} $是两辆车之间的相对速度。

美元现代{马克斯}$为最大减速,定义为重力加速度的40%。

作用mostImportantObject=FindMOSTMONTANTOBJECT(确认跟踪、电子车道、位置选择器、速度选择器)%初始化输出和参数绪= [];%默认情况下,没有MIOtrackID = [];%默认情况下,没有与MIO关联的trackID结合= 3;%默认情况下,如果没有MIO,那么FCW是“安全的”威胁色=“绿色”%默认情况下,威胁颜色为绿色maxx = 1000;向前走得足够远,以至于没有轨道会超过这个距离。gaccel = 9.8;%恒定重力加速度,单位为m/s^2max减速= 0.4 * gAccel;%欧元ncap aeb定义延迟时间=1.2;%开始制动前驾驶员的延迟时间(秒)position = getTrackPositions(confirmedTracks, positionSelector);velocity = gettrackvelocity (confirmedTracks, velocitySelector);i = 1:numel(confirmedTracks) x = positions(i,1);y =位置(我,2);relSpeed =速度(我,1);沿着车道,两车之间的相对速度。如果x < maxX && x >%否则就没有意义了yleftLane = polyval (egoLane。离开时,x);yrightLane = polyval (egoLane。右,x);如果(Yrightlane <= Y)&&(Y <= YLEFTLANE)maxx = x;trackid = i;mio = confirmedtracks(i).trackid;如果relSpeed < 0%相对速度表示物体越来越近%计算预期制动距离根据%欧洲NCAP AEB测试协议d = abs(relSpeed) * delayTime + relSpeed^2 / 2 / max减速;如果x < = d%'警告'FCW=1;threatColor=“红色”其他的%'警告'FCW=2;threatColor=“黄色”结束结束结束结束结束mostimportObject = struct(“ObjectID”,mio,“TrackIndex”trackID,“警告”,fcw,“威胁色”, threatColor);结束

总结

这个例子展示了如何为装有视觉、雷达和IMU传感器的车辆创建一个前向碰撞预警系统。它使用objectDetection对象将传感器报告传递给multiObjectTracker物体融合了它们并在自我车前追踪物体。

尝试使用跟踪器的不同参数来查看它们如何影响跟踪质量。尝试修改要使用的跟踪过滤器跟踪KF跟踪,或定义一种不同的运动模式,例如恒定速度或恒定转弯。最后,你可以尝试定义你自己的运动模型。

金宝app支持功能

readSensorRecordingsFile从文件中读取记录的传感器数据

作用[视觉对象、雷达对象、惯性测量单位、laneReports、,...timestep,numsteps] = readsensorRecordingsfile(SensorRecordingFilename)读取传感器记录%| readdetectionsfile |功能读取录制的传感器数据文件。记录的数据是一个单独的结构,它被分为百分比以下子结构:% # |inertialMeasurementUnit|,一个带有字段的结构数组:timeStamp,%速度和yawRate。数组中的每个元素都对应于a%不同的步伐。%#| laneReports |,一个包含字段的结构数组:左和右。每个元素%数组的长度对应于不同的时间步。% left和right都是带字段的结构:isValid, confidence,%边界类型、偏移、头角和曲率。% # |radarObjects|,一个包含以下字段的结构数组:%numObjects(整数)和对象(结构)。数组的每个元素%对应于不同的时间步。|是一个结构数组,其中每个元素是一个单独的对象,% with fields: id, status, position(x;y;z), velocity(vx,vy,vz),%振幅和rangeMode。%注:z始终为常数,且vz=0。%#| visionObjects |,一个带有字段的结构数组:timeStamp(见下文),%numObjects(整数)和对象(结构)。数组的每个元素%对应于不同的时间步。|是一个结构数组,其中每个元素是一个单独的对象,%带字段:id、分类、位置(x;y;z),%的速度(vx; v; vz),大小(dx, dy, dz)。注意:z = v = vz = dx = dz = 0录制视觉和雷达对象的时间戳是uint64变量%自Unix纪元以来保持微秒。时间戳记录在%50毫秒分开。之间存在完整的同步%视觉和雷达探测记录,因此时间戳%未在进一步计算中使用。a = load(sensorrecordingfilename);VisionObjects = A.Vision;radarobjects = a.radar;lanereports = a.lane;inertialmeasurementunit = a.inertialmeasurementunit;Timestep = 0.05;每50毫秒提供%数据numSteps =元素个数(visionObjects);%记录的时间步数结束

Processlanes.将传感器报告的车道转换为parabolicLaneBoundary车道并保持持久的自我车道估计

作用[LaneBondaries,eGrane]=进程通道(laneReports,eGrane)%车道边界将根据录制的车道报告进行更新。由于某些lanereports包含无效(ISValid = FALSE)报告或%不可能的参数值(-1e9),这些车道报告被忽略了%使用上一条车道边界。Leftlane = LaneReports.left;Rightlane = LaneReports.Right;%检查报告的左车道的有效性气孔导度= (leftLane。isValid && leftLane.confidence) &&...~(leftLane.headingAngle==-1e9 | | leftLane.curvature==-1e9);如果气孔导度egoLane。左= ([leftLane。曲率,leftLane。headingAngle, leftLane.offset],“双”);结束%更新左车道边界参数或使用以前的参数leftParams = egoLane.left;leftBoundaries = parabolicLaneBoundary (leftParams);leftBoundaries。力量= 1;检查报告的右车道是否有效气孔导度= (rightLane。isValid && rightLane.confidence) &&...~ (rightLane。方向角== -1e9 ||右曲率= = 1 e9);如果cond egoLane.right=投射([rightLane.curvature,rightLane.headingAngle,rightLane.offset],“双”);结束%更新右车道边界参数或使用以前的参数rightParams = egoLane.right;rightBoundaries = parabolicLaneBoundary (rightParams);rightBoundaries。力量= 1;[左边界,右边界];结束

FindNonClutterDarObjects移除被视为杂波一部分的雷达对象

作用realRadarObjects = findNonClutterRadarObjects(radarObject, numRadarObjects, egoSpeed, laneBoundaries)%雷达对象包括属于杂波的许多对象。的定义为不在前面的静止物体%的车。以下类型的对象作为非杂波传递:汽车前面的任何物体% #任何在汽车周围感兴趣区域的移动物体,包括在汽车周围以横向速度移动的物体%分配内存normVs = 0 (numRadarObjects, 1);inLane = 0 (numRadarObjects, 1);inZone = 0 (numRadarObjects, 1);%参数LaneWidth=3.6;被认为在汽车前面的东西ZoneWidth = 1.7 *巷宽;更广泛的兴趣领域minv = 1;任何移动速度低于minV的物体都被认为是静止的j = 1:numRadarObjects [vx, vy] = calculateGroundSpeed(radarObject(j).velocity(1),radarObject(j).velocity(2),egoSpeed);normVs规范(j) = ((vx, v));laneBoundariesAtObject = computeBoundaryModel(laneBoundaries, radarObject(j).position(1));laneCenter =意味着(laneBoundariesAtObject);inLane(j) = (abs(radarObject(j).position(2) - laneCenter) <= LaneWidth/2);inZone(j) = (abs(radarObject(j).position(2) - laneCenter) <= max(abs(vy)*2, ZoneWidth));结束realRadarObjectsIdx =联盟(...intersect(find(normVs > minV), find(inZone == 1)),...找到(inLane = = 1));realRadarObjects = radarObject (realRadarObjectsIdx);结束

计算行驶速度从相对速度和自我飞行器的速度计算雷达报告的目标的真实地面速度

作用(Vx, v) = calculateGroundSpeed (Vxi、Vyi egoSpeed)%的输入% (Vxi,Vyi):物体相对速度自我速度:自我车辆速度%输出%:地面物体速度Vx=Vxi+速度;%计算纵向地速度Theta = atan2(vyi,vxi);计算航向角vy = vx * tan(theta);%计算横向地面速度结束

processVideo将报告的视觉对象转换为objectDetection对象

作用postProcessedDetections = processVideo(postProcessedDetections, visionFrame, t)%将视频对象处理到ObjectDetection对象中numRadarObjects=numel(后处理检测);numVisionObjects=visionFrame.numObjects;如果numVisionObjects classToUse = class(visionFrame.object(1).position);visionMeasCov = cast(diag([2,2,2,100]), classToUse);%过程视觉对象:i=1:numVisionObjects对象= visionFrame.object(i);postProcessedDetections {numRadarObjects + i} = objectDetection (t)...[对象位置(1);对象速度(1);对象位置(2);0],...'sensorindex', 1“MeasurementNoise”visionMeasCov,...“MeasurementParameters”{1},...“ObjectClassID”object.classification,...“ObjectAttributes”,{对象。id, object.size});结束结束结束

处理雷达将报告的雷达对象转换为列表objectDetection对象

作用PostProcessedDetections = ProcessRadar(后处理Ddetections,RealRadarobjects,T)%将雷达对象处理到ObjectDetection对象中numRadarObjects =元素个数(realRadarObjects);如果numRadarObjects classToUse=class(realRadarObjects(1).位置);radarMeasCov=cast(diag([2,2,2100]),classToUse);%过程雷达对象:i=1:numRadarObjects对象= realRadarObjects(i);postProcessedDetections{我}= objectDetection (t)...[object.position (1);object.velocity (1);object.position (2);object.velocity (2)),...'sensorindex'2,“MeasurementNoise”,拉达梅阿斯科夫,...“MeasurementParameters”{2},...“ObjectAttributes”,{object.id,object.status,object.amplitude,Object.RangeMode});结束结束结束

fcwmeas这个前向碰撞警告示例中使用的测量函数

作用测量= fcwmeas(state, sensorID)%测量值取决于传感器类型,这些传感器类型% objectDetection的MeasurementParameters属性。以下%两个SensorID值使用:%sensorID=1:视频对象,测量值为[x;vx;y]。%sensorID=2:雷达目标,测量值为[x;vx;y;vy]。%状态为:恒速状态= [x;vx;y;vy][x;vx;y;vy;% Constant acceleration state = [x;vx;ax;y;如果元素个数(状态)< 6恒定转弯或恒定速度转换传感器案件1%的视频测量= [状态(1:3);0);案件2%的雷达测量=状态(1:4);结束其他的%恒加速度转换传感器案件1%的视频测量=[状态(1:2);国家(4);0);案件2%的雷达测量=[状态(1:2);状态(4:5)];结束结束结束

fcwmeasjac在此前进碰撞警告示例中使用的测量函数的Jacobian

作用fcwmeasjac(state, sensorID)%测量值取决于传感器类型,这些传感器类型% objectDetection的MeasurementParameters属性。我们选择% sensorID=1表示视频对象,% sensorID=2表示雷达对象。的%以下两个sensorID值被使用:%sensorID=1:视频对象,测量值为[x;vx;y]。%sensorID=2:雷达目标,测量值为[x;vx;y;vy]。%状态为:恒速状态= [x;vx;y;vy][x;vx;y;vy;% Constant acceleration state = [x;vx;ax;y;numStates =元素个数(状态);= 0 (4, numStates,'喜欢', 状态);如果元素个数(状态)< 6恒定转弯或恒定速度转换传感器案件1%的视频雅可比(1,1)=1;雅可比(2,2)=1;雅可比(3,3)=1;案件2%的雷达雅可比(1,1)=1;雅可比(2,2)=1;雅可比(3,3)=1;雅可比矩阵(4,4)= 1;结束其他的%恒加速度转换传感器案件1%的视频雅可比矩阵(1,- 1)= 1;雅可比矩阵(2,2)= 1;雅可比矩阵(3、4)= 1;案件2%的雷达雅可比(1,1)=1;雅可比(2,2)=1;雅可比(3,4)=1;雅可比(4,5)=1;结束结束结束

另请参阅

功能

对象

相关话题