RF-LIO:面向高动态场景的紧耦合LiDAR惯导融合里程计(IROS 2021)

article/2025/9/2 22:11:11

9d64b89683b341881674a8a6f1dd95eb.png

RF-LIO: 面向高动态场景的紧耦合LiDAR惯导融合里程计

单位:西安交通大学

针对问题:

实际场景中动态因素的引入造成基于静态假设的LIO严重位姿漂移

提出方法:

提出基于自适应的多分辨率Range Image的动态点移除算法,并使用紧耦合的激光雷达惯导里程计,首先去除移动物体,然后将激光雷达扫描与子图相匹配,构建基于优先移除的面向高动态场景的LIO。

达到效果:

在不同动态程度的实际场景数据集中测试了系统的定位精度,RF-LIO的绝对轨迹精度相较于LOAM和LIO-SAM显著提升。所提出基于Range Image的动态点剔除算法可剔除场景中96%以上的动态点。

Abstract

SLAM被认为是智能车辆和移动机器人的一项基本能力。然而,目前大多数的激光雷达SLAM方法都是基于静态环境的假设。因此,在一个有多个移动物体的动态环境中的定位实际上是不可靠的。本文在LIO-SAM的基础上提出了一个动态SLAM框架RF-LIO,它增加了自适应的多分辨率Range Image,并使用紧耦合的激光雷达惯导里程计,首先去除移动物体,然后将激光雷达扫描与子图相匹配。因此,即使在高动态环境中,它也能获得准确的位姿。提出的RF-LIO在我们收集的数据集和开放的Urbanloco数据集上进行了评估。高动态环境下的实验结果表明,与LOAM和LIO-SAM相比,所提出的RF-LIO的绝对轨迹精度可以分别提高90%和70%。RF-LIO是高动态环境中最先进的SLAM系统之一。

Introduction

本文提出了一个新的移除优先的紧耦合激光雷达惯导里程计框架,即RF-LIO,以解决高动态环境下的SLAM问题。移除优先是指所提出的RF-LIO首先移除没有准确位姿的移动物体,然后采用扫描匹配。当新的扫描到达时,RF-LIO不会立即进行扫描匹配以获得准确的姿态,因为它很容易受到动态环境的影响。相反,我们使用紧耦合的IMU里程计来获得一个粗略的初始状态估计。然后,RF-LIO可以通过使用自适应分辨率Range Image来初步去除环境中的移动点。在初步去除移动点后,RF-LIO使用扫描匹配来获得相对更准确的位姿。通过这些迭代去除和扫描匹配的步骤,RF-LIO可以在高动态环境中最终获得准确的位姿。我们使用移动物体的移除率和绝对轨迹精度来评估RF-LIO在自我收集的数据集和开放的Urbanloco数据集上的表现。实验表明,与LOAM和LIO-SAM相比,RF-LIO的平均移动物体去除率为96.1%,RF-LIO的绝对轨迹精度可以分别提高90%和70%。

RF-LIO

1.系统框架

图2显示了RF-LIO的整体框架,它由三个主要模块组成。IMU预积分、特征提取和建图。首先,IMU预积分模块用于推断系统的运动并生成IMU观测。然后,特征提取模块对点云的运动失真进行补偿。边缘和平面特征是通过评估点的粗糙度来提取的。

建图模块是我们提出的方法的关键模块。为了在没有准确位姿的情况下首先实现移动物体的移除,有几个关键步骤。(i) 初始姿态是由IMU测距得到的。然后用IMU预积分和扫描匹配之间的误差来确定初始分辨率(即每个像素对应多少个角度的FOV)。(ii) RF-LIO使用这个初始分辨率,分别从当前激光雷达扫描和相应的子图中构建测距图像。(iii) 通过比较它们的可见度,删除子图的主要移动点。(iv) RF-LIO将激光雷达扫描与子图相匹配,并判断扫描匹配是否收敛。如果是收敛的,在图形优化后,最终的精细分辨率被用来去除当前关键帧中剩余的移动点。否则,将产生一个新的分辨率,并重复步骤(二)、(三)和(四)。

