在已安装二进制movit2的情况下使用自编译moveit2
- 在已安装二进制movit2的情况下,想使用自编译moveit2,只要引入一下自编译moveit2库的环境变量即可。主要是想搞明白这个过程发生了什么,也就是引入环境后有什么变化,以及如何对编译过程产生影响
一、setup.bash流程
- 所有资料上都说setup.bash作用就是添加环境,其实就是将对应的地址添加到不同的环境变量当中了,这里主要想分析一下这个过程是如何实现的
- 主要 关注的环境变量是LD_LIBRARY_PATH、CMAKE_PREFIX_PATH、AMENT_PREFIX_PATH
1、运行source ./install/setup.bash效果
==========运行source ./install/setup.bash前==========
~/ws_moveit2$ echo $LD_LIBRARY_PATH
/usr/local/etherlab/lib:/opt/ros/humble/opt/rviz_ogre_vendor/lib:/opt/ros/humble/lib/x86_64-linux-gnu:/opt/ros/humble/lib~/ws_moveit2$ echo $CMAKE_PREFIX_PATH~/ws_moveit2$ echo $AMENT_PREFIX_PATH
/opt/ros/humble
- 运行后自己包中的所有lib文件就添加到LD_LIBRARY_PATH变量中,类似~/ws_moveit2/install/moveit_ros_planning_interface/lib的地址
- CMAKE_PREFIX_PATH和AMENT_PREFIX_PATH变量添加了很多类似~/ws_moveit2/install/moveit_ros_planning_interface的地址
2、./install/setup.bash文件分析
- 文件中用的是shell语言,跟命令行中用的一样。不过两个语法略有不同,属于不同的shell类型,大部分差不多
(1)定义_colcon_prefix_chain_bash_source_script()函数
_colcon_prefix_chain_bash_source_script() {if [ -f "$1" ]; thenif [ -n "$COLCON_TRACE" ]; thenecho "# . \"$1\""fi. "$1" elseecho "not found: \"$1\"" 1>&2fi
}
(2)加载基础ros环境
COLCON_CURRENT_PREFIX="/opt/ros/humble" #系统中ros的安装位置
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash" #运行对应的bash文件
- 每个工作空间都默认加载了基础的环境变量
(3)加载当前工作空间的环境
COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
- 这里比较复杂的就是第一行,测试一下就可以那段命令就是运行
builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd
结果就是返回了当前路径
~/ws_moveit2/install
- 具体语法解读
builtin cd : 使用内置命令cd
${BASH_SOURCE[0]} : 这个变量显示此脚本的位置包括文件名
dirname : 取出地址,即取出文件名
‘ ’ : 先执行反引号内部的命令
/dev/null : 把输出放入黑洞设备,也就是不输出
上面命令一起就是cd到当前,然后再用pwd输出即可传递给COLCON_CURRENT_PREFIX
(4)删除定义的变量和函数
unset COLCON_CURRENT_PREFIX
unset _colcon_prefix_chain_bash_source_script
- 删除定义的变量和函数
3、./install/local_setup.bash文件分析
(1)添加地址到环境变量
_colcon_prefix_bash_prepend_unique_value() {# arguments_listname="$1"_value="$2"# get values from variableeval _values=\"\$$_listname\"# backup the field separator_colcon_prefix_bash_prepend_unique_value_IFS="$IFS"IFS=":"# start with the new value_all_values="$_value"_contained_value=""# iterate over existing values in the variablefor _item in $_values; do# ignore empty stringsif [ -z "$_item" ]; thencontinuefi# ignore duplicates of _valueif [ "$_item" = "$_value" ]; then_contained_value=1continuefi# keep non-duplicate values_all_values="$_all_values:$_item"doneunset _itemif [ -z "$_contained_value" ]; thenif [ -n "$COLCON_TRACE" ]; thenif [ "$_all_values" = "$_value" ]; thenecho "export $_listname=$_value"elseecho "export $_listname=$_value:\$$_listname"fififiunset _contained_value# restore the field separatorIFS="$_colcon_prefix_bash_prepend_unique_value_IFS"unset _colcon_prefix_bash_prepend_unique_value_IFS# export the updated variableeval export $_listname=\"$_all_values\"unset _all_valuesunset _valuesunset _valueunset _listname
}
(2)添加前缀地址到COLCON_PREFIX_PATH
_colcon_prefix_bash_prepend_unique_value COLCON_PREFIX_PATH "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX"
unset _colcon_prefix_bash_prepend_unique_value
(3)检查python环境变量
if [ -n "$COLCON_PYTHON_EXECUTABLE" ]; thenif [ ! -f "$COLCON_PYTHON_EXECUTABLE" ]; thenecho "error: COLCON_PYTHON_EXECUTABLE '$COLCON_PYTHON_EXECUTABLE' doesn't exist"return 1fi_colcon_python_executable="$COLCON_PYTHON_EXECUTABLE"
else# try the Python executable known at configure time_colcon_python_executable="/usr/bin/python3"# if it doesn't exist try a fall backif [ ! -f "$_colcon_python_executable" ]; thenif ! /usr/bin/env python3 --version > /dev/null 2> /dev/null; thenecho "error: unable to find python3 executable"return 1fi_colcon_python_executable=`/usr/bin/env python3 -c "import sys; print(sys.executable)"`fi
fi
(4)加载另外的bash脚本,并根据COLCON_TRACE决定是否输出调试信息
- 下面这个代码不是原版,有一些调试信息
echo "==========================="
echo "2"
echo $1
echo "3"
echo $COLCON_TRACE
_colcon_prefix_sh_source_script() {if [ -f "$1" ]; thenif [ -n "$COLCON_TRACE" ]; thenecho "# . \"$1\""fiecho "source \"$1\"". "$1"elseecho "not found: \"$1\"" 1>&2fi
}echo "===========================1"
echo "${_colcon_ordered_commands}"
# get all commands in topological order
_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh bash)"echo "===========================1.5"
echo "${_colcon_ordered_commands}"unset _colcon_python_executable
if [ -n "$COLCON_TRACE" ]; thenecho "$(declare -f _colcon_prefix_sh_source_script)"echo "# Execute generated script:"echo "# <<<"echo "${_colcon_ordered_commands}"echo "# >>>"echo "unset _colcon_prefix_sh_source_script"
fi
echo "===========================2"
echo $AMENT_PREFIX_PATH
echo "===========================3"
echo "${_colcon_ordered_commands}"
eval "${_colcon_ordered_commands}"
unset _colcon_ordered_commandsunset _colcon_prefix_sh_source_scriptunset _colcon_prefix_bash_COLCON_CURRENT_PREFIX
echo "==========================="
echo $AMENT_PREFIX_PATH
- 下面这行运行了_local_setup_util_sh.py文件,生成了添加地址到指定环境变量的命令将其存到_colcon_ordered_commands
_colcon_ordered_commands="$($_colcon_python_executable "$_colcon_prefix_bash_COLCON_CURRENT_PREFIX/_local_setup_util_sh.py" sh bash)"
- 下面这步则是直接执行_colcon_ordered_commands
eval "${_colcon_ordered_commands}"
二、find_package流程
相关资料:
- https://blog.csdn.net/weixin_41652700/article/details/128914776?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522a7d6f436d89e18bbe78a29bb97f8df50%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=a7d6f436d89e18bbe78a29bb97f8df50&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-128914776-null-null.nonecase&utm_term=cmake&spm=1018.2226.3001.4450
- https://blog.csdn.net/m0_73640344/article/details/144246881
1、 find_package搜索地址
- find_package实际上是在找对应的.cmake文件,这些文件会生成对应的_DIR、_LIB、_INCLUDE环境变量名。我在写一个moveit相关代码时,cmakelist中有如下内容
find_package(moveit_ros_planning_interface REQUIRED)
- 这个搜索的地址是~/ws_moveit2/install/moveit_ros_planning_interface/share/moveit_ros_planning_interface/cmake
2、正常编译结果
message("==============find_package前=========")
message("moveit_ros_planning_interface_FOUND: ${moveit_ros_planning_interface_FOUND}")
message("moveit_ros_planning_interface_INCLUDE_DIRS: ${moveit_ros_planning_interface_INCLUDE_DIRS}")
message("moveit_ros_planning_interface_LIBRARIES: ${moveit_ros_planning_interface_LIBRARIES}")
message("moveit_ros_planning_interface_LIBRARY_DIRS: ${moveit_ros_planning_interface_LIBRARY_DIRS}")
message("moveit_ros_planning_interface_VERSION: ${moveit_ros_planning_interface_VERSION}")
message("moveit_ros_planning_interface_DIR: ${moveit_ros_planning_interface_DIR}")
find_package(moveit_ros_planning_interface REQUIRED)
message("==============find_package后=========")
message("moveit_ros_planning_interface_FOUND: ${moveit_ros_planning_interface_FOUND}")
message("moveit_ros_planning_interface_INCLUDE_DIRS: ${moveit_ros_planning_interface_INCLUDE_DIRS}")
message("moveit_ros_planning_interface_LIBRARIES: ${moveit_ros_planning_interface_LIBRARIES}")
message("moveit_ros_planning_interface_LIBRARY_DIRS: ${moveit_ros_planning_interface_LIBRARY_DIRS}")
message("moveit_ros_planning_interface_VERSION: ${moveit_ros_planning_interface_VERSION}")
message("moveit_ros_planning_interface_DIR: ${moveit_ros_planning_interface_DIR}")
- 在find_package前这些变量都不存在
- 没有引入手动编译moveit的工作空间的环境变量,所以在find_package后的环境变量都是在/opt/ros/humle中的,以下是其中的一部分
moveit_ros_planning_interface_FOUND: 1 #找到包
moveit_ros_planning_interface_INCLUDE_DIRS: /opt/ros/humble/include/geometry_msgs;/opt/ros/humble/include/moveit_msgs;/usr/include/bullet;/opt/ros/humble/include; #头文件地址
moveit_ros_planning_interface_LIBRARIES: /opt/ros/humble/lib/libbuiltin_interfaces__rosidl_generator_c.so;/opt/ros/humble/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.so; #库文件
moveit_ros_planning_interface_LIBRARY_DIRS: #空
moveit_ros_planning_interface_VERSION: 2.5.8 #版本
moveit_ros_planning_interface_DIR: /opt/ros/humble/share/moveit_ros_planning_interface/cmake #cmake地址
3、使用手动编译moveit2
- 关键就是添加set(moveit_ros_planning_interface_DIR “~/ws_moveit2/install/moveit_ros_planning_interface/share/moveit_ros_planning_interface/cmake”)
- 然后将缺失的so文件添加到LD_LIBRARY_PATH环境变量,这一步也可以用cmake中连接器的相关语法,根本原因在于虽然告诉用find_package告诉了编译器怎么编译(比如CMAKE_CURRENT_SOURCE_DIR等变量),但是和环境变量相关的连接过程还是没有变化,所以要手动添加环境或者在连接器上给出具体位置(最简单的还是直接source运行一下手动编译moveit的bash文件)
4、自写库使用find_package()
资料:
https://zhuanlan.zhihu.com/p/669872914
https://www.cnblogs.com/linxmouse/p/16778116.html
- find_packagge()有模块和配置两种模式。模块模式一般就是自己写的cmake文件,一般是Find<package_name>.cmake文件格式。配置模式就是第三方库官方提供的cmake文件,一般是<package_name>Config.cmake格式。
(1)自写库
- cpp文件、h头文件和CMakeList文件都跟一般代码一样,只是生成库文件。关键就是在cmake文件中添加一些变量。
src/MyLibrary.cpp
#include "MyLibrary.h"
#include <iostream>namespace MyLibrary {void printMessage() {std::cout << "Hello from MyLibrary!" << std::endl;}
}
include/MyLibrary.h
#ifndef MYLIBRARY_H
#define MYLIBRARY_Hnamespace MyLibrary {void printMessage();
}#endif // MYLIBRARY_H
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyLibrary VERSION 1.0)# 添加库
add_library(MyLibrary src/MyLibrary.cpp)# 包含头文件目录
target_include_directories(MyLibrary PUBLIC include)
cmake/FindMyLibrary.cmake
set(MyLibrary_FOUND true)
set(MyLibrary_INCLUDE_DIR /home/wangyuanhao/communication_with_thread/find_package_test/include/)
set(MyLibrary_LIBRARIES_DIR /home/wangyuanhao/communication_with_thread/find_package_test/build/)
(2)调用自写库
- find_package只是调用了cmake文件,只是会再一些特定路径下搜索,用include直接调用cmake即可。
src/main.cpp
#include <MyLibrary.h>int main() {MyLibrary::printMessage();return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyApp)# 查找 MyLibrary
set(CMAKE_MODULE_PATH /home/wangyuanhao/communication_with_thread/find_package_test/cmake) #将cmake路径添加到模块路径CMAKE_MODULE_PATH,这样find_package才能找到
message(CMAKE_MODULE_PATH:${CMAKE_MODULE_PATH})find_package(MyLibrary REQUIRED)
#include(/home/wangyuanhao/communication_with_thread/find_package_test/cmake/FindMyLibrary.cmake)#跟find_package效果一样message(MyLibrary_INCLUDE_DIR:${MyLibrary_INCLUDE_DIR})# 添加可执行文件
add_executable(MyApp src/main.cpp)# 链接 MyLibrary
target_link_libraries(MyApp PRIVATE /home/wangyuanhao/communication_with_thread/find_package_test/build/libMyLibrary.a)if (MyLibrary_INCLUDE_DIR)target_include_directories(MyApp PRIVATE ${MyLibrary_INCLUDE_DIR})
endif()
相关文章:
在已安装二进制movit2的情况下使用自编译moveit2
在已安装二进制movit2的情况下,想使用自编译moveit2,只要引入一下自编译moveit2库的环境变量即可。主要是想搞明白这个过程发生了什么,也就是引入环境后有什么变化,以及如何对编译过程产生影响 一、setup.bash流程 所有资料上都…...
React 常见面试题及答案
记录面试过程 常见问题,如有错误,欢迎批评指正 1. 什么是虚拟DOM?为什么它提高了性能? 虚拟DOM是React创建的一个轻量级JavaScript对象,表示真实DOM的结构。当状态变化时,React会生成新的虚拟DOM…...
2025-03-01 学习记录--C/C++-C语言 整数类型对比
C语言 整数类型对比 类型位数范围(有符号)范围(无符号)格式化符号char8-128 到 1270 到 255%c 或 %hhdshort16-32,768 到 32,7670 到 65,535%hdint32-2,147,483,648 到 2,147,483,6470 到 4,294,967,295%dlong32 或 64-2,147,483…...
金融赋能绍兴纺织 民生银行助力外贸中小微企业“走出去”
在浙江绍兴,纺织业作为一张熠熠生辉的产业名片,承载着深厚的历史底蕴与蓬勃的发展活力。这里依傍长三角经济圈,交通网络纵横交错,将原材料产地与广阔市场紧密相连;产业集群高度成熟,上下游产业链完备&#…...
TCP的三握四挥
TCP协议 TCP( Transmission control protocol )即传输控制协议,是一种面向连接、可靠的数据传输协议,它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 TCP的基本特点 面向连接:通信双方在进行数据传输之前&…...
Phpstudy中的MySQL无法正常启动或启动后自动暂停,以及sqlilab环境搭建出现的问题解决方法
【解决方法】 无法启动的原因是Phpstudy中的MySQL与本地的mysql重名,导致无法正常启动;所以这时我们就需要将本地的MySQL进行修改名称; 或者修改phpstudy中数据库的端口号,但是我觉得还是不是很好解决这种问题 最后一个方法&#…...
用C语言实现一个链表(四)
用C语言实现一个链表(四) 在上期内容中,我们探讨了实现一个双向循环链表的准备工作以及一些功能——创建新结点,初始化头结点,尾插数据,尾删数据,遍历的代码,上期内容留下了一个判断…...
【我的 PWN 学习手札】House of Kiwi
House of Kiwi 之前我们利用IO_FILE一般是通过劫持vtable来实现的, House of Kiwi虽然不是通过劫持vtable来实现,但实质上是劫持vtable指向的全局的_IO_file_jumps_表来实现的。注意:对于某些版本的glibc,_IO_file_jumps_并不可写…...
象棋笔记-实战记录
文章目录 实战没发现杀招2024-06-16 实战又漏杀了,尴尬,炮震五子,3路炮有下底的机会,本来是绝杀,没算明白,以为窝心马和象都能看住这个点。。。2024-07-06 实战有进炮串打的机会,又错过了&#…...
RabbitMQ系列(六)基本概念之Routing Key
在 RabbitMQ 中,Routing Key(路由键) 是用于将消息从交换机(Exchange)路由到指定队列(Queue)的关键参数。其核心作用是通过特定规则匹配绑定关系,确保消息被正确分发。以下是其核心机…...
企业微信里可以使用的企业内刊制作工具,FLBOOK
如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…...
JAVA笔记【一】
现实 (抽象) 类 (创建) 对象 特点: 1.面向对象 2.跨平台 3.安全性 4.多线程 java程序基本结构 1. java源代码文件实际是普通的文本文件,源代码文件必须是.java扩展名,且必须小写 2. …...
Mybatis做批量操作
前面我们将动态标签foreach的时候,做过批量操作,但是foreach只能处理记录数不多的批量操作,数据量大了后,先不说效率,能不能成功操作都是问题,所以这里讲一讲Mybatis正确的批量操作方法: 在获取…...
C/C++动静态库的制作与原理 -- 静态库,动态库,目标文件,ELF文件,动态链接,静态链接
目录 1. 什么是库 2. 静态库 2.1 静态库的制作 2.2 静态库的使用 3. 动态库 3.1 动态库的制作 3.2 动态库的使用 4. 目标文件 5. ELF文件 6. ELF从形成到加载轮廓 6.1 ELF形成可执行 7.2 ELF可执行文件加载 7. 理解链接和加载 7.1 静态链接 7.2 ELF加载与进程地…...
Java 并发编程之synchronized
一、前言 在并发编程中,多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。在JDK1.5之前,Java是依靠Synchronized关键字实现锁功能来做到这点的。Synchronized是JVM实现的一种内置锁,锁的获取和释放是由JVM隐式实…...
Windows 11【1001问】查看Windows 11 版本的18种方法
随着技术的飞速发展,操作系统作为连接硬件与软件的核心桥梁,其版本管理和更新变得尤为重要。对于用户而言,了解自己设备上运行的具体Windows 11版本不仅有助于优化系统性能,还能确保安全性和兼容性。然而,不同场景和需…...
python 元组tuple
元组:有序不可变列表 (相当于只读的list) 注意:元组里的普通元素不可以修改,但是元组里的list可以修改 index(元素) 查找某个元素,有的话返回下标,没有的话报错 count(元素) 统计某元素在元组中出现的次数 len(元组) 统计元组内的元素个数 #定义元组,元组支持嵌套 t1("…...
485 多路信号采集,校验干扰问题
在RS-485总线中同时采集多路信号时,若某一路出现CRC校验失败,通常由总线冲突、信号干扰或硬件设计缺陷引起。以下是具体影响分析和解决方案: 一、多路信号同时采集的影响 1. 总线冲突风险 现象:多路信号同时发送时,485总线(半双工)无法区分信号,导致数据叠加损坏。 后…...
【Eureka 缓存机制】
今天简单介绍一下Eureka server 的缓存机制吧✌️✌️✌️ 一、先来个小剧场:服务发现的"拖延症" 想象你是个外卖小哥(客户端),每次接单都要打电话问调度中心(Eureka Server):“现在…...
MySQL并发知识(面试高频)
mysql并发事务解决 不同隔离级别下,mysql解决并发事务的方式不同。主要由锁机制和MVCC(多版本并发控制)机制来解决并发事务问题。 1. mysql中的锁有哪些? 表级锁: 场景:表级锁适用于需要对整个表进行操作的情况,例如…...
Git GitHub基础
git是什么? Git是一个分布式版本控制系统,用于管理源代码的变更。它允许多个开发者在同一个项目上协作,同时跟踪每个修改的历史记录。 关键词: 分布式版本控制软件 软件 安装到我们电脑上的一个工具 版本控制 例如论文&…...
Rabbit MQ 高频面试题【刷题系列】
文章目录 一、公司生产环境用的什么消息中间件?二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?三、解耦、异步、削峰是什么?四、消息队列有什么缺点?五、RabbitMQ一般用在什么场景?六、简单说RabbitMQ有哪些角…...
Ubantu22.04系统docker部署Open WebUI+Ollama【教程】
Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和 OpenAI 兼容的 API,并内置了 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 1.docker拉取镜像 &#x…...
知识图谱科研文献推荐系统vue+django+Neo4j的知识图谱
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 📑 编号:D030 📑 vuedjangoneo4jmysql 前后端分离架构、图数据库 📑 文献知识图谱&#…...
我的世界开发模组的心得体会
最头疼的问题 本人也是小白,也就跟着ai学学怎么开发模组,不会的上网搜搜,但是目前最令我头疼的就是运行rundata和runcilent时的模块冲突,解决办法就是使用以下的build.gradle代码,不要接受人工智能的建议,…...
HTML:自闭合标签简单介绍
1. 什么是自结束标签? 定义:自结束标签(Self-closing Tag)是指 不需要单独结束标签 的 HTML 标签,它们通过自身的语法结构闭合。语法形式: 在 HTML5 中:直接写作 <tag>,例如 …...
Oracle性能调优(一):时间模型统计
Oracle性能调优(一):时间模型统计 时间模型统计视图时间模型统计指标时间模型统计视图 📖 DB Time的含义: DB Time表示前台会话在数据库调用中所花费的总时间,它是衡量数据库实例总负载的一个重要指标。DB Time是从实例启动时开始累计测量的,其计算方法是将所有前台会话…...
MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频
FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…...
【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField
在Android开发当中,BuildConfig是一个非常有用的功能,它允许我们在构建过程中定义常量,并在运行时使用它们。But!!当我们从传统的Groovy DSL迁移到Kotlin DSL时或者被Android Studio坑的时候,有一些细微的差…...
Linux网络 TCP全连接队列与tcpdump抓包
TCP全连接队列 在 Linux 网络中,TCP 全连接队列(也称为 Accept 队列)是一个重要的概念,用于管理已经完成三次握手,即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接,避免因…...
ChatGPT与DeepSeek:开源与闭源的AI模型之争
目录 一、模型架构与技术原理 二、性能能力与应用场景 三、用户体验与部署灵活性 四、成本与商业模式 五、未来展望与市场影响 六、总结 随着人工智能技术的飞速发展,ChatGPT和DeepSeek作为两大领先的AI语言模型,成为了行业内外关注的焦点。它们在…...
泛微Ecode新增Button调用服务器中的JSP页面里的方法
前言 前端Ecode调用 后端接口编写 JSP文件方法 总结 前言 因为我们是从之前E8版本升级到E9的,所以会有一些接口是通过jsp文件来实现前后端调用的,这里介绍的就是如果你有接口是写在jsp文件里面调用的,但是你又想在Ecode中调用的对应的接…...
知识图谱+智能问诊预诊系统vue+django+neo4j架构、带问诊历史
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 🤍编号:D032 🤍智能问答:智能问答自诊、预诊功能,同时可以保存问答历史 &…...
redis repl_backlog_first_byte_offset 这个字段的作用
repl_backlog_first_byte_offset 是 Redis 复制积压缓冲区(Replication Backlog)中的一个关键字段,其作用是 标识积压缓冲区中第一个字节对应的全局复制偏移量。 通俗解释 当主从节点断开重连时,Redis 需要通过复制积压缓冲区&am…...
第49天:Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity
#知识点 1、安全开发-JavaEE-开发框架-SpringBoot&路由&传参 2、安全开发-JavaEE-模版引擎-Thymeleaf&Freemarker&Velocity 一、开发框架-SpringBoot 参考:https://springdoc.cn/spring-boot/ 访问SpringBoot创建的网站 1、路由映射 RequestMapping…...
python数据容器切片
从一个序列中取出一个子序列 序列[起始位置:结束位置:步长] 起始位置和结束位置 省略,表示从头取到尾 步长省略表示1 步长负数,表示从后往前取 步长-1 等同于将序列反转了...
GCM模式在IPSec中的应用
本文详细介绍使用GCM模式加密的IPSec数据包的组成部分及验证方法。 关联RFC-4106 The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating Security Payload (ESP) GCM数据包格式:此处采用ESP封装(未加密)数据包。用于介绍数据包的详…...
Zynq移植canopen协议站canfestival+控制电机运动
一、 内容介绍 从零开始,在ZYNQ开发板上移植cnafestival,并最终控制电机运动。主要分别五部分 1. Vivado导出硬件XSA文件 2. 创建vitis工程,并移植Canfestival 3. 对象字典工具的安装及使用 4. 开发板通过SDO报文配置电机PDO参数 5. 开发板通…...
弱监督语义分割学习计划(2)-使用CoT进行Open Vocabulary Label简单实现类激活图
零: 项目说明 是这样的一个事情,经过与deepseek的一番讨论和交流,DeepSeek为我设计了一个30天高强度学习计划,重点聚焦弱监督/无监督语义分割在野外场景的应用,结合理论与实践,并最终导向可落地的开源项目。目前开始了…...
TCP/IP 5层协议簇:网络层(IP数据包的格式、路由器原理)
目录 1. TCP/IP 5层协议簇 2. IP 三层包头协议 3. 路由器原理 4. 交换机和路由的对比 1. TCP/IP 5层协议簇 如下: 2. IP 三层包头协议 数据包如下:IP包头不是固定的,每一个数字是一个bit 其中数据部分是上层的内容,IP包头最…...
ISP 常见流程
1.sensor输出:一般为raw-OBpedestal。加pedestal避免减OB出现负值,同时保证信号超过ADC最小电压阈值,使信号落在ADC正常工作范围。 2. pedestal correction:移除sensor加的基底,确保后续处理信号起点正确。 3. Linea…...
Mybatis调用存储过程
在mysql数据库中创建一个存储过程: DELIMITER $$ CREATEPROCEDURE mybatisdemo1.pgetallusers(IN sid INT,IN eid INT)BEGINSELECT * FROM sb_users WHERE id>sid AND id<eid;END$$ DELIMITER ;在Mapper接口里创建方法,和普通的查询数据方法没区别…...
uniapp 系统学习,从入门到实战(六)—— 样式与布局
全篇大概 4700 字(含代码),建议阅读时间 30min 📚 目录 Flex 布局在 UniApp 中的应用响应式设计与适配多端使用 SCSS 提升样式开发效率实战案例演示总结 1. Flex 布局在 UniApp 中的应用 1.1 基础布局实现 通过 display: flex 快速构建弹性容器&#…...
微服务学习(1):RabbitMQ的安装与简单应用
目录 RabbitMQ是什么 为什么要使用RabbitMQ RabbitMQ的安装 RabbitMQ架构及其对应概念 队列的主要作用 交换机的主要作用 RabbitMQ的应用 通过控制面板操作(实现收发消息) RabbitMQ是什么 RabbitMQ是一个开源的消息队列软件(消息代理…...
【Spring】Spring AOP原理
目录 前言 代理模式 静态代理 优缺点 动态代理 JDK动态代理 工作原理 JDK动态原理实现关键步骤 CGLib动态代理 CGLIB动态代理实现关键步骤 总结 前言 在上一篇中,我们讲解了什么是AOP,以及Spring AOP是如何使用的,那么本篇我们就…...
CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南20250302
CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南 引言 在 Linux 服务器操作系统领域,CentOS 和 Ubuntu 是广泛采用的发行版。它们在命令集、默认工具链及生态系统方面各有特点。本文深入剖析 CentOS 与 Ubuntu 在常用命令层面的异同,并结合实践案例…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter27-工作者线程
二十七、工作者线程 工作者线程 前端开发者常说:“JavaScript 是单线程的。”这种说法虽然有些简单,但描述了 JavaScript 在浏览器中的一般行为。因此,作为帮助 Web 开发人员理解 JavaScript 的教学工具,它非常有用。单线程就意味…...
微信小程序 - 页面跳转(wx.navigateTo、wx.redirectTo、wx.switchTab、wx.reLaunch)
API 跳转 1、wx.navigateTo (1)基本介绍 功能:保留当前页面,跳转到应用内的某个页面,使用该方法跳转后可以通过返回按钮返回到原页面 使用场景:适用于需要保留当前页面状态,后续还需返回的情…...
vscode使用豆包MARSCode----集成doubao1.5 DeepSeekR1 DeepseekV3模型的ai编程插件
引入扩展 打开VSCode扩展窗口,在搜索窗口搜索MarsCode,找到MarsCode 插件单击「install」,完成安装,登录即可使用MarsCode 编程助手。 主要功能 主要快捷键 / explain 解释项目代码,AI 返回的内容有结构分类&#…...
C 语言共用体:深入理解与实践】
目录 一、引言 二、共用体的定义和基本语法 三、共用体的使用 3.1 声明共用体变量 3.2 给共用体成员赋值 3.3 共用体的内存布局 四、共用体的应用场景 4.1 节省内存空间 4.2 处理不同类型的数据 五、共用体使用的注意事项 六、总结 一、引言 在 C 语言中,共…...