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

【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方式编写…...

如何稳定使用 O1 / O1 Pro,让“降智”现象不再困扰?

近期,不少朋友在使用 O1 或 O1 Pro 模型时,都会碰到“降智”或“忽高忽低”的智力波动,比如无法识图、无法生成图片、甚至回答准确度也不稳定。面对这些问题,你是不是也感到头疼呢? 为了找到更可靠的解决办法&#xf…...

zookeeper监听机制(Watcher机制)

文章目录 引言I zookeeper监听机制Watcher机制实现分布式的通知功能触发事件种类Watcher的三个过程II watch机制特点一次性触发事件封装event异步发送先注册再触发常见的通知状态和事件类型III 应用案例(Kafka)Kafka的消息模型Kafka在Zookeeper中保存的元数据Kafka 基于Contr…...

docker 启动 nacos 单机模式

docker 启动 nacos 单机模式 # 拉取镜像# 启动,如果不拉镜像会自动拉取最新的 image docker run --name standalong_nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODEstandalone -d nacos/nacos-server# 状态查看外部访问验证 输入部署的 docker ip 地址以及…...

学习threejs,导入babylon格式的模型

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.BabylonLoader babyl…...

03.MPLS静态LSP配置实验

MPLS静态LSP配置实验 1、实验环境2、基础配置开启全局mpls接口下开启mpls配置静态LSP配置FEC从1.1.1.1到3.3.3.3配置FEC从3.3.3.3到1.1.1.13、信息查看查看LFIB表(标签转发信息表)查看FIB表(转发信息表)查看详细FFIB表tracert lsp iptracert -vping lsp ip4、抓包验证1、实…...

程序血缘分析技术在工商银行软件工程中的应用

当前,随着软件领域技术更新换代速度的日益加快,市场需求也变得更加多样化和个性化,业界普遍通过加速产品迭代来满足客户需求,但在此过程中也暴露出一些研发管理痛点问题,如服务和程序类资产信息分散于各个不同的应用和系统中,信息归集费时费力;设计、开发和测试人员无法…...

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask 大

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

macOS 使用 FreeRDP 远程访问 Windows:完整指南20250109

🖥️ macOS 使用 FreeRDP 远程访问 Windows:完整指南 引言 随着远程办公需求的快速增长,跨平台远程管理已经成为不可或缺的技能之一。作为一款开源轻量的远程桌面协议实现工具,FreeRDP 为 macOS 用户提供了一个简单、高效的解决…...

Java agent

‌ Java Agent是一种特殊的Java程序,它可以在JVM启动时或运行时动态加载,用于监控和修改其他Java应用程序的行为‌。通过Java Agent,开发者可以在不修改目标应用程序源码的情况下,动态地插入功能,如性能分析、日志记录…...

Web无障碍

文章目录 🟢Web Accessibility-Web无障碍🟢一、Web Accessibility-Web1. web无障碍设计2. demo3.使用相关相关开源无障碍工具条(调用可能会根据网络有点慢) 如有其他更好方案,可以私信我哦✒️总结 🟢Web Accessibility-Web无障碍…...

概率基本概念 --- 离散型随机变量实例

条件概率&独立事件 随机变量 - 离散型随机变量 - 非离散型随机变量 连续型随机变量奇异性型随机变量 概率表示 概率分布函数概率密度函数概率质量函数全概率公式贝叶斯公式 概率计算 数学期望方差协方差 计算实例 假设有两个离散型随机变量X和Y,它们代…...

毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...

基于 WEB 开发的高校学籍管理系统设计与实现

标题:基于 WEB 开发的高校学籍管理系统设计与实现 内容:1.摘要 摘要:随着信息技术的不断发展,高校学籍管理系统的信息化建设已成为必然趋势。本文以高校学籍管理系统为研究对象,探讨了基于 WEB 开发的高校学籍管理系统的设计与实现。通过对系…...

阿里云发现后门webshell,怎么处理,怎么解决?

当收到如下阿里云通知邮件时,大部分管理员都会心里一惊吧!出现Webshell,大概是网站被入侵了。 尊敬的 xxxaliyun.com: 云盾云安全中心检测到您的服务器:47.108.x.xx(xx机)出现了紧急安全事件…...