87d44e8640b075617101c9cb8aaa711b.png

2.IMU预积分和初始位姿

我们首先将世界坐标系表示为W,将与机器人body坐标系重合的IMU坐标系表示为B,系统的状态可以表示为:

a0903b188d5a723037f32a30947fad2e.png

当IMU测量值到来时,通过IMU预积分得到从上一个关键帧k获得当前关键帧k+1的初始姿态:

3a0371530dbe410036b58e25dac0010d.png

3.IMU预积分误差和初始分辨率

在使用IMU进行航迹推演时,不可避免地会出现与真值之间的偏差,这使得查询的扫描点与对应的地图点存在模糊性。为了解决这个问题,Palazzolo和Stachniss提出了一种基于窗口的方法(即不是像素对像素,而是像素对窗口的比较)。Removert中提出了一种更方便的方法,它使用具有不同分辨率的多个Range Image。然而,Removert使用固定的分辨率,因为它是基于准确的定位信息。但是RF-LIO需要在扫描匹配之前去除动态点(即没有准确的位姿)。因此,我们使用IMU预积分和扫描匹配之间的位姿误差来动态地生成初始分辨率。当进行扫描匹配时,IMU预积分的平移和方向误差可以按以下方式计算出来:

26ff91e20e0e8c31858b39900e83752a.png

通过上式,我们可以得到前一个关键帧k的位姿误差。然而,在扫描匹配之前,用上述方法无法得到当前关键帧k+1的IMU预积分误差。为了得到当前关键帧k+1的误差,我们使用非线性系统的误差传递关系:

6b6d37545e602a0c2b32868951c296c2.png

我们只对δX的δθ和δp感兴趣,因此我们的方法可以写成如下形式:

1d7fc4de3607b5821891d4c029cc66e1.png

通过预测IMU里程计的定位误差,我们可以得到Range Image的初始分辨率,我们使用以下经验公式将平移和方向误差转换为分辨率。

308a90680ea3e0bca87ec82c23e23699.png

其中,α是一个介于0和1之间的值,用于平衡转换误差和方向误差对分辨率的贡献。

为了平衡实时性能和去除率,并避免错误的预测分辨率造成的影响,我们设定了一个最小的分辨率r0,并适当扩大了预测的分辨率r,最终的初始分辨率rf定义如下:

c9245f40e8e740d36b004f068fa18f7c.png

4.Range Image 构建以及动态点剔除

我们首先将定义为当前的关键帧扫描,将定义为相应的子图,即围绕用滑动窗口法创建的点云图。此外,为了平衡移动点的去除率和实时性能,我们使用完整的查询扫描来与特征子图进行比较。这是因为具有多个关键帧的特征子图具有与完整查询扫描相似的密度,并且比完整子图的点数少。然后,我们将点云分为两个互斥的子集:动态点集,和静态点集。形式上,上述问题表示为:

f51f8d97a78d9a7733a6cf1d703c7e6d.png

这里D和S的交集为空集。

2cd8b6a120e94e094960b4276b67f202.png

f38fc775927b2d526d705ccb3c2684b5.png

其中γ是相对于点的距离的灵敏度。我们建议将γ设置为图4(c)所示的最终分辨率的最大值,这样可以有效避免因预测分辨率错误而将静态点误认为动态点。

5.雷达里程计和新分辨率构建

95fb342d8d3e27e2bbf1cbd2c923e16b.png

3911d46a563016d253eb0ea4ab2a0e9b.png

当扫描匹配是收敛的,我们可以得到两个关键帧k和k+1之间的相对变换。所以激光雷达的里程计可以写成

666ecab3ef98ae59e49c233612bb14c9.png

