当前位置: 首页 > news >正文

网站服务器迁移wordpress默认导航栏

网站服务器迁移,wordpress默认导航栏,做采集的网站有流量吗,门店管理系统软件免费前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础#xff0c;Nav2相关的学习教程可以参考本人的其他博…前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车并使用通过跨平台的方式进行ROS2和UE5仿真的通讯达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程 第一期基于UE5和ROS2的激光雷达深度RGBD相机小车的仿真指南(一)—UnrealCV获取深度分割图像-CSDN博客第二期基于UE5和ROS2的激光雷达深度RGBD相机小车的仿真指南(二)—ROS2与UE5进行图像数据传输-CSDN博客 UE5系列教程: 第一期:UE5-C入门教程(一)使用代码创建一个指定目标的移动小球-CSDN博客第二期:UE5-C入门教程(二)—编写Editor类别的自定义模型实现小球规划路线的可视化-CSDN博客 本教程环境支持 UE5.43ubuntu 22.04 ros2 humble 前两期我们讲了如何使用UnrealCV在UE5中捕获深度分割原始图像并借助rosbridge将图像数据实时传输到ubuntu22.04 ros2 humble中。本期我们来讲讲如何在UE5中模拟激光雷达的仿真数据。 激光雷达 介绍 激光雷达Lidar是一种利用激光来探测和测量物体距离、速度、方位和形状的技术。它通过发射激光脉冲并接收从目标反射回来的激光从而计算出目标的位置和特性。激光雷达广泛应用于各种领域如地理信息系统GIS、环境监测、遥感、自动驾驶汽车、考古学等。 激光雷达的基本工作原理如下 发射激光激光雷达系统发射激光脉冲这些脉冲可以是连续波或者脉冲波。反射激光激光脉冲照射到目标物体后部分光波会被反射回来。接收反射光激光雷达系统中的接收器会捕捉到反射回来的激光。数据处理系统通过计算激光发射和接收之间的时间差以及激光的波长来确定目标的距离。通过分析反射光的强度、频率变化等还可以获取目标的速度、方位和形状等信息。 性能指标 这里我们借助镭神智能公司旗下的16线机械式激光雷达来讲解激光雷达具备的基本参数(这里不是广告(迫真)) 激光波长905nm 激光波长是激光雷达发射的激光的波长通常以纳米nm为单位。常用的波长包括905nm和1550nm。不同波长的激光具有不同的特性和应用例如905nm波长的激光雷达通常成本较低但容易受到阳光和其他环境因素的干扰而1550nm波长的激光雷达具有更好的抗干扰能力和较长的探测距离。 探测距离70/120/150/200m 探测距离是指激光雷达能够有效测量目标的最远距离。探测距离受激光功率、目标反射率、大气条件等因素的影响。通常激光雷达的探测距离从几米到几百米不等。 视场角FOV- 水平视场角360°垂直视场角-15°~15° / -10°~10° 视场角是指激光雷达能够覆盖的水平或垂直角度范围。水平视场角通常为360度而垂直视场角则取决于激光雷达的具体设计。视场角越大激光雷达能够感知的环境范围就越广。 测距精度±3cm 测距精度是指激光雷达测量距离的准确程度通常以厘米或毫米为单位。高精度的激光雷达可以提供非常准确的距离测量这对于需要高精度定位和测量的应用至关重要。 角分辨率垂直2°水平0.09°5Hz, 0.18°10Hz, 0.36°20Hz 角分辨率是指激光雷达能够分辨的最小角度变化。高角分辨率意味着激光雷达可以更细致地描绘目标的形状和轮廓。角分辨率通常分为水平角分辨率和垂直角分辨率。 出点数- 320,000点/秒单回波 出点数是指激光雷达每秒钟能够发射的激光点数。出点数越多激光雷达获取的环境信息越丰富扫描速度越快。 线束16线 线束是指激光雷达在垂直方向上的激光束数量。多线激光雷达通过多个激光发射器在垂直方向上的分布形成多条线束的扫描。线束越多对环境的描述越充分。 安全等级 1级人眼安全 激光雷达的安全等级需要满足特定的安全标准例如Class 1以确保在正常使用条件下不会对用户造成伤害。 输出参数 输出参数包括障碍物的位置、速度、方向、时间戳、反射率等这些参数对于后续的数据处理和分析至关重要。 IP防护等级IP67 IP防护等级表示激光雷达对固体颗粒和水的防护能力对于在恶劣环境下工作的激光雷达尤为重要。 功率和供电电压 功率和供电电压决定了激光雷达的能耗和适用场景。激光雷达的功率通常以瓦特W为单位供电电压则取决于激光雷达的具体设计。 激光发射方式- 机械旋转 激光发射方式分为机械旋转和固态两种。机械旋转激光雷达通过旋转发射器来扫描环境而固态激光雷达则通过电子方式控制激光束的方向。 使用寿命 使用寿命是指激光雷达在正常工作条件下的预期寿命。机械旋转激光雷达的使用寿命一般在几千小时而固态激光雷达的使用寿命可高达10万小时。 题外话-旧版本UE5插件支持(不使用) 值得一提的是在UE5的虚幻商城中是存在一款免费的2D雷达仿真插件的但是由于其支持的引擎版本本期我们不使用该插件。 1.创建自定义雷达插件 本小结我们将借助激光雷达的原理不借助任何现成插件尝试在UE5中借助内置函数通过cpp代码实现完成上述激光雷达的仿真。 1-1 概念解析–插件 Unreal Engine 5 (UE5) 提供了一个强大的插件系统允许开发者扩展和定制引擎的功能。插件可以是社区创建的也可以是 Epic Games 官方提供的它们可以添加新的工具、功能、内容或集成到 Unreal Engine 中。UE5 插件的特点和优势包括 模块化插件通常以模块的形式集成到 Unreal Engine 中这意味着它们可以独立于引擎的其他部分进行开发、编译和更新。可定制性开发者可以根据自己的需求定制插件添加新的功能或改进现有功能。可重用性插件可以在不同的项目中重用节省开发时间和资源。易于安装Unreal Engine 提供了一个插件市场开发者可以轻松地浏览、安装和管理插件。 要使用 UE5 插件我们只需要将其导入到 Unreal Engine 项目中。一旦插件被导入开发者可以在项目的插件管理器中启用或禁用插件并根据需要配置插件的设置。 1-2 创建自定义插件 新建一个新的项目这里取名为Plugins_project选择C而不是蓝图,否则我们将会只有一种类型的插件 打开你的新建的项目(记得确保是C)在左上角菜单栏点击编辑在下拉菜单栏中找到插件在新打开的插件窗口中选择 添加会出现如下画面 这里我们把插件名字定义为LaserScannerSim 作者我www描述为:a plugin which mantian at 2D laser scanning simualtion including laser displaying and laser messages publishing VS2022打开项目记得重新加载在项目根目录下会多出一个Plugins文件夹 .uplugin 文件是 Unreal Engine 中的插件描述文件它定义了插件的各种元数据和设置包括插件的名称、版本、描述、作者、加载阶段、模块列表等。这个文件是插件的重要组成部分它告诉 Unreal Engine 如何加载、集成和管理插件。我们来关注LaserScannerSim.uplugin这个文件的结尾部分 Modules: [{Name: LaserScannerSim,Type: Runtime,LoadingPhase: Default} ]Name: LaserScannerSim 这是模块的名称它应该是独一无二的并且会用作模块的标识符。在代码中通常会与模块相关的文件和目录同名。 Type: Runtime 这表示模块类型为运行时模块。运行时模块包含在游戏或应用程序的运行时阶段加载的代码和资源。LoadingPhase: Default - 这指定了模块的加载阶段。Default 加载阶段意味着模块将在默认的加载时间点被加载这对于大多数插件来说是合适的。如果需要更细粒度的控制可以指定其他加载阶段例如 PostEngineInit、PreLoadMap 或 PostLoadMap。这里我们把这个插件的LoadingPhase改为PostEngineInit,我希望模块在引擎初始化完成后加载。 Modules: [{Name: LaserScannerSim,Type: Runtime,LoadingPhase: PostEngineInit} ]紧接着我们来看看该插件文件夹下的两个文件夹Public:LaserScannerSim.hpp // Copyright Epic Games, Inc. All Rights Reserved.#pragma once#include CoreMinimal.h #include Modules/ModuleManager.hclass FLaserScannerSimModule : public IModuleInterface { public:/** IModuleInterface implementation */virtual void StartupModule() override;virtual void ShutdownModule() override; }; Private:LaserScannerSim.cpp // Copyright Epic Games, Inc. All Rights Reserved.#include LaserScannerSim.h#define LOCTEXT_NAMESPACE FLaserScannerSimModulevoid FLaserScannerSimModule::StartupModule() {// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module }void FLaserScannerSimModule::ShutdownModule() {// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,// we call this function before unloading the module. }#undef LOCTEXT_NAMESPACEIMPLEMENT_MODULE(FLaserScannerSimModule, LaserScannerSim)StartupModule 和 ShutdownModule。这两个函数分别在模块加载到内存后和卸载前调用。稍后我们将讲述如何运用IModuleInterface类它定义了模块Module在Unreal Engine中加载和卸载时的行为。 1-3 报错提示-UE5.4版本BUG 值得注意的是在UE5.4中在上述创建自定义插件后在VS2022进行编译会出现下述报错 这是因为你不能在UE的Live Coding enabled的时候进行编译这时我们选择关闭UE的Live Coding enabled 重新编译成功。 2 创建自定义Componet雷达组件 我们来快速思考以下我们要创建的雷达插件应该是可以广泛运用到用户的各类模型(Actor)上用户可以根据调用我们的雷达组件根据其喜好参数把此组件运用到任意模组中可以是车辆或者是雷达模型上。因此我们要创建一个Componet组件它可以被套用到用户希望的Actor上 2-1 创建自定义雷达组件Components 创建组件的详细教程见-UE5-C入门教程(一)使用代码创建一个指定目标的移动小球-CSDN博客 这里我们快速创建一个组件选择ActorComponent作为父类 为新的组件取名为LaserScanner2D注意添加到我们的插件模块下并设置为私有 2-2 激光雷达实现函数 这里介绍一个UE5提供的内置函数LineTraceSingleByChannel我们打开官方API手册,搜索得到相关关于这个函数的API实现 函数 LineTraceSingleByChannel 用于执行光线投射Line Tracing。这个函数可以用来检测从起点到终点之间是否有碰撞并返回碰撞信息。 FHitResult OutHit 用于存储光线投射的结果。如果检测到碰撞这个参数会被填充碰撞信息例如碰撞的位置、碰撞的物体等。const FVector Start 这是光线投射的起点类型为 FVector表示三维空间中的一个点。const FVector End 这是光线投射的终点类型同样为 FVector。ECollisionChannel TraceChannel 这是一个枚举类型用于指定需要检测的碰撞通道。const FCollisionQueryParams Params这是一个引用参数用于配置光线投射的查询参数允许你设置诸如忽略特定的Actor、检测隐藏的Actor等选项。const FCollisionResponseParams ResponseParam:允许你设置碰撞后的响应行为 bool LineTraceSingleByChannel 40; struct FHitResult OutHit, const FVector Start, const FVector End, ECollisionChannel TraceChannel, const FCollisionQueryParams Params, const FCollisionResponseParams ResponseParam 41; const 2-3 激光雷达可视化 这里我们使用DrawDebugLine对雷达的射线进行可视化 WorldContextObject: 表示当前世界上下文的对象。通常你会传递GetWorld()的返回值给这个参数它会返回一个指向当前游戏世界的指针。 LineStart: 直线的起始位置它是一个FVector类型表示三维空间中的一个点。LineEnd: 直线的结束位置它也是一个FVector类型表示三维空间中的另一个点。LineColor: 直线的颜色它是一个FLinearColor类型允许你设置红、绿、蓝和透明度。Duration: 直线在游戏世界中显示的时间以秒为单位。如果设置为-1.0f直线会一直显示直到下一帧或显式地被清除。Thickness: 直线的厚度以世界单位为单位。这允许你设置直线的宽度。 static void DrawDebugLine 40; const UObject 42; WorldContextObject, const FVector LineStart, const FVector LineEnd, FLinearColor LineColor, float Duration, float Thickness 41; 2-4 编写雷达组件基本逻辑 那么我们来编写一下雷达组件的实现逻辑LaserScanner2D.hpp,我们为雷达组件添加以下逻辑的代码 FVector StartRelativeLocation; //起始位置bool bScanEnabled true; //是否使能int32 Resolution 1; // 分辨率每1度检测一次float ScanHz 30.0f; // 扫描频率每秒30次float LaserMinDistance 0.1f; // 最近检测距离float LaserMaxDistance 100.0f; // 最远检测距离float debugLineStayDuration 1.0f; // 射线持续时间 // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include CoreMinimal.h #include Components/ActorComponent.h #include LaserScanner2D.generated.hUCLASS( ClassGroup(Custom), meta(BlueprintSpawnableComponent) ) class ULaserScanner2D : public UActorComponent {GENERATED_BODY()public: // Sets default values for this components propertiesULaserScanner2D();protected:// Called when the game startsvirtual void BeginPlay() override; public:void ScanForObjects(); public: // Called every framevirtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;private:UPROPERTY(EditAnywhere)FVector StartRelativeLocation; //起始位置UPROPERTY(EditAnywhere)bool bScanEnabled true; //是否使能UPROPERTY(EditAnywhere)int32 Resolution 1; // 分辨率每10度检测一次UPROPERTY(EditAnywhere)float ScanHz 30.0f; // 扫描频率每秒30次UPROPERTY(EditAnywhere)float LaserMinDistance 0.1f; // 最近检测距离UPROPERTY(EditAnywhere)float LaserMaxDistance 100.0f; // 最远检测距离UPROPERTY(EditAnywhere)float debugLineStayDuration 1.0f; // 射线持续时间 };LaserScanner2D.cpp我们在BeginPlay()初始化一个起始位置 #include LaserScanner2D.h ULaserScanner2D::ULaserScanner2D() {PrimaryComponentTick.bCanEverTick true; } void ULaserScanner2D::BeginPlay() {Super::BeginPlay();StartRelativeLocation FVector(0.0f, 0.0f, 0.0f); }TickComponent将会一直运行我们让其根据我们指定的频率去调用我们写的雷达扫描函数 void ULaserScanner2D::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) {Super::TickComponent(DeltaTime, TickType, ThisTickFunction);static float AccumulatedTime 0.0f; // 累积时间AccumulatedTime DeltaTime; // 累加Delta Time// 当累积时间达到扫描周期时执行扫描if (AccumulatedTime 1.0f / ScanHz){ScanForObjects();AccumulatedTime - 1.0f / ScanHz; } }雷达扫描函数 for (int32 i 0; i 360; i Resolution)我们按照指定分辨率去选择扫描Rotation: 这个FRotator对象表示当前射线发射的方向。它是一个绕Y轴旋转的旋转器其Z轴和X轴的值为0Y轴的值为当前的角度i。 EndLocation: 这是当前射线的结束位置。它通过将StartLocation与Rotation的向量相加以LaserMaxDistance的长度来计算得出。FMath::Clamp函数确保这个距离不会超过LaserMaxDistance的最远距离也不会小于LaserMinDistance的最近距离。OutHit: 这是一个FHitResult对象它用于存储射线与场景中其他对象碰撞的信息。Params: 这是一个FCollisionQueryParams对象它定义了射线检测的参数。AddIgnoredActor(GetOwner())调用确保激光雷达不会与自己所在的Actor发生碰撞。如果检测到膨胀则绘制一条从StartLocation到OutHit.Location的绿色直线。OutHit.Location是射线碰撞点的位置。如果没有检测到碰撞则绘制一条从StartLocation到EndLocation的红色直线。 GetWorld(): 在Unreal Engine中GetWorld()是一个成员函数用于获取当前Actor或Component所在的World对象。World对象是Unreal Engine中的一个核心概念它代表了游戏世界的环境包括场景中的所有Actor、地形、光照、音效等。 UWorld* GetWorld() const;GetWorld()成员函数是许多类的接口的一部分尤其是那些与游戏世界直接交互的类。以下是一些常见的具有GetWorld()函数的类 AActor: 代表游戏世界中的可移动对象。UActorComponent: 代表附加到Actor上的组件它们通常需要访问游戏世界来进行各种操作。UGameInstance: 代表游戏会话的单例它可以访问当前的游戏世界。ULevel: 代表游戏世界中的一个关卡。APlayerController: 代表玩家控制器它可以访问游戏世界来控制玩家视角和输入。AGameModeBase: 代表游戏模式它定义了游戏的基本规则和流程。UUserWidget: 代表游戏中的用户界面元素它可能需要访问游戏世界来获取数据或执行操作。UFieldSystem: 代表场系统用于在游戏世界中模拟物理场。 然而并不是所有的类都有GetWorld()函数。 void ULaserScanner2D::ScanForObjects() {const FVector StartLocation StartRelativeLocation;for (int32 i 0; i 360; i Resolution){FRotator Rotation FRotator(0.0f, i, 0.0f);FVector EndLocation StartLocation Rotation.Vector() * FMath::Clamp(LaserMaxDistance, LaserMinDistance, LaserMaxDistance);FHitResult OutHit;FCollisionQueryParams Params;Params.AddIgnoredActor(GetOwner());if (GetWorld()-LineTraceSingleByChannel(OutHit, StartLocation, EndLocation, ECC_Visibility, Params)){DrawDebugLine(GetWorld(), StartLocation, OutHit.Location, FColor::Green, false, debugLineStayDuration);}else{DrawDebugLine(GetWorld(), StartLocation, EndLocation, FColor::Red, false, debugLineStayDuration);}} }2-5 编译与验证 点击VS2022的绿色透明小箭头编译代码 在内容处创建一个蓝图类Lidar(UE教程我们详细见过了这里快速通过) 为蓝图类添加LaserScanner2D组件 我们把新的Lidar蓝图类添加到常见中并为主场景添加一些基本的物体 我们可以在雷达类下修改一些基本的参数 运行可以看到我们的雷达成功完成目标 小结 本期我们通过自定义插件的方式实现了激光雷达的仿真下一期我们将讲述如何对雷达数据进行打包并转发给ubuntu的ROS2感谢大家对本教程的支持!如有错误欢迎指出!
http://www.hkea.cn/news/14449538/

