Airsim 项目结构分析
Airsim 项目结构分析
本文只分析最核心的 AirLib 项目结构,以及其与 Unreal 项目的关系
假如已经根据 Airsim 主页,克隆了完整项目。
Build on Linux - AirSim
克隆源码
# go to the folder where you clone GitHub projects
git clone https://github.com/Microsoft/AirSim.git
cd AirSim
这步没有完整下载资源,还需要
./setup.sh
setup.sh 会下载一些依赖的第三方项目。
完整下载源码后,开始编译。build.sh 会自动检查依赖,设置编译环境,创建目录,编译项目。
./build.sh
分析 setup.sh 和 build.sh 两个脚本,对于理解项目结构是重要的。按照执行顺序,只关注 Ubuntu 系统(20以上)相关的部分,查看两个脚本完成了哪些任务。
先看 setup.sh,一开始安装了一些依赖
sudo apt-get update
sudo apt-get -y install --no-install-recommends \lsb-release \rsync \software-properties-common \wget \libvulkan1 \vulkan-utils# install clang and build tools
sudo apt-get install -y clang-8 clang++-8 libc++-8-dev libc++abi-8-dev# Install additional tools, CMake if required
sudo apt-get install -y build-essential
sudo apt-get install -y unzip=6.0-25ubuntu1.1
然后,检查和升级 cmake 版本,官方对 cmake 版本有要求。
Installing cmake on Linux - AirSim
if ! which cmake; then# CMake not installedcmake_ver=0
elsecmake_ver=$(cmake --version 2>&1 | head -n1 | cut -d ' ' -f3 | awk '{print $NF}')
fiif version_less_than_equal_to "$cmake_ver" "$MIN_CMAKE_VERSION"; then# Build CMake 3.10.2 from sourceif [[ ! -d "cmake_build/bin" ]]; thenecho "Downloading cmake..."wget https://cmake.org/files/v3.10/cmake-3.10.2.tar.gz \-O cmake.tar.gztar -xzf cmake.tar.gzrm cmake.tar.gzrm -rf ./cmake_buildmv ./cmake-3.10.2 ./cmake_buildpushd cmake_build./bootstrapmakepopdfi
elseecho "Already have good version of cmake: $cmake_ver"
fi
设置串口权限,Linux 新电脑使用 USB 外设需要(比如 PX4 连接遥控器进行硬件在环仿真)。
# give user perms to access USB port - this is not needed if not using PX4 HIL
if [[ -n "${whoami}" ]]; then #this happens when running in travissudo /usr/sbin/useradd -G dialout "$USER"sudo usermod -a -G dialout "$USER"
fi
然后是下载依赖的第三方库和虚幻资源。
-
rpclib-远程调用库(核心)
Airsim 使用 RPC 服务器,将虚幻仿真过程中的无人机位姿、点云和图像传输到其他进程。用户可以使用 Python,C++ 编写程序,用 API 获取数据,实现控制和 ROS 转发。
https://github.com/rpclib/rpclib
下载 2.3.0 版本,然后解压到 AirSim/external/rpclib,供之后 AirLib 编译链接。
# Download rpclib if [ ! -d "external/rpclib/rpclib-2.3.0" ]; thenecho "*********************************************************************************************"echo "Downloading rpclib..."echo "*********************************************************************************************"wget https://github.com/rpclib/rpclib/archive/v2.3.0.zip# remove previous versionsrm -rf "external/rpclib"mkdir -p "external/rpclib"unzip -q v2.3.0.zip -d external/rpclibrm v2.3.0.zip fi
-
虚幻资源
下载车辆模型后,存放在 AirSim/Unreal/Plugins/AirSim/Content/VehicleAdv。这个资源只会在编译 UE 项目时使用。
# Download high-polycount SUV model if $downloadHighPolySuv; thenif [ ! -d "Unreal/Plugins/AirSim/Content/VehicleAdv" ]; thenmkdir -p "Unreal/Plugins/AirSim/Content/VehicleAdv"fiif [ ! -d "Unreal/Plugins/AirSim/Content/VehicleAdv/SUV/v1.2.0" ]; thenecho "*********************************************************************************************"echo "Downloading high-poly car assets.... The download is ~37MB and can take some time."echo "To install without this assets, re-run setup.sh with the argument --no-full-poly-car"echo "*********************************************************************************************"if [ -d "suv_download_tmp" ]; thenrm -rf "suv_download_tmp"fimkdir -p "suv_download_tmp"cd suv_download_tmpwget https://github.com/Microsoft/AirSim/releases/download/v1.2.0/car_assets.zipif [ -d "../Unreal/Plugins/AirSim/Content/VehicleAdv/SUV" ]; thenrm -rf "../Unreal/Plugins/AirSim/Content/VehicleAdv/SUV"fiunzip -q car_assets.zip -d ../Unreal/Plugins/AirSim/Content/VehicleAdvcd ..rm -rf "suv_download_tmp"fi elseecho "### Not downloading high-poly car asset (--no-full-poly-car). The default unreal vehicle will be used." fi
-
eigen3-数学运算库(核心)
下载 3.3.7 版本,存放在 AirLib/deps/eigen3。这是一个很常用的库,全是头文件,使用时直接 include 包含即可。
if [ ! -d "AirLib/deps/eigen3" ]; thenecho "Downloading Eigen..."wget -O eigen3.zip https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.zipunzip -q eigen3.zip -d temp_eigenmkdir -p AirLib/deps/eigen3mv temp_eigen/eigen*/Eigen AirLib/deps/eigen3rm -rf temp_eigenrm eigen3.zip elseecho "Eigen is already installed." fi
以上是 setup.sh 的主要内容, rpclib 和 eigen3 都是 AirLib 编译依赖,十分重要。另外 AirLib 还依赖仓库自带的 MavLink 通信库(PX4 无人机仿真需要),存放在 AirSim/MavLinkCom,除此以外,Airsim 主目录下其他文件都不是 AirLib 编译必需。
再来看 build.sh。默认编译 release 版本,使用编译工具如下:
debug=false
gcc=false
# Parse command line arguments
while [[ $# -gt 0 ]]
dokey="$1"case $key in--debug)debug=trueshift # past argument;;--gcc)gcc=trueshift # past argument;;esacdoneif $gcc; thenexport CC="gcc-8"export CXX="g++-8"
elseexport CC="clang-8"export CXX="clang++-8"
fi
构建和编译
# variable for build output
if $debug; thenbuild_dir=build_debug
elsebuild_dir=build_release
fi pushd $build_dir >/dev/null
if $debug; thenfolder_name="Debug""$CMAKE" ../cmake -DCMAKE_BUILD_TYPE=Debug $CMAKE_VARS \|| (popd && rm -r $build_dir && exit 1)
elsefolder_name="Release""$CMAKE" ../cmake -DCMAKE_BUILD_TYPE=Release $CMAKE_VARS \|| (popd && rm -r $build_dir && exit 1)
fi
popd >/dev/nullpushd $build_dir >/dev/null
# final linking of the binaries can fail due to a missing libc++abi library
# (happens on Fedora, see https://bugzilla.redhat.com/show_bug.cgi?id=1332306).
# So we only build the libraries here for now
make -j"$(nproc)"
popd >/dev/null
构建成功后,生成文件默认位置在 build_release,如果构建失败自动删除该文件夹。之后启动 make 多线程编译。注意,$CMAKE 是前面设置的 cmake 可执行文件所在目录,总的 CMakeLists.txt 在 AirSim/cmake,内容如下:
cmake_minimum_required(VERSION 3.5.0)
project(AirSim)add_subdirectory("rpclib_wrapper")
add_subdirectory("AirLib")
add_subdirectory("MavLinkCom")
add_subdirectory("AirLibUnitTests")
add_subdirectory("HelloDrone")
add_subdirectory("HelloSpawnedDrones")
add_subdirectory("HelloCar")
add_subdirectory("DroneShell")
add_subdirectory("DroneServer")
其中,前三个比较重要,是核心组件。可以查看子项目的 CMakeLists.txt 文件,例如 AirLib/cmake/AirLib/CMakeLists.txt
cmake_minimum_required(VERSION 3.5.0)
project(AirLib)LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../cmake-modules")
INCLUDE("${CMAKE_CURRENT_LIST_DIR}/../cmake-modules/CommonSetup.cmake")
CommonSetup()IncludeEigen()include_directories(${AIRSIM_ROOT}/AirLib/${AIRSIM_ROOT}/AirLib/include${AIRSIM_ROOT}/MavLinkCom/include${RPC_LIB_INCLUDES}
)file(GLOB_RECURSE ${PROJECT_NAME}_sources ${AIRSIM_ROOT}/${PROJECT_NAME}/src/api/*.cpp${AIRSIM_ROOT}/${PROJECT_NAME}/src/common/common_utils/*.cpp${AIRSIM_ROOT}/${PROJECT_NAME}/src/safety/*.cpp${AIRSIM_ROOT}/${PROJECT_NAME}/src/vehicles/car/api/*.cpp${AIRSIM_ROOT}/${PROJECT_NAME}/src/vehicles/multirotor/*.cpp${AIRSIM_ROOT}/${PROJECT_NAME}/src/vehicles/multirotor/api/*.cpp
)add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_sources})CommonTargetLink()
target_link_libraries(${PROJECT_NAME} ${RPC_LIB})
target_link_libraries(${PROJECT_NAME} MavLinkCom)#string(SUBSTRING ${CMAKE_STATIC_LINKER_FLAGS} 9 -1 "BUILD_PLATFORM")
#find_package(Threads REQUIRED)
#target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})
#target_link_libraries(${PROJECT_NAME} AirLib)
#target_link_libraries(${PROJECT_NAME} MavLinkCom)
#target_link_libraries(${PROJECT_NAME} ../AirLib/deps/rpclib/lib/${BUILD_PLATFORM}/$(Configuration)/rpc)
回到 build.sh 脚本,因为最终目的是将编译好的 AirLib 静态库 libAirLib.a 提供给 UE 项目使用。所以之后的命令都是在重新组织文件结构。
mkdir -p AirLib/lib/x64/$folder_name
mkdir -p AirLib/deps/rpclib/lib
mkdir -p AirLib/deps/MavLinkCom/lib
cp $build_dir/output/lib/libAirLib.a AirLib/lib
cp $build_dir/output/lib/libMavLinkCom.a AirLib/deps/MavLinkCom/lib
cp $build_dir/output/lib/librpc.a AirLib/deps/rpclib/lib/librpc.a# Update AirLib/lib, AirLib/deps, Plugins folders with new binaries
rsync -a --delete $build_dir/output/lib/ AirLib/lib/x64/$folder_name
rsync -a --delete external/rpclib/$RPC_VERSION_FOLDER/include AirLib/deps/rpclib
rsync -a --delete MavLinkCom/include AirLib/deps/MavLinkCom
rsync -a --delete AirLib Unreal/Plugins/AirSim/Source
rm -rf Unreal/Plugins/AirSim/Source/AirLib/src# Update all environment projects
for d in Unreal/Environments/* ; do[ -L "${d%/}" ] && continue$d/clean.shmkdir -p $d/Pluginsrsync -a --delete Unreal/Plugins/AirSim $d/Plugins
done
-
将编译生成的静态库都拷贝到 AirLib 目录下,其中
libAirLib.a
拷贝到AirSim/AirLib/lib
libMavLinkCom.a
拷贝到AirSim/AirLib/deps/MavLinkCom/lib
librpc.a
拷贝到AirSim/AirLib/deps/rpclib/lib/librpc.a
再将所有库的头文件也拷贝到 AirLib 文件夹中。
-
将 AirLib 文件夹整个都拷贝到
AirSim/Unreal/Plugins/AirSim/Source
中,删除其中 src(已经不需要源码了)。--archive
选项,表示以归档模式进行同步。这会递归地复制目录并保持文件的所有属性(如权限、时间戳、符号链接等)。--delete
:删除目标目录中源目录中没有的文件。就是说,如果源目录中删除了某些文件,目标目录中对应的文件也会被删除。 -
再同步更新
AirSim/Unreal/Environments/Plugins
中 AirSim 的对应内容。
需要单独说明的是
-
AirLib 与
AirSim/Unreal
下两个文件夹的关系是:- AirLib 都是一些基类,如传感器接口,四旋翼动力学与运动学模型,rpc 服务器等基础功能。所以 AirLib 是不依赖虚幻和其他引擎的。
AirSim/Unreal/Plugins
继承 AirLib 中的基类,通过C++编程,结合虚幻蓝图,实现了具体的功能,在虚幻引擎中使用。AirSim/Unreal/Environments
是完整的虚幻项目,通过加载AirSim/Unreal/Plugins
目录,使用插件中的功能。
-
注意
AirSim/Unreal/Plugins
中除了 AirLib,还有很多具体实现的源码。
相关文章:
Airsim 项目结构分析
Airsim 项目结构分析 本文只分析最核心的 AirLib 项目结构,以及其与 Unreal 项目的关系 假如已经根据 Airsim 主页,克隆了完整项目。 Build on Linux - AirSim 克隆源码 # go to the folder where you clone GitHub projects git clone https://git…...
STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态
STM32W5500以太网应用开发003_TCP服务器添加OLED(u8g2)显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…...
SQLmap 注入-03 获得用户信息
1: Sqlmap 先进入库,然后进入table, 然后列出column: sqlmap -u "http://192.168.56.133/mutillidae/index.php?pageuser-info.php&usernamexiaosheng&passwordabc&user-info-php-submit-buttonViewAccountDetails" --batch -p username -D …...
Kafka 和 MQ 的区别
1.概述 1.1.MQ简介 消息中间件,其实准确的叫法应该叫消息队列(message queue),简称MQ。其本质上是个队列,有FIFO的性质,即first in first out,先入先出。 目前市场上主流的MQ有三款ÿ…...
若依报错:无法访问com.ruoyi.common.annotation
无法访问com.ruoyi.common.annotation 若依的父工程的pom文件中设置了jdk为1.8,将idea的jdk也改为1.8即可。...
MCU、MPU、SOC、ECU、CPU、GPU的区别到底是什么
MCU、MPU、SOC、ECU、CPU、GPU的区别 参数MCUMPUSoCECUCPUGPU处理能力低至中中至高综合,视具体设计而定专用于汽车控制中至高高(并行能力强)集成度高低高高低(需配合主板使用)低(通常作为外部设备ÿ…...
档案事业与数据要素之间有什么关系?
在数字时代背景下,档案事业正经历着前所未有的变革。随着大数据、云计算、人工智能等技术的快速发展,档案数据已成为重要的基础性战略资源和关键生产要素。那么档案事业与数据要素之间究竟有什么关系? 一、档案数据要素的内涵与价值 数据要…...
HarmonyOS NEXT:华为分享-碰一碰开发分享
随着科技的不断进步,智能手机和智能设备之间的互联互通变得越来越重要。华为作为科技行业的领军企业,一直致力于为用户提供更加便捷、高效的使用体验。HarmonyOS NEXT系统的推出,特别是其中的“碰一碰”功能,为用户带来了前所未有…...
nuxt3项目打包部署到服务器后配置端口号和开启https
nuxt3打包后的项目部署相对于一般vite打包的静态文件部署要稍微麻烦一些,还有一个主要的问题是开发环境配置的.env环境变量在打包后部署时获取不到,具体的解决方案可以参考我之前文章 nuxt3项目打包后获取.env设置的环境变量无效的解决办法。 这里使用的…...
面试:Hadoop,块,HDFS的优缺点,HDFS的读写流程
Hadoop CDH会简化Hadoop的安装 Hue主要用于数据分析和处理,而CM(Cloudera Manager)则主要用于集群的管理和运维。 HDFS HDFS的块 块是 HDFS 系统当中的最小存储单位, 在hadoop2.0和3.0中默认128MB 在HDFS上的文件会被拆分成多个块,每个块作为独立的单…...
Codeforces Round 903 (Div. 3) E. Block Sequence
题解: 想到从后向前DP f[i] 表示从 i ~ n 转化为“美观”所需要的最少的步骤 第一种转移方式:直接删除掉第i个元素,那么就是上一步 f[i 1] 加上 1;第二种转移方式:从第 i a[i] 1 个元素直接转移,不需要增加步数&a…...
web-view环境下,H5页面打开其他小程序
在Web-view环境下,H5页面无法直接打开其他小程序。正确的实现方式是先从H5页面跳转回当前小程序,再由当前小程序跳转到目标小程序。具体实现方法如下: H5页面跳转回小程序时,调用wx.miniProgram.navigateTo()方法。 小程序跳转到…...
C语言之饭店外卖信息管理系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之饭店外卖信息管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验…...
【三维分割】Gaga:通过3D感知的 Memory Bank 分组任意高斯
文章目录 摘要一、引言二、主要方法2.1 3D-aware Memory Bank2.2 三维分割的渲染与下游应用 三、实验消融实验应用: Scene Manipulation 地址:https://www.gaga.gallery 标题:Gaga: Group Any Gaussians via 3D-aware Memory Bank 来源:加利福…...
【Linux系统】—— 编译器 gcc/g++ 的使用
【Linux系统】—— 编译器 gcc/g 的使用 1 用 gcc 直接编译2 翻译环境2.1 预处理(进行宏替换)2.2 编译(生成汇编)2.3 汇编(生成机器可识别代码)2.4 链接2.5 记忆小技巧2.6 编译方式2.7 几个问题2.7.1 如何理…...
读西瓜书的数学准备
1,高等数学:会求偏导数就行 2,线性代数:会矩阵运算就行 参考:线性代数--矩阵基本计算(加减乘法)_矩阵运算-CSDN博客 3,概率论与数理统计:知道啥是随机变量就行...
【数据结构篇】顺序表 超详细
目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口: 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…...
Flink把kafa数据写入Doris的N种方法及对比。
用Flink+Doris来开发实时数仓,首要解决是如何接入kafka实时流,下面是参考Doris官方文档和代码,在自己项目开发的实践中总结,包括一些容易踩坑的细节。 目录 Routine Load方法 接入kafka实时数据 踩坑的问题细节 Flink Doris Connector方法 完整示例 Routine Load方法…...
leetcode刷题记录(七十八)——105. 从前序与中序遍历序列构造二叉树
(一)问题描述 105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)105. 从前序与中序遍历序列构造二叉树 - 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一…...
imread和jpeg_read在MATLAB中处理图像时的不同
目录 1.功能差异 2.输出格式 3.颜色空间 4.处理阶段 5.用途 6.性能 1.功能差异 imread:这个函数用于读取各种格式的图像文件(包括JPEG、PNG、BMP等)并将其转换为MATLAB中的矩阵。它适用于读取图像并直接在空间域中进行处理。jpeg_read…...
P9069 [Ynoi Easy Round 2022] 堕天作战 TEST_98 Solution
Description 给定长为 n n n 的序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作,分以下两种: modify ( l , r , k ) \operatorname{modify}(l,r,k) modify(l,r,k):对于所有…...
SCPI命令笔记
1. 读取设备信息 *IDN? 2. 复位仪器 *RST 3. 清除设备的状态寄存器和事件队列 *CLS 4. 读取设备数据(发一个指令,读取一次) READ? 5. 读取设备电压(功能和第4条命令达到一样的效果) MEAS:VOLT? 6. 读取设备电流 (功能和第4条命令达到一样的效果) MEAS:CURR? 7.…...
TCP创建通信前的三次握手(为啥不是两次?)
1.三次握手的过程 客户端发送 SYN(同步)报文 客户端向服务器发送 SYN 标志的数据包,请求建立连接,表示 "你好,我要连接你"。 服务器回复 SYNACK(同步确认)报文 服务器收到 SYN 后&am…...
2024.ailx10的年终总结
已经工作7年啦,今年网络安全行业愈发寒冷,几乎所有友商都在做安全GPT,说实话,AI确实颠覆了传统的网络安全运营,以前需要安服处置告警,以后可能就不需要了,大家日子都不好过,越是简单…...
洛谷P8837
[传智杯 #3 决赛] 商店 - 洛谷 代码区: #include<stdio.h> #include<stdlib.h> int cmp(const void*a,const void *b){return *(int*)b-*(int*)a; } int main(){int n,m;scanf("%d%d",&n,&m);int w[n];int c[m];for(int i0;i<n;…...
【Day23 LeetCode】贪心算法题
一、贪心算法 贪心没有套路,只有碰运气(bushi),举反例看看是否可行,(运气好)刚好贪心策略的局部最优就是全局最优。 1、分发饼干 455 思路:按照孩子的胃口从小到大的顺序依次满足…...
以太网详解(五)GMII、RGMII、SGMII 接口时序约束(Quartus 平台)
文章目录 接口时序Avalon Streaming 接口时序Receive TimingTransmit Timing GMII 接口时序Receive TimingTransmit Timing RGMII 接口时序Receive TimingTransmit Timing 如何创建 .sdc 约束文件三速以太网系统时钟信号创建 set_input_delay,set_output_delay 约束…...
Java中的错误与异常详解
Java中的错误与异常详解 Java提供了一种机制来捕获和处理程序中的异常和错误。异常和错误都继承自 Throwable 类,但它们有着不同的用途和处理方式。 1. Error(错误) Error 是程序无法处理的严重问题,通常由 JVM(Java…...
使用 HTML 开发 Portal 页全解析
前言 在当今数字化时代,网站作为企业和个人展示信息、提供服务的重要窗口,其重要性不言而喻。而 Portal 页,作为网站的核心页面之一,承担着引导用户、整合信息等关键任务。那么,如何使用 HTML 开发一个功能齐全、界面…...
高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计
三、CentralCache(中心缓存)_内存设计 (一)Span的创建 // 页编号类型,32位下是4byte类型,64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…...
Js:DOM中的样式(包含行内样式、滚动样式、可见区域样式等)
这部分还在更新 1、 获取行内样式:元素.style.样式名称 2、 获取当前正在显示的样式(只能读,不能修改,想要修改要使用style): ① 只有ie支持:元素.currentStyle.样式名称 ② 其他浏览器&…...
【leetcode 26】28.找出字符串中第一个匹配项的下标 | 实现 strStr()==❗不会❗==
在一个串中查找是否出现过另一个串,这是KMP的看家本领。 // 方法一 class Solution {public void getNext(int[] next, String s){int j -1;next[0] j;for (int i 1; i < s.length(); i){while(j > 0 && s.charAt(i) ! s.charAt(j1)){jnext[j];}if…...
Unity自学之旅04
Unity自学之旅04 Unity自学之旅④📝 跳跃🐯 攻击🦄 GUIGUI前置,显示收集物品数量和角色HpUGUI游戏暂停和重新开始 🤗 总结归纳 Unity自学之旅④ 📝 跳跃 public class PlayerBehaviorRigid : MonoBehavio…...
Unreal Engine 5 C++ Advanced Action RPG 十章笔记
第十章 Survival Game Mode 2-Game Mode Test Map 设置游戏规则进行游戏玩法 生成敌人玩家是否死亡敌人死亡是否需要刷出更多 肯定:难度增加否定:玩家胜利 流程 新的游戏模式类游戏状态新的数据表来指定总共有多少波敌人生成逻辑UI告诉当前玩家的敌人波数 3-Survival Game M…...
[Unity 热更方案] 使用Addressable进行打包管理, 使用AssetBundle进行包的加载管理.70%跟练
在正常的开发过程中我们经常遇到一些关于热更的方案,有一些已有的方案供我们选择,但是实机情况往往不尽如人意,各有优缺点. 现在我们同样有一个热更的需求,但是要求打包简单,加载过程可查,防止出现一些资源和流程的问题. 下面介绍我在项目中使用的方案. 打包方面使用Addressabl…...
人工智能领域单词:英文解释
目录 1、前言2、单词组1:15个3、单词组2:15个4、单词组3:15个5、单词组4:15个6、单词组5:15个 1、前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦࿰…...
工业网口相机:如何通过调整网口参数设置,优化图像传输和网络性能,达到最大帧率
项目场景 工业相机是常用与工业视觉领域的常用专业视觉核心部件,拥有多种属性,是机器视觉系统中的核心部件,具有不可替代的重要功能。 工业相机已经被广泛应用于工业生产线在线检测、智能交通,机器视觉,科研,军事科学,航天航空等众多领域 …...
NextJs - ServerAction获取文件并处理Excel
NextJs - ServerAction获取文件并处理Excel 一. 客户端二. ServerAction 处理 一. 客户端 use client; import { uploadExcel } from actions/batchInquirySystem/api; import type { UploadProps } from antd; import { Upload } from antd;/*** 创建问询内容*/ const Page …...
【深度学习项目】语义分割-FCN网络(原理、网络架构、基于Pytorch实现FCN网络)
文章目录 介绍深度学习语义分割的关键特点主要架构和技术数据集和评价指标总结 FCN网络FCN 的特点FCN 的工作原理FCN 的变体和发展FCN 的网络结构FCN 的实现(基于Pytorch)1. 环境配置2. 文件结构3. 预训练权重下载地址4. 数据集,本例程使用的…...
集群、分布式及微服务间的区别与联系
目录 单体架构介绍集群和分布式架构集群和分布式集群和分布式区别和联系 微服务架构的引入微服务带来的挑战 总结 单体架构介绍 早期很多创业公司或者传统企业会把业务的所有功能实现都打包在一个项目中,这种方式就称为单体架构 以我们都很熟悉的电商系统为例&…...
ConvBERT:通过基于跨度的动态卷积改进BERT
摘要 像BERT及其变体这样的预训练语言模型最近在各种自然语言理解任务中取得了令人印象深刻的性能。然而,BERT严重依赖于全局自注意力机制,因此存在较大的内存占用和计算成本。尽管所有的注意力头都从全局角度查询整个输入序列以生成注意力图࿰…...
C# 网络协议第三方库Protobuf的使用
为什么要使用二进制数据 通常我们写一个简单的网络通讯软件可能使用的最多的是字符串类型,比较简单,例如发送格式为(head)19|Msg:Heart|100,x,y,z…,在接收端会解析收到的socket数据。 这样通常是完全可行的,但是随着数据量变大&…...
「2024 博客之星」自研Java框架 Sunrays-Framework 使用教程
文章目录 0.序言我的成长历程遇到挫折,陷入低谷重拾信心,迎接未来开源与分享我为何如此看重这次评选最后的心声 1.概述1.主要功能2.相关链接 2.系统要求构建工具框架和语言数据库与缓存消息队列与对象存储 3.快速入门0.配置Maven中央仓库1.打开settings.…...
【Elasticsearch】Springboot编写Elasticsearch的RestAPI
RestAPI 初始化RestClient创建索引库Mapping映射 判断索引库是否存在删除索引库总结 ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。 官方文档地址 由于ES目前最新版本是8.8,提供了全…...
Swift语言的学习路线
Swift语言的学习路线 引言 在现代程序开发中,Swift语言逐渐成为了移动应用程序开发的重要工具,尤其是在iOS和macOS平台上。自2014年发布以来,Swift以其易读性和强大的功能,受到越来越多开发者的青睐。对于初学者而言,…...
63,【3】buuctf web Upload-Labs-Linux 1
进入靶场 点击pass1 查看提示 既然是上传文件,先构造一句话木马,便于用蚁剑连接 <?php eval($_POST[123])?> 将这两处的检查函数删掉 再上传木马 文件后缀写为.php 右键复制图片地址 打开蚁剑连接 先点击测试连接,显示成功后&…...
Leetcode:2239
1,题目 2,思路 循环遍历满足条件就记录,最后返回结果值 3,代码 public class Leetcode2239 {public static void main(String[] args) {System.out.println(new Solution2239().findClosestNumber(new int[]{-4, -2, 1, 4, 8})…...
自然语言处理与NLTK环境配置
自然语言处理(Natural Language Processing, NLP)是人工智能的重要分支,专注于计算机如何理解、分析和生成自然语言。自然语言是人类用于交流的语言,如中文、英文等,这使得自然语言处理成为沟通人与计算机的桥梁。近年来,NLP在诸多领域得到广泛应用,包括文本分析、语言翻…...
分布式搜索引擎02
1. DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1. DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,…...
使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
在开发 Spring Boot 项目时,日志是调试和监控的重要工具。Spring Boot 默认支持 Logback 作为日志系统,并提供了 logback.xml 和 logback-spring.xml 两种配置方式。这篇文章将详细介绍这两者的区别、各自的优缺点以及最佳实践。 目录 一、什么是 Logbac…...