然而,在一个有多个移动物体的高动态环境中,激光雷达的里程计会发生漂移。如图2所示,我们已经在III-C和III-D部分的步骤中初步消除了移动点,但它仍然不能保证扫描匹配的可靠性。因此,我们需要判断其收敛性。我们描述并实现了一种简单但有效的方法,它是由基于欧式距离的边缘点Fek+1判断的。它可以自然地嵌入到我们的扫描匹配方法中,而无需额外的计算。此外,与使用所有的扫描点相比,边缘点的稀疏性可以确保该方法足够稳健。我们还注意到,我们的框架可以与其他方法兼容,如[22]和[23],但这些方法需要其他时间来计算。我们的实验表明,我们的方法是足够有效的。它被总结在Alg. 1.

b0b76b3c4434d55d3d407d6b3949be84.png

6a725b5618c89ebb21e8ce7fb8f50e7b.png

EXPERIMENTS

1.实验设置

b9fdac41823fe62948c50c3cd255b5c0.png

我们通过一系列的实验来评估我们的RF-LIO,并将其与LOAM[1]和LIO-SAM[2]进行比较。我们注意到RF-LIO和LIO-SAM都使用相同的特征提取和闭环检测方法,并且都使用GTSAM[24]来优化因子图。用LIO-SAM进行的消融实验显示了RFLIO中移除优先的效果。在所有的实验中,RF-LIO使用了表I中所示的相同参数。所有的方法都是用C++实现的,并在一台装有英特尔i7-10700k CPU的计算机上执行,使用Ubuntu Linux的机器人操作系统(ROS)。为了验证,我们使用了我们录制的数据集和开放的UrbanLoco数据集[7],其中UrbanLoco数据集包含大量的移动物体。这些数据集的细节显示在表二中。对于有少量移动物体的数据集,我们将其定义为低动态数据集。对于有大量移动物体的数据集,我们将其定义为高动态数据集。而中等动态数据集则介于低动态数据集和高动态数据集之间。所有的方法都只使用激光雷达和IMU不使用GPS,GPS数据只作为真值。

ad59a764ecc647232134a1fc139ac757.png

2.初始分辨率设置

设置正确的Range Image的初始分辨率可以有效地去除移动的点,避免去除固定点的错误。因此,本实验旨在证明第二节IC中提出的方法的正确性。从图4(b)我们可以看出,预测的方向误差与真实的误差有很好的一致性。由于平移是加速度的双积分,预测的平移误差不如预测的方向误差准确。图4(a)显示,预测的平移误差与真实平移误差之间的偏差总是在可接受的范围内。如图4(c)所示,预测分辨率与真实分辨率基本一致,而最终的分辨率总是大于真实分辨率。这使得我们的方法可以有效减少识别移动点的错误。

3.动态物体移除测试

在这个测试中,移动点的移除率被用来评估RF-LIO。为此,我们收集了三个在不同环境中有多个移动物体的数据集。图5(a)是有许多移动车辆的郊区数据集的快照。RF-LIO与LIO-SAM有相同的特征提取方法。因此,我们用LIO SAM作为评价标准来评估RF-LIO的移动点去除率。从LIO-SAM和RF-LIO得到的地图分别显示在图5(b)和5(c)。如图所示,LIO-SAM在点云图中渲染了大量的鬼影。与之相比,RF-LIO可以得到一个更干净的地图。我们分别计算LIO-SAM和RF-LIO地图中残留的移动点的数量,然后计算去除率。结果如表三所示。我们可以看到,与LIO-SAM相比,RF-LIO的平均去除率达到了96.1%。我们注意到,RF-LIO并没有完全去除所有的移动点。因为有些移动点离地面太近(距离<0.5,小于我们设定的阈值),还有一些是由平行于地面的激光雷达光束产生的,这使得我们很难在子图中找到相应的远点来去除它们。

b128ed449b6103344c8a5919ca1d5446.png

4.不同动态程度数据集实验结果

在这个实验中,我们使用了三个自己收集的数据集,其中只有少数移动物体。由于LOAM和LIO SAM是在静态环境下设计的,我们与它们进行比较,以显示RF-LIO在一般情况下的性能。

f8708096b2027e75f40baf6a1802a9b1.png

f424dd2a3f339fb1179d980b79094c37.png