HTB:Bank[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取出靶机TCP开放端口 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用curl对域名进行访问…...

如何用数字万用表测量是否漏电?

测量电气设备或线路是否漏电是确保安全的重要步骤。台式数字万用表(DMM)是一种常见的测试工具,它可以帮助我们检测和确认是否存在漏电现象。本文将详细介绍如何使用台式数字万用表进行漏电检测,包括准备工作、具体操作步骤和安全注…...

黑马跟学.苍穹外卖.Day04

黑马跟学.苍穹外卖.Day04 苍穹外卖-day04课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常…...

uniapp使用scss mixin抽离css常用的公共样式

1、编写通用scss样式文件 // 通用 Flex Mixin mixin flex($direction: row, $justify: flex-start, $align: stretch, $wrap: nowrap) {display: flex;flex-direction: $direction;justify-content: $justify;align-items: $align;flex-wrap: $wrap; }// 水平居中 mixin flex-…...

用Python解决“A. Accounting”问题:完整教程与代码实现

引言 在这篇文章中,我们将深入探讨编程竞赛中的一道经典问题“A. Accounting”,并用Python实现一个高效的解决方案。本文将涵盖题目分析、算法设计和Python代码实现,以及代码的完整讲解和优化方法。 一、问题描述 在一个遥远的国家里&…...

字符串字典序最大后缀问题详解

字符串字典序最大后缀问题详解 一、问题定义与背景1.1 问题描述1.2 实际应用场景 二、暴力解法及其局限性2.1 暴力解法思路2.2 代码示例2.3 局限性分析 三、双指针算法:高效解决方案3.1 算法核心思想3.2 算法步骤3.3 代码实现3.4 与暴力解法对比 四、复杂度分析4.1 …...

分页查询的实现

第一步&#xff1a;导入pom依赖 <!--配置PageHelper分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version><exclusions>…...

《影像引导下骨盆创伤手术的术前骨折复位规划:基于学习的综合流程》|文献速递-深度学习医疗AI最新文献

Title 题目 Preoperative fracture reduction planning for image-guided pelvic trauma surgery: A comprehensive pipeline with learning 《影像引导下骨盆创伤手术的术前骨折复位规划&#xff1a;基于学习的综合流程》 01 文献速递介绍 《影像引导下骨盆创伤手术的术前…...

Docker 容器化基础:镜像、容器与仓库的本质解析

Docker 概念与容器化技术 Docker 是一种容器化平台&#xff0c;能够将应用程序及其依赖项打包成一个容器&#xff0c;确保在任何环境中都能一致运行。容器化技术通过操作系统级别的虚拟化&#xff0c;为应用程序提供了一个独立的运行环境。 容器化技术的核心优势 一致性&…...

Prompt Engineering Notes

TOC LLM output configurationOutput length LLM output configuration Output length 仅仅起到截断作用&#xff0c;不会让模型的输出更简洁。...

C++课设:学生成绩管理系统

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、项目功能概览1. 核心功能模块2. 系统特色亮点3. 完整代码4. 运行演示二、核心结构设计1. 系统架构设计2. Stud…...

Flink 高可用集群部署指南

一、部署架构设计 1. 集群架构 graph TDClient([客户端]) --> JM1[JobManager 1]Client --> JM2[JobManager 2]Client --> JM3[JobManager 3]subgraph ZooKeeper集群ZK1[ZooKeeper 1]ZK2[ZooKeeper 2]ZK3[ZooKeeper 3]endsubgraph TaskManager集群TM1[TaskManager 1…...

会计 - 金融负债和权益工具

一、金融负债和权益工具区分的基本原则 (1)是否存在无条件地避免交付现金或其他金融资产的合同义务 如果企业不能无条件地避免以交付现金或其他金融资产来履行一项合同义务,则该合同义务符合金融负债的义务。 常见的该类合同义务情形包括:- 不能无条件避免的赎回; -强制…...

安全编码规范与标准:对比与分析及应用案例

在软件开发领域&#xff0c;尤其是涉及安全关键系统的开发中&#xff0c;遵循编码规范和标准是确保软件质量和安全性的重要手段。除了CERT C、CERT Java和MISRA外&#xff0c;还有其他多个与安全相关的编码规范和标准&#xff0c;以下是一些主要标准的对比说明&#xff1a; 一…...

11.MySQL事务管理详解

MySQL事务管理详解 文章目录 MySQL事务管理 事务的概念 事务的版本支持 事务的提交方式 事务的相关演示 事务的隔离级别 查看与设置隔离级别 读未提交&#xff08;Read Uncommitted&#xff09; 读提交&#xff08;Read Committed&#xff09; 可重复读&#xff08;Repeatabl…...