【ROS2】☆ launch之Python
☆重点
ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch,而ROS2保留了XML 格式launch,还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好,但是ROS2官方推荐使用Python方式编写,理由如下:Python 是一种脚本语言,使用灵活,Python库强大,可以直接引入:ROS2launch框架本身是用Python编写,由于亲和力高Python可以直接调用一些高级特性 ,而XML 和 YAML 可能无法调用。
当然用 Python 编写的启动文件可能比 XML 或 YAML 编写的启动文件更复杂、更冗长。
☆不过建议能使用Python编写尽量使用Python,不要问为什么,问就是官方推荐!
在使用Python版的launch文件时,涉及的API众多,为了提高编码效率,可以在VScode中设置launch文件的代码模板,将VScode的配置文件python.json修改为为如下内容:
"ros2 launch py": {"prefix": "ros2_launch_py","body": ["from launch import LaunchDescription","from launch_ros.actions import Node","# 封装终端指令相关类--------------","# from launch.actions import ExecuteProcess","# from launch.substitutions import FindExecutable","# 参数声明与获取-----------------","# from launch.actions import DeclareLaunchArgument","# from launch.substitutions import LaunchConfiguration","# 文件包含相关-------------------","# from launch.actions import IncludeLaunchDescription","# from launch.launch_description_sources import PythonLaunchDescriptionSource","# 分组相关----------------------","# from launch_ros.actions import PushRosNamespace","# from launch.actions import GroupAction","# 事件相关----------------------","# from launch.event_handlers import OnProcessStart, OnProcessExit","# from launch.actions import ExecuteProcess, RegisterEventHandler,LogInfo","# 获取功能包下share目录路径-------","# from ament_index_python.packages import get_package_share_directory","","def generate_launch_description():"," ", " return LaunchDescription([])"],"description": "ros2 launch"}
一、节点设置
launch 中需要执行的节点被封装为了 launch_ros.actions.Node 对象。
示例:新建 py01_node.launch.py 文件,输入如下内容:
from launch import LaunchDescription
from launch_ros.actions import Node
import os
from ament_index_python.packages import get_package_share_directorydef generate_launch_description():turtle1 = Node(package="turtlesim", executable="turtlesim_node", namespace="ns_1",name="t1", exec_name="turtle_label", # 表示流程的标签respawn=True)turtle2 = Node(package="turtlesim", executable="turtlesim_node", name="t2",# 参数设置方式1# parameters=[{"background_r": 0,"background_g": 0,"background_b": 0}],# 参数设置方式2: 从 yaml 文件加载参数,yaml 文件所属目录需要在配置文件中安装。parameters=[os.path.join(get_package_share_directory("cpp01_launch"),"config","t2.yaml")],)turtle3 = Node(package="turtlesim", executable="turtlesim_node", name="t3", remappings=[("/turtle1/cmd_vel","/cmd_vel")] #话题重映射)rviz = Node(package="rviz2",executable="rviz2",# 节点启动时传参arguments=["-d", os.path.join(get_package_share_directory("cpp01_launch"),"config","my.rviz")])turtle4 = Node(package="turtlesim", executable="turtlesim_node",# 节点启动时传参,相当于 arguments 传参时添加前缀 --ros-args ros_arguments=["--remap", "__ns:=/t4_ns", "--remap", "__node:=t4"])return LaunchDescription([turtle1, turtle2, turtle3, rviz, turtle4])
代码解释
1.1 Node使用语法1
turtle1 = Node(package="turtlesim", executable="turtlesim_node", namespace="group_1", name="t1", exec_name="turtle_label", # 表示流程的标签respawn=True)
上述代码会创建一个 turtlesim_node 节点,设置了若干节点属性,并且节点关闭后会自动重启。
- package:功能包;
- executable:可执行文件;
- namespace:命名空间;
- name:节点名称;
- exe_name:流程标签;
- respawn:设置为True时,关闭节点后,可以自动重启。
1.2 Node使用语法2
turtle2 = Node(package="turtlesim", executable="turtlesim_node", name="t2",# 参数设置方式1# parameters=[{"background_r": 0,"background_g": 0,"background_b": 0}],# 参数设置方式2: 从 yaml 文件加载参数,yaml 文件所属目录需要在配置文件中安装。parameters=[os.path.join(get_package_share_directory("cpp01_launch"),"config","t2.yaml")],)
上述代码会创建一个 turtlesim_node 节点,并导入背景色相关参数。
- parameters:导入参数。
parameter 用于设置被导入的参数,如果是从 yaml 文件加载参数,那么需要先准备 yaml 文件,在功能包下新建 config 目录,config目录下新建 t2.yaml 文件,并输入如下内容:
/t2:ros__parameters:background_b: 0background_g: 0background_r: 50qos_overrides:/parameter_events:publisher:depth: 1000durability: volatilehistory: keep_lastreliability: reliableuse_sim_time: false
注意,还需要在 CMakeLists.txt 中安装 config:
install(DIRECTORY launchconfigDESTINATION share/${PROJECT_NAME})
1.3 Node使用语法3
turtle3 = Node(package="turtlesim", executable="turtlesim_node", name="t3", remappings=[("/turtle1/cmd_vel","/cmd_vel")] #话题重映射)
上述代码会创建一个 turtlesim_node 节点,并将话题名称从 /turtle1/cmd_vel 重映射到 /cmd_vel。
- remappings:话题重映射。
1.4 Node使用语法4
rviz = Node(package="rviz2",executable="rviz2",# 节点启动时传参arguments=["-d", os.path.join(get_package_share_directory("cpp01_launch"),"config","my.rviz")])
上述代码会创建一个 rviz2 节点,并加载了 rviz2 相关的配置文件。
该配置文件可以先启动 rviz2 ,配置完毕后,保存到 config 目录并命名为 my.rviz。
- arguments:调用指令时的参数列表。
1.5 Node使用语法5
turtle4 = Node(package="turtlesim", executable="turtlesim_node",# 节点启动时传参,相当于 arguments 传参时添加前缀 --ros-args ros_arguments=["--remap", "__ns:=/t4_ns", "--remap", "__node:=t4"])
上述代码会创建一个 turtlesim_node 节点,并在指令调用时传入参数列表。
- ros_arguments:相当于 arguments 前缀 --ros-args。
二、执行指令
launch 中需要执行的命令被封装为了 launch.actions.ExecuteProcess 对象。
示例:新建 py02_cmd.launch.py 文件,输入如下内容:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess
from launch.substitutions import FindExecutabledef generate_launch_description():turtle = Node(package="turtlesim", executable="turtlesim_node")spawn = ExecuteProcess(# cmd=["ros2 service call /spawn turtlesim/srv/Spawn \"{x: 8.0, y: 9.0,theta: 0.0, name: 'turtle2'}\""],# 或cmd = [FindExecutable(name = "ros2"), # 不可以有空格" service call"," /spawn turtlesim/srv/Spawn"," \"{x: 8.0, y: 9.0,theta: 1.0, name: 'turtle2'}\""],output="both",shell=True)return LaunchDescription([turtle,spawn])
代码解释
spawn = ExecuteProcess(# cmd=["ros2 service call /spawn turtlesim/srv/Spawn \"{x: 8.0, y: 9.0,theta: 0.0, name: 'turtle2'}\""],# 或cmd = [FindExecutable(name = "ros2"), # 不可以有空格" service call"," /spawn turtlesim/srv/Spawn"," \"{x: 8.0, y: 9.0,theta: 1.0, name: 'turtle2'}\""],output="both",shell=True)
上述代码用于执行 cmd 参数中的命令,该命令会在 turtlesim_node 中生成一只新的小乌龟。
- cmd:被执行的命令;
- output:设置为 both 时,日志会被输出到日志文件和终端,默认为 log,日志只输出到日志文件。
- shell:如果为 True,则以 shell 的方式执行命令。
三、参数设置
参数设置主要涉及到参数的声明与调用两部分,其中声明被封装为 launch.actions.DeclareLaunchArgument,调用则被封装为 launch.substitutions import LaunchConfiguration。
需求:启动turtlesim_node节点时,可以动态设置背景色。
示例:新建 py03_args.launch.py 文件,输入如下内容:
from pkg_resources import declare_namespace
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfigurationdef generate_launch_description():decl_bg_r = DeclareLaunchArgument(name="background_r",default_value="255")decl_bg_g = DeclareLaunchArgument(name="background_g",default_value="255")decl_bg_b = DeclareLaunchArgument(name="background_b",default_value="255")turtle = Node(package="turtlesim", executable="turtlesim_node",parameters=[{"background_r": LaunchConfiguration("background_r"), "background_g": LaunchConfiguration("background_g"), "background_b": LaunchConfiguration("background_b")}])return LaunchDescription([decl_bg_r,decl_bg_g,decl_bg_b,turtle])
代码解释
decl_bg_r = DeclareLaunchArgument(name="background_r",default_value="255")
decl_bg_g = DeclareLaunchArgument(name="background_g",default_value="255")
decl_bg_b = DeclareLaunchArgument(name="background_b",default_value="255")
上述代码会使用DeclareLaunchArgument对象声明三个参数,且每个参数都有参数名称以及默认值。
- name:参数名称;
- default_value:默认值。
parameters=[{"background_r": LaunchConfiguration(variable_name="background_r"), "background_g": LaunchConfiguration("background_g"), "background_b": LaunchConfiguration("background_b")}]
上述代码会使用LaunchConfiguration对象获取参数值。
- variable_name:被解析的参数名称。
launch文件执行时,可以动态传入参数,示例如下:
ros2 launch cpp01_launch py03_args.launch.py background_r:=200 background_g:=80 background_b:=30
如果执行launch文件时不手动传入参数,那么解析到的参数值是声明时设置的默认值。
四、文件包含
在 launch 文件中可以包含其他launch文件,需要使用的API为:launch.actions.IncludeLaunchDescription 和 launch.launch_description_sources.PythonLaunchDescriptionSource。
需求:新建 launch 文件,包含 4.2.3 中的 launch 文件并为之传入设置背景色相关的参数。
示例:新建 py04_include.launch.py 文件,输入如下内容:
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSourceimport os
from ament_index_python import get_package_share_directorydef generate_launch_description():include_launch = IncludeLaunchDescription(launch_description_source= PythonLaunchDescriptionSource(launch_file_path=os.path.join(get_package_share_directory("cpp01_launch"),"launch/py","py03_args.launch.py")),launch_arguments={"background_r": "200","background_g": "100","background_b": "70",}.items())return LaunchDescription([include_launch])
代码解释
include_launch = IncludeLaunchDescription(launch_description_source= PythonLaunchDescriptionSource(launch_file_path=os.path.join(get_package_share_directory("cpp01_launch"),"launch/py","py03_args.launch.py")),launch_arguments={"background_r": "200","background_g": "100","background_b": "70",}.items())
上述代码将包含一个launch文件并为launch文件传参。
在 IncludeLaunchDescription 对象中:
- launch_description_source:用于设置被包含的 launch 文件;
- launch_arguments:元组列表,每个元组中都包含参数的键和值。
在 PythonLaunchDescriptionSource 对象中:
- launch_file_path:被包含的 launch 文件路径。
五、分组设置
在 launch 文件中,为了方便管理可以对节点分组,分组相关API为:launch.actions.GroupAction和launch_ros.actions.PushRosNamespace。
需求:对 launch 文件中的多个 Node 进行分组。
示例:新建 py05_group.launch.py 文件,输入如下内容:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch_ros.actions import PushRosNamespace
from launch.actions import GroupActiondef generate_launch_description():turtle1 = Node(package="turtlesim",executable="turtlesim_node",name="t1")turtle2 = Node(package="turtlesim",executable="turtlesim_node",name="t2")turtle3 = Node(package="turtlesim",executable="turtlesim_node",name="t3")g1 = GroupAction(actions=[PushRosNamespace(namespace="g1"),turtle1, turtle2])g2 = GroupAction(actions=[PushRosNamespace(namespace="g2"),turtle3])return LaunchDescription([g1,g2])
代码解释
g1 = GroupAction(actions=[PushRosNamespace(namespace="g1"),turtle1, turtle2])
g2 = GroupAction(actions=[PushRosNamespace(namespace="g2"),turtle3])
上述代码将创建两个组,两个组使用了不同的命名空间,每个组下包含了不同的节点。
在 GroupAction 对象中,使用的参数为:
- actions:action列表,比如被包含到组内的命名空间、节点等。
在 PushRosNamespace 对象中,使用的参数为:
- namespace:当前组使用的命名空间。
六、添加事件
节点在运行过程中会触发不同的事件,当事件触发时可以为之注册一定的处理逻辑。事件使用相关的 API 为:launch.actions.RegisterEventHandler、launch.event_handlers.OnProcessStart、launch.event_handlers.OnProcessExit。
需求:为 turtlesim_node 节点添加事件,事件1:节点启动时调用spawn服务生成新乌龟;事件2:节点关闭时,输出日志信息。
示例:新建 py06_event.launch.py 文件,输入如下内容:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess, RegisterEventHandler,LogInfo
from launch.substitutions import FindExecutable
from launch.event_handlers import OnProcessStart, OnProcessExit
def generate_launch_description():turtle = Node(package="turtlesim", executable="turtlesim_node")spawn = ExecuteProcess(cmd = [FindExecutable(name = "ros2"), # 不可以有空格" service call"," /spawn turtlesim/srv/Spawn"," \"{x: 8.0, y: 1.0,theta: 1.0, name: 'turtle2'}\""],output="both",shell=True)start_event = RegisterEventHandler(event_handler=OnProcessStart(target_action = turtle,on_start = spawn))exit_event = RegisterEventHandler(event_handler=OnProcessExit(target_action = turtle,on_exit = [LogInfo(msg = "turtlesim_node退出!")]))return LaunchDescription([turtle,start_event,exit_event])
代码解释
start_event = RegisterEventHandler(event_handler=OnProcessStart(target_action = turtle,on_start = spawn))
exit_event = RegisterEventHandler(event_handler=OnProcessExit(target_action = turtle,on_exit = [LogInfo(msg = "turtlesim_node退出!")]))
上述代码为 turtle 节点注册启动事件和退出事件,当 turtle 节点启动后会执行 spwn 节点,当 turtle 节点退出时,会输出日志文本:“turtlesim_node退出!”。
对象 RegisterEventHandler 负责注册事件,其参数为:
- event_handler:注册的事件对象。
OnProcessStart 是启动事件对象,其参数为:
- target_action:被注册事件的目标对象;
- on_start:事件触发时的执行逻辑。
OnProcessExit 是退出事件对象,其参数为:
- target_action:被注册事件的目标对象;
- on_exit:事件触发时的执行逻辑。
LogInfo 是日志输出对象,其参数为:
- msg:被输出的日志信息。
相关文章:
【ROS2】☆ launch之Python
☆重点 ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch,而ROS2保留了XML 格式launch,还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好,但是ROS2官方推荐使用Python方式编写…...
unity rb.velocity和transform.position
rb.velocity和transform.position是用来控制物体位置的两种方式,前者通常用来控制人物的移动,它们的主要区别和适用场景如下 一,rb.velocity(控制刚体的速度) 它可以直接控制物体的速度,而不是物体的位置…...
景芯SOC设计实战
终身辅导、一对一辅导,手把手教您完成SoC全流程设计,从入门到进阶,带您掌握SoC芯片架构、算法、设计、验证、DFT、后端及低功耗全流程!直播视频不定期升级!让您快速超越同龄人! 景芯团队主打文档服务器实战…...
【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)
目录 ./real.exe错误1:ERROR while reading namelist physics./wrf.exe错误1:FATAL CALLED FROM FILE: <stdin> LINE: 2419 Warning: too many input landuse types参考./real.exe 错误1:ERROR while reading namelist physics 执行./real.exe时,报错如下: taski…...
Mysql快速列出来所有列信息
文章目录 需求描述实现思路1、如何查表信息2、如何取字段描述信息3、如何将列信息一行展示4、拼接最终结果 需求描述 如何将MySQL数据库中指定表【tb_order】的所有字段都展示出来,以备注中的中文名为列名。 实现思路 最终展示效果,即拼接出可执行执行…...
spring boot发送邮箱,java实现邮箱发送(邮件带附件)3中方式【保姆级教程一,代码直接用】
文章目录 Java发送邮箱的方式1. 基于 Javax.mail 实现关于附件上传的方法 2. 基于 org.apache.commons.mail 实现常见报错 3. 基于 spring-boot-starter-mail 实现(推荐) 实际开发时需要实现邮件发送,本文章实现如何从零实现邮件发送。也就是…...
数据集-目标检测系列- 电话 测数据集 call_phone >> DataBall
数据集-目标检测系列- 电话 测数据集 call DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! …...
Zstandard压缩算法
简介 Zstandard(缩写为zstd)是一种开源的无损数据压缩算法,主要设计目标是提供高比率的压缩和快速的解压缩速度。它由Yann Collet开发,并于2015年首次发布。 特点 高比率的压缩(通常比gzip更好)。快速的解压缩速度(通常比gzip更快)。支持流式解压缩。可以选择不同的压…...
npm i 报错
nodejs中 使用npm install命令时报错 npm err! file C: \user\admin\package.json_package.json 里缺少 description 和 repository 两个n字段。-CSDN博客...
【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)
目录 1.轮转数组 2.除自身以外数组的乘积 3.矩阵置零 4.螺旋矩阵 5.旋转图像 1.轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 class Solution { public:void rotate(vector<int>& nums, int k) …...
EFCore HasDefaultValueSql
今天小伙伴在代码中遇到了有关 HasDefaultValue 的疑问,这里整理澄清下... 在使用 Entity Framework Core (EFCore) 配置实体时,HasDefaultValue 方法会为数据库列设置一个默认值。该默认值的行为取决于以下条件: 1. 配置 HasDefaultValue 的…...
【数据结构】栈
目录 1.1 什么是栈 1.2 顺序栈 1.2.1 特性 1.3 链式栈 1.3.1 特性 总结: 1.1 什么是栈 栈是只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。 特点:栈是先进后出FILO…...
C++初阶—CC++内存管理
第一章:C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(si…...
【机器视觉】OpenCV 图像基本变换
文章目录 介绍机器视觉的核心组成部分机器视觉的关键技术和趋势 4. 图像的基本变换4.1 图像的放大与缩小4.2 图像的翻转4.3 图像的旋转4.4 仿射变换之图像平移4.5 仿射变换之获取变换矩阵4.6 透视变换 介绍 机器视觉(Machine Vision)是一门跨学科的领域…...
【数据库】四、数据库管理与维护
文章目录 四、数据库管理与维护1 安全性管理2 事务概述3 并发控制4 备份与恢复管理 四、数据库管理与维护 1 安全性管理 安全性管理是指保护数据库,以避免非法用户进行窃取数据、篡改数据、删除数据和破坏数据库结构等操作 三个级别认证: 服务器级别…...
徐克版射雕唤醒热血武侠魂,共赴新春侠义之约
2025年大年初一,由徐克执导的古装武侠电影《射雕英雄传:侠之大者》将在影院拉开帷幕,在精彩纷呈的春节档电影中,“大IP”“大导演”“大场面”等标签让这部电影自定档起便备受关注,其精良的制作和传统中国武侠风的设定…...
设计模式(观察者模式)
设计模式(观察者模式) 第三章 设计模式之观察者模式 观察者模式介绍 观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候…...
能量函数和能量守恒
在之前的文章1中讨论了与循环坐标相对应的动量守恒定律和动量矩守恒定律,本文将由拉格朗日方程中导出能量函数,进一步讨论能量守恒定律,并给出耗散系统的处理方法,这其中用到的一个关键数学定理是欧拉定理(描述如何将一…...
【pycharm发现找不到python打包工具,且无法下载】
发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …...
使用 Maxwell 计算母线的电动势
三相短路事件的动力学 三相短路事件在电气系统中至关重要,因为三相之间的意外连接会导致电流大幅激增。如果管理不当,这些事件可能会造成损坏,因为它们会对电气元件(尤其是母线)产生极大的力和热效应。 短路时&#x…...
【Python】Python之Selenium基础教程+实战demo:提升你的测试+测试数据构造的效率!
这里写目录标题 什么是Selenium?Selenium基础用法详解环境搭建编写第一个Selenium脚本解析脚本常用的元素定位方法常用的WebDriver方法等待机制 Selenium高级技巧详解页面元素操作处理弹窗和警告框截图和日志记录多窗口和多标签页操作 一个实战的小demo步骤一&#…...
Ubuntu中批量重命名,rename
你可以使用下面的命令批量重命名这些文件,在文件名中插入 _1: 方式一 使用 mv 命令批量重命名 如果你已经在终端中,且当前目录包含这些文件,可以执行以下命令: mv ai.c ai_1.c mv ai.h ai_1.h mv ao.c ao_1.c mv a…...
LINUX 下 NODE 安装与配置
一、官网地址: (中文网)https://nodejs.cn/ (英文网)https://nodejs.org/en/ 二、下载安装包 2.1、下载地址:下载 | Node.js 中文网 https://nodejs.cn/download/ 2.2、使用 wget 命令下载到linux 服务器…...
Vue3 el-tree-v2渲染慢的问题
一、现象 使用el-tree-v2处理组织架构权限时,整个树的数据在8500条,勾选数据8200条,打开页面需要8~10秒,用户无法接受。 经调试,发现主要卡在树的渲染回显上(勾选数据少时,很快,勾选…...
【redis初阶】浅谈分布式系统
目录 一、常见概念 1.1 基本概念 2.2 评价指标(Metric) 二、架构演进 2.1 单机架构 2.2 应用数据分离架构 2.3 应用服务集群架构 2.4 读写分离/主从分离架构 2.5 引入缓存 ⸺ 冷热分离架构 2.6 数据库分库分表 2.7 业务拆分 ⸺ 引入微服务 redis学习&…...
模式识别与机器学习 | 十一章 概率图模型基础
隐马尔科夫模型(Hidden Markov Model,HMM) HMM是建模序列数据的图模型 1、第一个状态节点对应一个初始状态概率分布 2、状态转移矩阵A, 3、发射矩阵概率B 4、对特定的(x,y)的联合概率可以表示为 α递归计算——前向算法β递归…...
Linux基本指令(1)
一、ls指令 功能:对于目录,显示这个目录下的目录名以及文件名;对于文件,显示文件名 后面可接命令行选项配合使用,接选项时ls与选项以及选项与选项之间要有一个空格; 这里先学习了两个选项:-l…...
逐“绿”前行 企业综合能源管控低碳转型如何推进?
引言: 在“双碳”战略指引下,中国低碳节能各项工作有序推进,逐步建立起碳达峰碳中和“1N”的政策体系,重点领域、重点行业及各地区的碳达峰实施方案相继出台。能源对于促进经济社会发展、增进人民福祉至关重要。近年来࿰…...
springboot和vue配置https请求
项目场景: 代码发布到线上使用https请求需要配置ssl证书,前后端都需要修改。 问题描述 如图,我们在调用接口时报如下错误,这就是未配置ssl但是用https请求产生的问题。 解决方案: 前端:在vite.config.js文…...
数据库(2)--建表 表操作
1.建表 语法: create table if not exists 表名( 类型名 类型 comment ‘注释内容’, ... )设置字符集编码与排序规则; create table if not exists student( name char(10) comment 姓名, id bigint comment 学号 )character set utf8mb4 collate utf8mb4_0900_a…...
泷羽sec----学会并玩转powershell【基础1-2】
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
2 逻辑符号
在文件和目录的判断或者其他情况中,可以组合使用多个条件。 逻辑与 (&&) 逻辑与运算符 && 用于在多个条件都为真时执行某个操作。 # 判断文件是否存在且可读 if [ -f "$file" ] && [ -r "$file" ]; thenecho "…...
Android基于回调的事件处理
Android 中的回调机制:基于回调的事件处理详解 在 Android 开发中,回调(Callback)是一种常见的事件处理机制,主要用于异步操作和事件通知。与传统的基于监听器的事件处理相比,回调机制更加灵活、通用&…...
跨界融合:人工智能与区块链如何重新定义数据安全?
引言:数据安全的挑战与现状 在信息化驱动的数字化时代,数据已成为企业和个人最重要的资产之一。然而,随着网络技术的逐步优化和数据量的爆发式增长,数据安全问题也愈变突出。 数据安全现状:– 数据泄露驱动相关事件驱…...
qml SpringAnimation详解
1. 概述 SpringAnimation 是 Qt Quick 中用于模拟弹簧效果的动画类。它通过模拟物体在弹簧力作用下的反应,产生一种振荡的动画效果,常用于模拟具有自然回弹、弹性和振动的动态行为。这种动画效果在 UI 中广泛应用,特别是在拖动、拉伸、回弹等…...
Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)
文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后,除了用户做的界面,最上面还有一个框,这就是window frame框。对于界面的元素,它们的原点是Qt界面的左上角或win…...
Windows service运行Django项目
系统:Windows Service 软件:nssm,nginx 配置Django项目 1、把Django项目的静态文件整理到staticfiles文件夹中 注:settings中的设置 STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, staticfiles/) STATICFILES_DI…...
notebook主目录及pip镜像源修改
目录 一、notebook主目录修改二、pip镜像源修改 一、notebook主目录修改 在使用Jupyter Notebook进行数据分析时,生成的.ipynb文件默认会保存在Jupyter的主目录中。通常情况下,系统会将Jupyter的主目录设置为系统的文档目录,而文档目录通常位…...
Linux(Centos 7.6)命令详解:touch
1.命令作用 如果文件不存在将创建一个空文件;修改文件修改访问时间。 2.命令语法 Usage: touch [OPTION]... FILE... 3.参数详解 Usage: -a,access 只修改访问时间-c,不创建任何文件-d,--dateSTRING 解析STRING并使用它替代…...
ubuntu 下生成 core dump
在Ubuntu下,发现程序崩溃后不生成core dump文件, 即使设置了ulimit -c unlimited后仍然无效。 1.ulimit -c unlimited 输出的的含义是核心转储文件的大小限制,单位是blocks,默认是0,表示不生成core dump文件。 2. 重设core_pattern ulimit -c unlimited后,核心转储文件…...
大数据智能选课系统
1.产品介绍 产品名称:大数据智能选课系统 一、产品概述 随着信息技术的快速发展,大数据技术在教育领域的应用越来越广泛。针对当前高校选课过程中的繁琐操作、资源分配不均等问题,我们研发了一款基于大数据智能分析的选课系统。本系统旨在…...
HTTP-响应协议
HTTP的响应过程? 浏览器请求数据--》web服务器过程:请求过程 web服务器将响应数据-》到浏览器:响应过程 响应数据有哪些内容? 1.和请求数据类似。 2. 响应体中存储着web服务器返回给浏览器的响应数据。并且注意响应头和响应体之间…...
[离线数仓] 总结三、Hive数仓DIM层开发
5.9 数仓开发之DIM层 DIM层设计要点: (1)DIM层的设计依据是维度建模理论,该层存储维度模型的维度表。 (2)DIM层的数据存储格式为orc列式存储+snappy压缩。 (3)DIM层表名的命名规范为dim_表名_全量表或者拉链表标识(full/zip)。 -- 数仓开发之DIM层 -- DIM层设计要点:…...
搭建RK3588开发板Qt交叉编译环境
一、开发环境 在虚拟机里安装Ubuntu20.04Qt5.14.2交叉编译器gcc-linaro-7.5.0 二、相关资料下载 在虚拟机里安装Ubuntu20.04 Ubuntu20.04镜像下载(https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/)安装Qt5.14.2 下载安装包和源码 安装包(http…...
【Rust自学】11.3. 自定义错误信息
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏,而这篇文章讲的就是它…...
ROS核心概念解析:从Node到Master,再到roslaunch的全面指南
Node 在ROS中,最小的进程单元就是节点(node)。一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点。 从程序角度来说,node就是一个可执行文件&…...
Autodl安装tensorflow2.10.0记录
首先租用新实例(我选的是3080*2卡),由于基础镜像中没有2.10.0版本,选miniconda3的基础环境 创建虚拟环境:conda create --name xxx python3.8(环境名)激活虚拟环境:conda activate x…...
Linux第一课:c语言 学习记录day06
四、数组 冒泡排序 两两比较,第 j 个和 j1 个比较 int a[5] {5, 4, 3, 2, 1}; 第一轮:i 0 n:n个数,比较 n-1-i 次 4 5 3 2 1 // 第一次比较 j 0 4 3 5 2 1 // 第二次比较 j 1 4 3 2 5 1 // 第三次比较 j 2 4 3 2 1 5 // …...
代码随想录day03
203 链表基础操作 class Solution { public:ListNode* removeElements(ListNode* head, int val) {while (head!NULL&&head->valval){ListNode* temphead;headhead->next;delete temp;}ListNode* curhead;while (cur!NULL&&cur->next!NULL){if(cur-…...
python-leetcode-无重复字符的最长子串
3. 无重复字符的最长子串 - 力扣(LeetCode) class Solution:def lengthOfLongestSubstring(self, s: str) -> int:char_set set()left 0max_length 0for right in range(len(s)):while s[right] in char_set:char_set.remove(s[left])left 1char_…...