城市数据集包括各种各样的城市地形:住宅区、立交桥、建筑区等。图6显示了RF-LIO的细节和最终的点云地图。为了直观的显示,RF-LIO的地图被叠加在卫星图像上。校园数据集是从西安交通大学校园内收集的,有多个行人。如图5(a)所示,郊区的数据集包含各种移动的车辆。为了说明在扫描匹配前去除移动点的好处,我们将RF-LIO分为三种不同的类型。当先去除移动点,后进行扫描匹配时,我们的方法被称为RF-LIO(第一种)。同样地,当移动点在扫描匹配之后被移除时,我们的方法被称为RF-LIO(After)。当首先移除移动点,然后进行扫描匹配,最后再次移除移动点时,我们的方法被称为RF-LIO(FA)。所有方法的绝对轨迹误差如表四所示。LOAM在所有三个数据集上的表现都不理想,因此这里我们只与LIO-SAM进行比较。从结果可以看出,RF-LIO(After)和LIO-SAM有相似的性能,而RFLIO(First)和RF-LIO(FA),使用移除优先,有明显的改善。与LIO-SAM相比,RF-LIO(FA)分别提高了36.7%、3%和18.3%的绝对轨迹精度。

f14078eb7b58566ef3322d401db325b4.png

062add789e1468791a8f5802c29934ed.png

5.高动态场景实验结果

b1b5e976d99122dfb746ed43f83e9caa.png

这个实验旨在证明我们的方法在一个具有挑战性的高动态环境中的优越性。我们选择开放的UrbanLoco数据集作为测试数据集,该数据集是在高度城市化的场景中收集的,有许多移动的物体。一些测试环境的截图如图7所示。在这个实验中,当特征点落在移动物体上时,图8(b)所示的LOAM图在多个位置出现了分歧。LIO-SAM在这个测试中的表现优于LOAM,其地图如图8(c)所示。与LIO-SAM相比,RF-LIO的漂移较小,由于去除移动物体,闭环检测性能更好。所有方法的绝对轨迹误差如下表所示:

1ba774ffdd89e110c5e28cd9a3e1f4b9.png

在高动态数据集中,RF-LIO对SLAM性能的提高有更突出的作用。与LIO-SAM相比,RF-LIO(后)分别提高了61.6%和65.1%的绝对轨迹精度。实验结果表明,我们的移动物体去除方法可以有效地去除动态特征点,提高SLAM性能。在这两个数据集上,RFLIO(First)比RF-LIO(After)分别提高了34.0%和3.6%。这些结果与低度和中度动态数据集上的结果一致,但更加显著。所以我们可以得出结论,移除优先是另一种有效的方法来提高动态环境下的SLAM性能。由于移除优先删除了大部分动态点,RF-LIO(First)和RF-LIO(FA)的轨迹误差没有明显差异。总之,RF-LIO(FA)在所有方法中取得了最好的结果。

在实际应用中,实时性能是评估SLAM系统的另一个关键指标。我们测试了RF-LIO(后)、RF-LIO(先)和RF-LIO(FA)在所有五个数据集上的运行时间。结果显示在表六中。我们看到,RF-LIO(FA)的运行时间在低动态环境中小于100毫秒,而在高动态环境中,它也小于121毫秒。此外,我们注意到RF-LIO(First)的运行时间明显小于RF-LIO(After),甚至RF-LIO(FA)的运行时间也小于RF-LIO(After)。实验结果表明,移除优先需要额外的时间来去除移动物体,但干净的点云可以减少扫描匹配的时间。

虽然移除-后也会移除移动的点,但此时扫描匹配已经完成。因此,其效果不如移除优先好。

1cc96962c73f869377835a546ccc68b7.png

e5b1b64153b3338f6340cc8d0cc0592f.png

CONCLUSIONS

我们提出RF-LIO,以在高动态环境中进行实时和鲁棒的状态估计和建图。RFLIO采用移动物体去除优先算法与紧耦合的LIO相结合,解决了在高动态环境下先去除动态点或先扫描匹配的问题。所提出的自适应Range Image动态点去除算法不依赖于任何先前的训练数据,也不受移动物体的类别和数量的限制。因此,RF-LIO可以稳健地应用于各种场景。

