技术标签: GICI源码阅读 导航定位 GNSS Camera INS
- 原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning
- 欢迎关注我的公众号:NaviCode小工匠
作者的介绍:为了阐明 GNSS 的算法模型,加快在多源融合应用中针对 GNSS 的开发效率,我们开源了 GICI-LIB,并辅以详尽的文档和全面的数据集。GICI-LIB 以可扩展的设计理念,实现了GIC传感器之间多种形式的松紧组合。评估结果表明,GIC 系统能够在多种复杂环境下,提供分米到米级的高精度导航。
GICI-LIB 全称 GNSS/INS/Camera Integrated Navigation Library,是上海交大最新开源的一套基于图优化的 GNSS+INS+Camera 集成导航定位库。基于 RTKLIB 处理 I/O 流、编解码;基于 OKVIS 因子图优化类型封装;基于 SVO 做特征提取。以 GNSS 为主,再加入 INS、Camera 做组合,支持相当多的数据格式、定位模式,包含很多 GNSS 因子、惯导因子、视觉因子及运动约束。以处理实时数据为主,后处理也采用模拟实时数据处理的方式进行。典型的应用方式如下图:
支持非 ROS 模式和 ROS 模式,ROS 模式下可以使用 ROS 话题、RVIZ 显示轨迹。
支持多种数据形式:serial 串口、TCP/IP server、TCP/IP client、Ntrip server、Ntrip client、V4L2、file 文件。
支持多种数据编码:RTCM2、RTCM3、 Ublox raw、Septentrio raw、Tersus raw、NMEA、DCB file、ATX file、V4L2 image pack、GICI image pack、GICI IMU pack
支持多种数据传输方式:I/O 端口、串口、ROS topics、TCP/IP、NTRIP、V4L2、文件
支持多种定位模式:SPP、SDGNSS、DGNSS、RTK、PPP、SPP-based LC GINS、TC GINS、RTK-based LC GINS、SRR GVINS、RRR GVINS。
支持多种因子:
支持三个层级的 SSR 服务:
GICI 不支持时间系统偏差的估计,需要进行硬件层面的时间对准,且最好精度要达到 5ms。
GICI-LIB 主要使用 C++ 编写,且大量使用 C++ 高级语法,CMake 文件里规定以 C++11 的标准编译,采用多线程、面向对象程序设计方法,写法"很C++",想看懂源码需要有一定的 C++ 基础。C++11 语法的内容可以看下图:
具体来说,还有以下特点:
std::function
、std::bind
。用 cloc 统计 include、src、tools 文件夹代码量,结果如下:
语言 | 文件数 | 空行 | 注释行 | 代码行 |
---|---|---|---|---|
C++ | 110 | 3704 | 4547 | 26189 |
C/C++ Header | 104 | 2746 | 4841 | 8452 |
MATLAB | 16 | 111 | 232 | 666 |
C | 10 | 98 | 93 | 394 |
CMake | 9 | 71 | 36 | 262 |
YAML | 4 | 8 | 17 | 185 |
Gencat NLS | 13 | 0 | 0 | 94 |
XML | 2 | 8 | 0 | 56 |
总计 | 268 | 6746 | 9766 | 36298 |
src 和 tools 文件夹内各子文件夹功能信息如下表所示:
文件名 | 功能 | 代码行数 |
---|---|---|
estimate | 因子图优化相关类型、函数 | 2451 |
fusion | 多源融合导航相关:估计器、初始化器类型定义 | 2872 |
gnss | GNSS相关:误差改正、模糊度固定、SPP、PPP、RTK | 9347 |
imu | IMU相关:数值更新、误差改正 | 1725 |
stream | 数据流相关、Node处理相关类型定义 | 2829 |
utility | 全局变量、配置选项、信号处理函数、 Spin线程定义 | 1159 |
vision | 视觉相关:初始化、特征提取、处理、跟踪、相对位置计算 | 1900 |
conversions | 时间转换、坐标转换 | 175 |
edit_binary | 二进制数据处理、处理采样间隔 | 1137 |
evaluation | NMEA相关 | 1672 |
ros | ros 相关、话题消息发布、msg定义 | 2149 |
matlab_plot | MATLAB 画图脚本 | 666 |
GICI-LIB 的 manual 足足有 117 面,挺详细的,内容如下:
force initial global position
选项设置为 true,我们通过 initial global position
选项从配置文件中加载点坐标。摄像机状态之间没有相互联系,因为相应的参数是时变的。我们在图中保留了连接,以表示由于跟踪地标的切换,各次的估计参数会发生变化。
GICI-LIB 提供的多种传感器在不同定位模式下的很多因子,并封装了一个基类,为所有传感器提供基础的函数去操作变量因子和量测因子,具体可以看各种 xxx_estimator_base.h
,看算法的时候肯定重点要看这些文件。
git clone
下载不了,可以去git clone
后面的网站上手动下载。本文只介绍非 ROS 版。
我使用的环境是 VSCode + WSl,很多导航定位的开源软件都基于 Linux,比起虚拟机,VSCode + WSl 要流畅一些,不熟悉的推荐看这篇文章。
确保之前已经配置好 C++ 环境(g++、Cmake、VScode 插件)。
看别人的博客,都提到了曾经安装过 glog/gflag 会出问题:GICI-OPEN多源融合导航框架编译及问题说明
构建、编译的时候找不到库,可能是因为库装到
/usr/local/lib
里了,试试创建软链接到/usr/lib
ln -s /usr/local/lib/库名.a /usr/lib/库名.a
sudo apt-get install libeigen3-dev
文件下载
环境配置
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
进入 opencv 目录编译安装
cd opencv
mkdir build
cd build
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j8
sudo make install
将 OpenCV 的库添加到路径,从而可以让系统找到
sudo vim /etc/ld.so.conf.d/opencv.conf
在文件中加上并保存退出 /usr/local/lib
sudo ldconfig
配置 bash
sudo vim /etc/bash.bashrc
# 在打开的文件最末尾添加以下代码并保存退出
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
source /etc/bash.bashrc
执行 pkg-config --cflags opencv
如果报错,可以看博客
下载 glfg
git clone https://github.com/gflags/gflags
进入 glfg 目录编译安装
cd glfg
mkdir build
cd build/
cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DINSTALL_HEADERS=ON -DINSTALL_SHARED_LIBS=ON -DINSTALL_STATIC_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr/ ..
make
sudo make install
下载 glog
git clone https://github.com/google/glog
进入 glog 目录编译安装
cd glog
mkdir build
cd build
cmake -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/opt/glog ..
make
sudo make install
为使 glog 库生效,需要在 /etc/ld.so.conf.d
下新建配置文件并使其生效
cd /etc/ld.so.conf.d
sudo vim glog.conf
输入 /opt/glog/lib
sudo ldconfig
下载
git clone https://github.com/jbeder/yaml-cpp.git
进入 Yaml-cpp 目录编译安装
cd yaml-cpp
mkdir build
cd build
cmake -D BUILD_SHARED_LIBS=ON ..
make -j16
sudo make install
下载
git clone https://ceres-solver.googlesource.com/ceres-solver
进入 ceres-solver 目录编译安装
mkdir ceres-bin
cd ceres-bin
cmake ../ceres-solver-2.1.0
make -j3
make test
make install
下载
git clone https://github.com/chichengcn/gici-open
编译
在工程目录下打开终端,输入以下命令:
mkdir build
cd build
cmake ..
make -j4 # 编译需要一段时间
glog 即 Google Log ,是一个 Google 开源的日志库,它提供了一个轻量级的、可扩展的、跨平台的日志系统。 glog 的用法包括:
引入头文件:需要包含 glog 的头文件:
include <glog/logging.h>
初始化库:在开始使用 glog 之前, 初始化库,例如:
google::InitGoogleLogging(argv[0])
配置日志:可以通过配置文件或代码来配置 glog 的参数,例如:
google::SetLogDestination(LOG_TO_FILE, "/path/to/logfile.log")
输出日志:使用 LOG(level)
宏函数来输出日志。level
表示日志的严重程度,可以是以下几个级别之一:INFO
:一般信息、WARNING
:警告信息、ERROR
:错误信息、FATAL
:致命错误信息,输出后会终止程序。例如输出一般信息:
LOG(INFO) << "This is an informational message."
条件输出日志:使用 LOG_IF()
、LOG_EVERY_N()
和 LOG_FIRST_N()
宏函数来条件输出日志。例如:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"
关闭日志:在程序结束之前,关闭 glog:
google::ShutdownGoogleLogging()
在手册的 9~39 面,详细的介绍了配置文件的具体内容。GICI-LIB 采用 YAML 配置文件格式,下面先对 YMAL 做个简单介绍。
链接时找不到 yaml-cpp,可以参考博客:error while loading shared libraries的解决方案,在
/etc/ld.so.conf
文件中加上/usr/local/lib
YAML(YAML Ain’t Markup Language)是一种轻量级的数据序列化格式,可以用于配置文件、数据交换、API请求等多种场景。它是一种简单易用的数据序列化格式,使得数据可以以人类可读的方式进行存储和传输。YAML的语法非常简单,它使用缩进和符号来表示数据结构。以下是一些YAML的基本语法:
字符串:用引号括起来的文本,例如:“hello world”。
数字:没有引号的数字,例如:42。
布尔值:用 true 或 false 表示的真或假。
缩进:YAML使用缩进来表示嵌套关系,每个缩进级别用空格数表示。例如,下面的代码段表示一个包含两个列表的字典:
字典/对象/键值对:用短横线 -
或中括号[]
表示的键值对的集合。例如:{name: John, age: 30}
或- name: John age: 30
。多层对象可表示为:
key: {
key1: value1, key2: value2}
或者
key:
key1: value1
key2: value2
数组/列表:用短横线 -
或中括号 []
表示的值的列表。例如:[apple, banana, orange]
或 - apple - banana - orange
。复杂一点的如:
streamers:
- streamer:
tag: str_gnss_rov
output_tags: [fmt_gnss_rov]
type: file
path: <data-directory>/gnss_rover.bin
- streamer:
tag: str_gnss_ref
output_tags: [fmt_gnss_ref]
type: file
path: <data-directory>/gnss_reference.bin
引用:&
用来建立锚点,<<
表示合并到当前数据,*
用来引用锚点。
注释:在YAML中,使用 #
表示注释。
YAML 需要特别注意的几个点:
- 大小写敏感。
- 缩进不允许使用 tab,只允许空格。
- 缩进的空格数不重要,只要相同层级的元素左对齐即可。
YMAL 在 C++ 中以 Node 类表示。
LoadFile():从文件中加载 YAMl 到 C++ 中 Node 对象:
yaml_node = YAML::LoadFile(文件名);
[]:Node 对象可以理解为是树形的,用中括号可以取出里面的子数,创建一个新的 Node 对象:
YAML::Node logging_node = yaml_node["logging"];
safeGet():第一个参数为 Node,第二个参数为关键字,判断配置文件的 Node 里有没有你要的那个关键字,有的话再把对应的值作为第三个参数返回。
option_tools::safeGet(logging_node, "log_to_stderr", &FLAGS_logtostderr);
checkSubOption():第一个参数为 Node、第二个参数为子配置选项,检查参一中是否存在参二子配置选项,如果不存在有两种处理:
下面三个函数都是写了函数模板,然后重载写了很多的 :
配置文件以 数组 + 键值对 的方式组织,每一个键值对都是一个配置项,用多级数组来分模块组织配置项键值对。有三大模块:stream、estimate、logging,其中 stream 模块内还分为三个子模块 steamers、formators、replay。如下图:
option 文件夹里有一些配置文件,以伪实时定位解算为主,对应于下面的应用方式,图上每个模块都对应着咱们要配置的内容。
使用方式:
<data-directory>
、<gici-root-directory>
和 <output-directory>
分别换成你的数据文件夹路径
、gici-open 文件夹的路径
、和 输出文件夹路径
。start_time
,起始时间。streamer
写了两套,非 ROS 模式和 ROS 模式,想用哪套就把另一套注释掉。streamers
里一项项 streamer
的路径项 path
,确保数据文件夹中都有对应的数据。streamer
中路径设置在 option 文件夹中,程序会从 gici-open 文件夹的路径
找 option 文件夹,确保 option 文件夹和里面数据在对应位置,最好不要动 option 文件夹。xxx_solution.txt
文件可以直接用 rtkplot
打开查看结果。用matlab_plot
里的脚本应该也行。一定注意,配置文件中有好几处
<data-directory>
、<gici-root-directory>
、<output-directory>
、start_time
要改,不能漏,我在这卡了很久。没运行成功,仔细看看报错信息,INFO不用看,关注ERROR,看对应配置是否正确。
对 GitHub 上的介绍简单做个翻译
作者专为开发 GICI-LIB 而搭建的数据采集的平台如下图所示:
开发了一块 GICI 板,用于收集 IMU 和摄像头数据,并在整个平台中应用了与其他传感器同步的硬件。板载 IMU 和摄像头分别为博世 BMI088 和 Onsemi MT9V034。GNSS 接收器为 Tersus David30 多频接收器。我们还从千寻 SI 数据流中收集了参考站数据,用于 RTD 和 RTK ,并从国际 GNSS 服务(IGS)数据流中收集了状态空间表示(SSR)数据,用于 PPP。光纤 IMU 通过对其数据和 GNSS 原始数据进行后处理来提供参考值。
收集了两种数据集:不同场景的短期(几分钟)实验(1.1 ~ 4.3)和涵盖多个场景的长期(几十分钟)实验(5.1 ~ 5.2)。在短期实验中,我们将场景分为 4 类: 开阔天空、绿树成荫、典型城市和密集城市。对于每个场景,我们提供 2 ~ 3 条轨迹。在长期实验中,我们提供了在上海市中心收集到的涵盖这些场景的两个轨迹。
ID | Scene | Size | Date | Scene View |
---|---|---|---|---|
1.1 | Open-sky | 0.7 GB | 2023.03.20 | Images |
1.2 | Open-sky | 0.5 GB | 2023.03.27 | Images |
2.1 | Tree-lined | 1.4 GB | 2023.03.20 | Images |
2.2 | Tree-lined | 0.6 GB | 2023.03.27 | Images |
3.1 | Typical urban | 1.7 GB | 2023.03.27 | Images |
3.2 | Typical urban | 1.4 GB | 2023.03.27 | Images |
3.3 | Typical urban | 1.9 GB | 2023.03.27 | Images |
4.1 | Dense urban | 1.4 GB | 2023.05.21 | Images |
4.2 | Dense urban | 0.8 GB | 2023.03.27 | Images |
4.3 | Dense urban | 1.6 GB | 2023.03.27 | Images |
5.1 | Long-term | 8.2 GB | 2023.05.21 | Images |
5.2 | Long-term | 5.8 GB | 2023.05.21 | Images |
用对应数据的时候记得改时间
提供了各种 YAML 配置文件示例,在 <gici-root-directory>/option
。请记住替换所有 <path>
和 "start_time"
。通过命令来运行软件处理数据集:
./gici_main <gici-config-file>
要将实时输出流连接到 RTKLIB,应执行以下步骤:
我们提供了一个将 bin 文件转换为 rosbags 的工具,请参见 <gichi-root-directory>/tools/ros/gici_tools/src/gici_files_to_rosbag.cpp
。其配置文件位于 <gici-root-directory>/tools/ros/gici_tools/option/convert_rosbags.yaml
中。请记住替换所有 <path>
和 "start_time"
。
可以通过以下方式编译转换器:
cd \<gici-root-directory\>/tools/ros
catkin_make -DCMAKE_BUILD_TYPE=Release
然后可以通过以下方式运行转换器:
./devel/lib/gici_tools/gici_files_to_rosbag <config-file>
YAML 配置文件示例,请参见 <gichi-root-directory>/ros_wrapper/src/gici/option
。使用前要替换所有<path>
和 "start_time"
。在运行 ROS 可执行文件之前,请记得运行一个 roscore。然后,可以通过以下方式运行可执行文件:
rosrun gici_ros gici_ros_main <gici-config-file>
或者:
cd \<gici-root-directory\>/ros_wrapper
./devel/lib/gici_ros/gici_ros_main <gici-config-file>
之后,您可以通过以下方式播放从我们的 bin 文件转换而来的 rosbags
rosbag play <data1.bag> <data2.bag> <data3.bag> ...
为了实现可视化,您可以通过以下方式运行我们的 RVIZ 配置:
rviz -d \<gici-root-directory\>/ros_wrapper/src/gici/rviz/gici_gic.rviz
我们为每个数据集提供 ground_truth.txt。参考数据采用光纤 IMU 的框架。在比较结果之前,您应该进行坐标转换。对于包含 IMU 的估计器,GICI 以 IMU 框架输出解决方案。我们提供将参考值转换为 IMU 框架的工具。首先要编译这个工具:
cd \<gici-root-directory\>tools/evaluation/alignment
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8
cd \<gici-root-directory\>tools/evaluation/format_converters
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8
然后,您可以通过以下方法转换参考值:
\<gici-root-directory\>tools/evaluation/format_converters/build/ie_to_nmea ground_truth.txt
\<gici-root-directory\>tools/evaluation/alignment/build/nmea_pose_to_pose ground_truth.txt.nmea
nmea_pose_to_pose.cpp 中的默认设置是将姿势从光纤 IMU 帧转换为数据集的 IMU 帧。如果您有其他要求,应修改 nmea_pose_to_pose.cpp 中的参数。现在,您将获得以 NMEA 格式转换的参考值文件 ground_truth.txt.nmea.transformed。为了便于可视化,您可以通过以下方法将该文件转换为 TUM 格式
\<gici-root-directory\>tools/evaluation/format_converters/build/nmea_to_tum ground_truth.txt.nmea.transformed
还可以将 GICI NMEA 输出转换为 TUM 格式,然后用任何软件进行比较。
对于纯 GNSS 估计器,GICI 以 GNSS 天线框架输出解决方案。您应进一步将参考值转换为 GNSS 天线,方法是
\<gici-root-directory\>tools/evaluation/alignment/build/nmea_pose_to_position ground_truth.txt.nmea.transformed
现在您会得到一个参考值文件 ground_truth.txt.nmea.transformed.translated。然后就可以继续上面的操作了。
nd_truth.txt.nmea
nmea_pose_to_pose.cpp 中的默认设置是将姿势从光纤 IMU 帧转换为数据集的 IMU 帧。如果您有其他要求,应修改 nmea_pose_to_pose.cpp 中的参数。现在,您将获得以 NMEA 格式转换的参考值文件 ground_truth.txt.nmea.transformed。为了便于可视化,您可以通过以下方法将该文件转换为 TUM 格式
```bash
\<gici-root-directory\>tools/evaluation/format_converters/build/nmea_to_tum ground_truth.txt.nmea.transformed
还可以将 GICI NMEA 输出转换为 TUM 格式,然后用任何软件进行比较。
对于纯 GNSS 估计器,GICI 以 GNSS 天线框架输出解决方案。您应进一步将参考值转换为 GNSS 天线,方法是
\<gici-root-directory\>tools/evaluation/alignment/build/nmea_pose_to_position ground_truth.txt.nmea.transformed
现在您会得到一个参考值文件 ground_truth.txt.nmea.transformed.translated。然后就可以继续上面的操作了。
文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大
文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码
文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版
文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗
文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程
文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0
文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader
文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型
文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写
文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录
文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点
文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文