相关文章:

  • 深一互联网站建设怎样用rp怎么做网站导航菜单
  • 台州英文网站建设广告企业网站源码
  • 网站界面友好机械加工网免费铺货
  • 徐州做网站的公司招聘免费企业邮箱注册怎么注册
  • 网站访问量 wordpressWordPress vidropro
  • 创意网站页面模板网站建设开发
  • 用商城系统做教育网站泰安中呼网站建设有限公司 概况
  • 百度网站排名全掉怎么使用微wordpress
  • 网站建设信息介绍庆阳市住房和城乡建设局网站
  • pycharm 做网站哪个好受欢迎的合肥网站建设
  • 网站建设的资源整合与系统设计徐州微网站开发
  • 做网站的没有进项票怎么办wordpress结婚模板
  • 苏州公司做变更网站如何开发游戏软件
  • 杭州网站建设制作公司wordpress主题 机械
  • 做汽车养护的网站途牛旅行网站建设策划书
  • 网络服务都有哪些上海优化外包公司
  • 新建网站的评估工业和信息化部产业发展促进中心
  • 东莞app制作公司seo营销排名
  • 对于高校类建设网站的要求做淘宝券网站
  • 大学什么专业做网站旅游网站国内外研究现状
  • 如何把代码放在网站首页教程牡丹江制作网站
  • 官方网站建设专家磐石网络广东seo站外推广折扣
  • 做网站销售有前景网络设计山西分公司
  • 建设工程检测预约网站网站建站公司订单多吗
  • 中关村网站建设的公司桂林亿星网络科技公司
  • 青岛正规网站建设哪家好怎么做租号网站
  • 吴中区建设局网站电子商务网站规划与建设试题
  • 高端网站改版请问门户网站是什么意思
  • 建设网站有什么原则网站模板如何制作
  • 鲜花网站设计网站地图制作工具