然而,RF-LIO仍有一些正在进行的工作。在一个非常开放的环境中,如果周围环境中没有相应的远点,基于可见度的范围图像方法就不能去除移动点。另一个问题是,当移动物体完全阻挡了我们的传感器的FOV时,该方法不适合。

备注:作者也是我们「3D视觉从入门到精通」特邀嘉宾:一个超干货的3D视觉学习社区

本文仅做学术分享,如有侵权,请联系删文。

重磅!计算机视觉工坊-学习交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

79f6ae3c0fa8693680cf76fc7091e7b5.png

▲长按加微信群或投稿

cd040229529a88e626ed2023b6cb04f0.png

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

33c7b6aad393953b46b178b463b9d586.png

 圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~


http://chatgpt.dhexx.cn/article/qbvMrseo.shtml

相关文章

经典文献阅读之--Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping(紧耦合3D激光雷达)

0. 简介 传统的地图生成方法一般是依靠Lidar和IMU结合的&#xff0c;但是问题在于&#xff0c;目前Lidar和IMU的紧耦合主要集中在前端里程计&#xff0c;基本没有涉及到后端全局优化以及建图的融合。为此文章《Globally Consistent and Tightly Coupled 3D LiDAR Inertial Map…

MD5加密的应用

简单介绍一下MD5加密的使用方法&#xff1b; MD5的全称是Message-Digest Algorithm 5&#xff08;信息-摘要算法&#xff09;&#xff1b; 特点是不可逆的&#xff0c;一般解密不了&#xff1b; MD5Util工具类&#xff1a; package com.java.util;import java.io.UnsupportedE…

python md5加密解密_python md5加密解密

md5加密以后的字符串长度 我下了一段用JAVA实现MD5加密的算法,不管输入字符串多长,加密后的字符加密后为128位(bit),按照16进制(4位一个16进制数)编码后,就成了32个字符。MD5并不是加密算法zhidao,而是摘要算法。加密算法是可逆的,摘要算法是理专论上不可逆的,详细…

Java MD5 加密工具类

一、MD5简介 MD5消息摘要算法&#xff08;英语&#xff1a;MD5 Message-Digest Algorithm&#xff09;&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确…

为什么md5不可逆,却还可能被md5免费解密网站解密

md5在网络安全中起到非常重要的作用&#xff0c;它被用于保证数据的完整性&#xff0c;以及数据不被篡改。同时&#xff0c;md5还被用来进行密码加密。一些朋友不了解为什么md5不可逆&#xff0c;却还可能被号称能解密md5的网站解密。因此&#xff0c;有人说md5不够安全&#x…

matlab中进行多行注释,取消

在MATLAB中可以在行首部加 1 %来进行注释&#xff0c; 2 加%%空格来进行划分不同的程序段。 但在进行多行注释时&#xff0c;针对单行进行操作过于麻烦&#xff0c;可以利用快捷键进行多行注释。 可以先选中需要注释的行&#xff0c;然后按“ctrlR”进行注释&#xff0c; 多…

Matlab多行注释单行程序分行写

2019独角兽企业重金招聘Python工程师标准>>> 一、Matlab注释 1&#xff09;、单行注释&#xff1a;当然是行首加‘%’了。 2&#xff09;、多行注释&#xff1a; a、选中你要加注释的内容&#xff0c;然后选择工具菜单“text|comment”就可以了&#xff0c; 快捷键是…

funcode游戏实训,java及C/C++,网上整理

软件&#xff0c;常见错误都有。 所有资源可到公众号获取(源码也是)&#xff0c;不再直接分享

funcode环境配置(亲测有效)

vmware 虚拟机版本是15.5.1 虚拟机版本链接 win7专业版镜像文件 迅雷(打开迅雷复制即可) ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/ 过程可供参考 vc2012任何版本均可 设置过程&#xff1a; 打…

funcode实验--海底世界(c++实现)

C语言课程设计一海底世界 一、实验内容 海底有若干条鱼&#xff0c;其中若干条相同的鱼向一个方向游动&#xff0c;另一条来回随机游动&#xff0c;由玩家用键盘W A S D控制另外一条游动。 要求如下&#xff1a; 1、 来回游动的鱼&#xff0c;从屏幕左边游进来&#xff0c;…

FunCode太空战机C++实现

仅供交流学习使用&#xff0c;因博主水平有限&#xff0c;有错误欢迎批评指正 作者&#xff08;即博主本人&#xff09;&#xff1a; Akame Qixisi / Excel Bloonow IDE&#xff1a;Code::Blocks 17.12 编译器需要支持C14或以上标准&#xff08;Code::Blocks如何设置见附录Ⅰ&…

基于funcode的闯关小游戏(山东省齐鲁软件设计大赛三等奖)给自己留个纪念

背景&#xff1a; &#xff08;链接文档在最后&#xff09; 19年的暑假&#xff0c;同学喊我参加山东省齐鲁软件设计大赛&#xff0c;报上名之后有这个funcode课题。d但是从来没有接触过funcode&#xff0c;网上的参考资料也不多&#xff0c;靠着自己摸索和同学交流半懂半做了这…

基于Funcode设计C语言游戏–迷你高尔夫

Funcode设计 文章目录 Funcode设计前言一、Funcode下载地址二、C语言课程设计--迷你高尔夫1.效果图2.部分代码 总结 前言 基于Funcode设计的C语言游戏。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Funcode下载地址 Win10版本 提取码&#xf…

2021年Funcode游戏制作二等奖作品

之前发的有关funcode游戏更多的则是对游戏流程有一个大概的了解&#xff0c;以及如何编写游戏循环&#xff0c;判定游戏的各种触发条件&#xff0c;较为简陋。 这一次看到有人问funcode游戏的制作&#xff0c;就把搁置了许久的 项目拿给大家作为参考建议。 素材来源&#xff1a…

【致敬童年】Funcode实现坦克大战

【2023年5月26日】 带10个需求的资源已上传至Funcode实现坦克大战&#xff08;十个需求&#xff09; 【效果图】 【写在前面的话】 1、虚函数哪里很难受&#xff0c;最后在Commclass里面加了一个无参构造才搞定 2、bug很多&#xff0c;比如世界边界&#xff0c;子弹都有问题。…

Funcode游戏设计C语言小飞虫

Funcode游戏制作 文章目录 Funcode游戏制作前言一、基于Funcode的小飞虫二、使用步骤1.游戏效果图2.游戏代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&…

【C++FunCode】基于Funcode使用C++语言编写小游戏(小鲨鱼历险记)

一、前言 大一暑假参加了山东省软件设计大赛&#xff0c;基于FunCode平台使用C语言编写了大鱼吃小鱼游戏&#xff0c;其美名曰小鲨鱼历险记&#xff0c;哈哈。比赛成绩惨烈&#xff0c;只拿了一个省三&#xff0c;赛后也进行了分析总结&#xff0c;主要还是太不重视比赛&#…

Funcode实现坦克大战(十个需求)

【写在前言】 1、操作 先按数字&#xff08;1~0&#xff09;10个 表示选择某一需求&#xff08;对应文件的需求&#xff09; 再按K 表示执行该需求&#xff08;控制台有输出&#xff09; 2、写此文为方便大家的学习&#xff0c;希望不要一抄了事&#xff0c;真心希望&#xff0…

Funcode海底世界c++(vc6)

海底有五条鱼&#xff0c;其中四条来回随机游动&#xff0c;由玩家用键盘W A S D控制另外一条游动。 要求如下&#xff1a; 游戏初始界面如下图。来回游动的四条鱼&#xff0c;从屏幕左边游进来&#xff0c;均已一个随机速度水平游动。从屏幕右侧游出去&#xff0c;很快又从屏…