【ROS2】高级:安全-理解安全密钥库
目标:探索位于 ROS 2 安全密钥库中的文件。
教程级别:高级
时间:15 分钟
内容
背景
安全工件位置
公钥材料
私钥材料
域治理政策
安全飞地
参加测验!
背景
在继续之前,请确保您已完成设置安全教程。
sros2 包可以用来创建启用 ROS 2 安全性所需的密钥、证书和策略。然而,安全配置非常灵活。对 ROS 2 安全密钥库的基本理解将允许与现有的 PKI(公钥基础设施)集成,并根据组织政策管理敏感密钥材料。
安全工件位置
在之前的教程中启用通信安全后,让我们来看看启用安全性时创建的文件。这些文件使加密成为可能。
cxy@cxy-Ubuntu2404:~/sros2_demo$ sudo apt install tree
cxy@cxy-Ubuntu2404:~/sros2_demo$ tree
.
└── demo_keystore├── enclaves│   ├── governance.p7s│   ├── governance.xml│   └── talker_listener│       ├── listener│       │   ├── cert.pem│       │   ├── governance.p7s -> ../../governance.p7s│       │   ├── identity_ca.cert.pem -> ../../../public/identity_ca.cert.pem│       │   ├── key.pem│       │   ├── permissions_ca.cert.pem -> ../../../public/permissions_ca.cert.pem│       │   ├── permissions.p7s│       │   └── permissions.xml│       └── talker│           ├── cert.pem│           ├── governance.p7s -> ../../governance.p7s│           ├── identity_ca.cert.pem -> ../../../public/identity_ca.cert.pem│           ├── key.pem│           ├── permissions_ca.cert.pem -> ../../../public/permissions_ca.cert.pem│           ├── permissions.p7s│           └── permissions.xml├── private│   ├── ca.key.pem│   ├── identity_ca.key.pem -> ca.key.pem│   └── permissions_ca.key.pem -> ca.key.pem└── public├── ca.cert.pem├── identity_ca.cert.pem -> ca.cert.pem└── permissions_ca.cert.pem -> ca.cert.pem8 directories, 22 files 
sros2 实用程序 ( ros2 security ... ) 将文件分为公共、私有和飞地密钥材料。
ROS 使用由环境变量 ROS_SECURITY_KEYSTORE 定义的目录作为密钥库。在本教程中,我们使用目录 ~/sros2_demo/demo_keystore 。
公钥材料
您将在 ~/sros2_demo/demo_keystore/public 的公共目录中找到三个加密证书;然而,身份和权限证书实际上只是指向证书颁发机构(CA)证书的链接。
在公钥基础设施中,证书颁发机构充当信任锚:它验证参与者的身份和权限。对于 ROS,这意味着所有参与 ROS 图的节点(可能扩展到整个单机器人舰队)。通过将证书颁发机构的证书( ca.cert.pem )放置在机器人上的适当位置,所有 ROS 节点都可以使用相同的证书颁发机构与其他节点建立相互信任。
虽然在我们的教程中我们会即时创建证书颁发机构,但在生产系统中,这应该根据预定义的安全计划进行。通常,生产系统的证书颁发机构将离线创建,并在初始设置期间放置在机器人上。它可能是每个机器人独有的,或者在一群机器人之间共享,所有这些机器人都旨在相互信任。
DDS(以及扩展的 ROS)支持身份和权限信任链的分离,因此每个功能都有自己的证书颁发机构。在大多数情况下,ROS 系统安全计划不需要在这些职责之间进行分离,因此安全实用程序生成一个用于身份和权限的单一证书颁发机构。
使用 openssl 查看此 x509 证书并将其显示为文本:
cd ~/sros2_demo/demo_keystore/public
openssl x509 -in ca.cert.pem -text -noout 输出应类似于以下内容:

Certificate:Data:Version: 3 (0x2)Serial Number:02:8e:9a:24:ea:10:55:cb:e6:ea:e8:7a:c0:5f:58:6d:37:42:78:aaSignature Algorithm: ecdsa-with-SHA256Issuer: CN = sros2CAValidityNot Before: Jun  1 16:57:37 2021 GMTNot After : May 31 16:57:37 2031 GMTSubject: CN = sros2CASubject Public Key Info:Public Key Algorithm: id-ecPublicKeyPublic-Key: (256 bit)pub:04:71:e9:37:d7:32:ba:b8:a0:97:66:da:9f:e3:c4:08:4f:7a:13:59:24:c6:cf:6a:f7:95:c5:cd:82:c0:7f:7f:e3:90:dd:7b:0f:77:d1:ee:0e:af:68:7c:76:a9:ca:60:d7:1e:2c:01:d7:bc:7e:e3:86:2a:9f:38:dc:ed:39:c5:32ASN1 OID: prime256v1NIST CURVE: P-256X509v3 extensions:X509v3 Basic Constraints: criticalCA:TRUE, pathlen:1Signature Algorithm: ecdsa-with-SHA25630:45:02:21:00:d4:fc:d8:45:ff:a4:51:49:98:4c:f0:c4:3f:e0:e7:33:19:8e:31:3c:d0:43:e7:e9:8f:36:f0:90:18:ed:d7:7d:02:20:30:84:f7:04:33:87:bb:4f:d3:8b:95:61:48:df:83:4b:e5:92:b3:e6:ee:3c:d5:cf:30:43:09:04:71:bd:dd:7c 关于此 CA 证书的一些注意事项:
-  
证书主题名称
sros2CA是sros2实用程序提供的默认名称。此证书自创建之日起有效期为十年
像所有证书一样,这包含用于公私钥加密的公钥
作为根证书颁发机构,这是一个自签名证书 https://en.wikipedia.org/wiki/Self-signed_certificate ;即,它是使用自己的私钥签名的。
 
由于这是一个公共证书,因此可以根据需要自由复制,以在整个 ROS 系统中建立信任。
私钥材料
私钥材料可以在密钥库目录 ~/sros2_demo/demo_keystore/private 中找到。与 public 目录类似,其中包含一个证书颁发机构密钥 ca.key.pem 及其符号链接,用作身份和权限 CA 私钥。
警告
保护此私钥并创建其安全备份!
这是与公共证书颁发机构相关的私钥,它作为您 ROS 系统中所有安全性的锚点。您将使用它来修改 ROS 图的加密策略并添加新的 ROS 参与者。根据您的机器人安全需求,可以通过访问权限保护密钥并将其锁定到另一个帐户,或者可以将其完全移出机器人并移到另一个系统或设备上。如果文件丢失,您将无法更改访问权限并向系统添加新参与者。同样,任何拥有文件访问权限的用户或进程都可以修改系统策略和参与者。
此文件仅用于配置机器人,但机器人运行时不需要。它可以安全地离线存储在另一个系统或可移动介质中。
sros2 实用程序使用椭圆曲线密码术而不是 RSA,以提高安全性并减少密钥大小。使用以下命令显示有关此椭圆曲线私钥的详细信息:
cd ~/sros2_demo/demo_keystore/private
openssl ec -in ca.key.pem -text -noout 
您的输出应类似于以下内容:
read EC key
Private-Key: (256 bit)
priv:93:da:76:b9:e3:91:ab:e9:42:76:f2:38:f1:9d:94:90:5e:b5:96:7b:7f:71:ee:13:1b:d4:a0:f9:48:fb:ae:77
pub:04:71:e9:37:d7:32:ba:b8:a0:97:66:da:9f:e3:c4:08:4f:7a:13:59:24:c6:cf:6a:f7:95:c5:cd:82:c0:7f:7f:e3:90:dd:7b:0f:77:d1:ee:0e:af:68:7c:76:a9:ca:60:d7:1e:2c:01:d7:bc:7e:e3:86:2a:9f:38:dc:ed:39:c5:32
ASN1 OID: prime256v1
NIST CURVE: P-256 除了私钥本身,请注意列出了公钥,并且它与证书颁发机构 ca.cert.pem 中列出的公钥匹配。
域治理政策
在密钥库的飞地目录中找到域治理策略, ~/sros2_demo/demo_keystore/enclaves 。 enclave 目录包含 XML 治理策略文档 governance.xml ,以及由权限 CA 签署的文档副本 governance.p7s 。
governance.p7s 文件包含域范围的设置,例如如何处理未经身份验证的参与者、是否加密发现以及访问主题的默认规则。
使用以下命令验证治理文件的 S/MIME 签名:
openssl smime -verify -in governance.p7s -CAfile ../public/permissions_ca.cert.pem 
安全飞地
安全进程(通常是 ROS 节点)在安全飞地内运行。在最简单的情况下,所有进程可以合并到同一个飞地中,所有进程将使用相同的安全策略。然而,为了对不同的进程应用不同的策略,可以在启动时使用不同的安全飞地。有关安全飞地的更多详细信息,请参阅设计文档https://design.ros2.org/articles/ros2_security_enclaves.html 。运行节点时,通过使用 ROS 参数 --enclave 来指定安全飞地。
每个安全飞地需要六个文件才能启用安全性。每个文件必须按下文定义的名称命名,并按照 DDS 安全标准中的规定进行命名。为了避免拥有多个相同文件的副本, sros2 实用程序为每个飞地创建到单个治理策略、身份 CA 和权限 CA 的链接。

请参阅 listener 飞地内的以下六个文件。三个是特定于此飞地的,而三个是此 ROS 系统的通用文件:
key.pem,用于在此飞地内加密和解密的私钥
cert.pem,此飞地的公共证书;此证书已由身份 CA 签署
permissions.p7s,此飞地的权限;此文件已由权限 CA 签名
governance.p7s,此域的已签署安全策略文件的链接
identity_ca.cert.pem, 此域的身份 CA 链接
permissions_ca.cert.pem,此域的权限 CA 链接
私钥 key.pem 应根据您的安全计划进行保护。此密钥用于加密、解密和验证此特定飞地内的通信。如果密钥丢失或被盗,请撤销该密钥并为此飞地创建一个新身份。
该目录中还创建了文件 permissions.xml ,可用于重新创建签名的权限文件。但是,由于 DDS 使用的是文件的签名版本,因此不需要此文件来启用安全性。
参加测验!
看看你能否回答这些关于 ROS 安全密钥库的问题。首先,打开一个新的终端会话,并启用在前面的教程中创建的密钥库的安全性:
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforcecd ~/sros2_demo/demo_keystore/enclaves/talker_listener/listener 在开始之前,请先备份 permissions.p7s 。
MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="===============1982425736132065620=="This is an S/MIME signed message--===============1982425736132065620==
Content-Type: text/plain<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.omg.org/spec/DDS-SECURITY/20170901/omg_shared_ca_permissions.xsd"><permissions><grant name="/talker_listener/listener"><subject_name>CN=/talker_listener/listener</subject_name><validity><not_before>2024-07-19T03:38:43</not_before><not_after>2034-07-18T03:38:43</not_after></validity><allow_rule><domains><id>0</id></domains><publish><topics><topic>rq/*/_action/cancel_goalRequest</topic><topic>rq/*/_action/get_resultRequest</topic><topic>rq/*/_action/send_goalRequest</topic><topic>rq/*Request</topic><topic>rr/*/_action/cancel_goalReply</topic><topic>rr/*/_action/get_resultReply</topic><topic>rr/*/_action/send_goalReply</topic><topic>rt/*/_action/feedback</topic><topic>rt/*/_action/status</topic><topic>rr/*Reply</topic><topic>rt/*</topic></topics></publish><subscribe><topics><topic>rq/*/_action/cancel_goalRequest</topic><topic>rq/*/_action/get_resultRequest</topic><topic>rq/*/_action/send_goalRequest</topic><topic>rq/*Request</topic><topic>rr/*/_action/cancel_goalReply</topic><topic>rr/*/_action/get_resultReply</topic><topic>rr/*/_action/send_goalReply</topic><topic>rt/*/_action/feedback</topic><topic>rt/*/_action/status</topic><topic>rr/*Reply</topic><topic>rt/*</topic></topics></subscribe></allow_rule><allow_rule><domains><id>0</id></domains><publish><topics><topic>ros_discovery_info</topic></topics></publish><subscribe><topics><topic>ros_discovery_info</topic></topics></subscribe></allow_rule><default>DENY</default></grant></permissions>
</dds>--===============1982425736132065620==
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"MIICsAYJKoZIhvcNAQcCoIICoTCCAp0CAQExDzANBglghkgBZQMEAgEFADALBgkq
hkiG9w0BBwGgggE/MIIBOzCB4qADAgECAhR8Qa0j+Lrcm8xeZkyz9p/bZMWhVzAK
BggqhkjOPQQDAjASMRAwDgYDVQQDDAdzcm9zMkNBMB4XDTI0MDcxOTAzMjQxNFoX
DTM0MDcxODAzMjQxNFowEjEQMA4GA1UEAwwHc3JvczJDQTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABPMaf1j/SYjdKa+wt8L7SPedfo1UR2bEm0MoUKU8Yaiep+AC
1Uwaza61Gsvuq68t+3gy+i75zwwkj76n+77PV8ejFjAUMBIGA1UdEwEB/wQIMAYB
Af8CAQEwCgYIKoZIzj0EAwIDSAAwRQIhALNRE/bqkCIvf1xD3E8s/1HqS1FY4Q31
dX+C9FMYNn+ZAiBHNtYoBAmu8lU6/+Ux+26wBdKEf+PEJs45EtgNd08UDDGCATUw
ggExAgEBMCowEjEQMA4GA1UEAwwHc3JvczJDQQIUfEGtI/i63JvMXmZMs/af22TF
oVcwDQYJYIZIAWUDBAIBBQCggZswGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
BgkqhkiG9w0BCQUxDxcNMjQwNzIwMDMzODQzWjAvBgkqhkiG9w0BCQQxIgQgkeLS
0XqZO+LEtvmMJumjB+dkzkMPosQzWIvdotfJQ5QwMAYJKoZIhvcNAQkPMSMwIQYJ
YIZIAWUDBAEqBglghkgBZQMEARYGCWCGSAFlAwQBAjAKBggqhkjOPQQDAgRHMEUC
IEcVdGZIK9qOIeMkw5tvyMmIt/UBfqcnMiakwXWBxXMZAiEA+nItvq7n5WkgPHrc
mTBX0DlOac3CwCrv4/aJS32PPN0=--===============1982425736132065620==-- 这个 permissions.p7s 文件是一个 S/MIME 签名的消息,包含了 ROS2 的权限策略。以下是详细解释:
MIME 头部
MIME-Version: 1.0:MIME 版本。
Content-Type: multipart/signed; protocol=“application/x-pkcs7-signature”; micalg=“sha-256”; boundary=“===============1982425736132065620==”:表示这是一个多部分签名的消息,使用 SHA-256 算法进行签名,边界字符串用于分隔消息的不同部分。
消息内容
This is an S/MIME signed message:说明这是一个 S/MIME 签名的消息。
第一部分:权限策略
Content-Type: text/plain:内容类型为纯文本。
权限策略 XML
这个 XML 文件定义了 /talker_listener/listener 节点的权限,包括允许发布和订阅的主题,以及权限的有效期。
第二部分:签名
Content-Type: application/x-pkcs7-signature; name=“smime.p7s”:内容类型为 PKCS#7 签名。
Content-Transfer-Encoding: base64:内容传输编码为 base64。
Content-Disposition: attachment; filename=“smime.p7s”:附件的文件名为
smime.p7s。
签名内容
这是一个 base64 编码的签名,用于验证上述权限策略的完整性和真实性。
问题 1
在文本编辑器中打开 permissions.p7s 。对 XML 内容进行微小的更改(例如,添加一个空格或空行)并保存文件。启动监听节点:
ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener 你期望会发生什么?
你能启动 talker 节点吗?
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker 启动监听器和启动说话者之间有什么区别?
答案 1
侦听器无法启动并抛出错误。当 permissions.p7s 文件被修改时——无论多么微小——文件的签名变得无效。当权限文件无效时,节点将无法在启用和强制安全的情况下启动。

讲话者将按预期开始。它在不同的飞地中使用 permissions.p7s 文件,并且该文件仍然有效。
问题 2
什么命令可以让你检查修改后的 permissions.p7s 文件上的签名是否有效?
答案 2
检查 permissions.p7s 是否已使用 openssl smime 命令由权限 CA 正确签名
openssl smime -verify -in permissions.p7s -CAfile permissions_ca.cert.pem 

在继续下一个教程之前,请恢复您原始的、正确签名的 permissions.p7s 文件。
相关文章:
【ROS2】高级:安全-理解安全密钥库
目标:探索位于 ROS 2 安全密钥库中的文件。 教程级别:高级 时间:15 分钟 内容 背景安全工件位置 公钥材料 私钥材料域治理政策 安全飞地 参加测验! 背景 在继续之前,请确保您已完成设置安全教程。 sros2 包可以用来创…...
C语言 ——— 数组指针的定义 数组指针的使用
目录 前言 数组指针的定义 数组指针的使用 前言 之前有编写过关于 指针数组 的相关知识 C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 指针数组 顾名思义就是 存放指针的数组 那什么是数组指针呢? 数组指针的定义 何为数组指针…...
opencascade AIS_ManipulatorOwner AIS_MediaPlayer源码学习
前言 AIS_ManipulatorOwner是OpenCascade中的一个类,主要用于操纵对象的交互控制。AIS_ManipulatorOwner结合AIS_Manipulator类,允许用户通过可视化工具(如旋转、平移、缩放等)来操纵几何对象。 以下是AIS_ManipulatorOwner的基…...
如何防止用户通过打印功能复制页面文字
简单防白嫖,要让打印出来的页面是空白,通常的做法是在打印时隐藏页面上的所有内容。这可以通过CSS的媒体查询(Media Queries)来实现,特别是针对media print的查询。 在JavaScript中,你通常不会直接控制打印…...
Python3网络爬虫开发实战(3)网页数据的解析提取
文章目录 一、XPath1. 选取节点2. 查找某个特定的节点或者包含某个指定的值的节点3. XPath 运算符4. 节点轴5. 利用 lxml 使用 XPath 二、CSS三、Beautiful Soup1. 信息提取2. 嵌套选择3. 关联选择4. 方法选择器5. css 选择器 四、PyQuery1. 初始化2. css 选择器3. 信息提取4. …...
基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)
构建监控平台数据可视化大屏:基于 HTML 和 ECharts 的实现 监控平台的数据可视化对于实时掌握系统状态、快速响应问题至关重要。通过直观的数据展示,运维团队可以迅速发现异常,优化资源配置。本文将详细介绍如何利用 HTML 和 ECharts 实现一个…...
立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统
本文主要是在sfud的基础上进行fatfs文件系统的移植,并不对sfud的移植再进行过多的讲解了哦,所以如果想了解sfud的移植过程,请参考我的另外一篇文章:传送门 正文开始咯 首先我们需要先准备资料准备好,这里对于fatfs的…...
MySQL之视图和索引实战
1.新建数据库 mysql> create database myudb5_indexstu; Query OK, 1 row affected (0.01 sec) mysql> use myudb5_indexstu; Database changed 2.新建表 1.学生表student,定义主键,姓名不能重名,性别只能输入男或女,所在…...
快速参考:用C# Selenium实现浏览器窗口缩放的步骤
背景介绍 在现代网络环境中,浏览器自动化已成为数据抓取和测试的重要工具。Selenium作为一个强大的浏览器自动化工具,能够与多种编程语言结合使用,其中C#是非常受欢迎的选择之一。在实际应用中,我们常常需要调整浏览器窗口的缩放…...
MyBatis 插件机制、分页插件如何实现的
MyBatis 插件机制允许开发者在 SQL 执行的各个阶段(如预处理、执行、结果处理等)中插入自定义逻辑,从而实现对 MyBatis 行为的扩展和增强。以下是 MyBatis 插件运行原理的详细介绍: 插件接口 MyBatis 插件通过实现 org.apache.i…...
CentOS6.0安装telnet-server启用telnet服务
CentOS6.0安装telnet-server启用telnet服务 一步到位 fp"/etc/yum.repos.d" ; cp -a ${fp} ${fp}.$(date %0y%0m%0d%0H%0M%0S).bkup echo [base] nameCentOS-$releasever - Base baseurlhttp://mirrors.163.com/centos-vault/6.0/os/$basearch/http://mirrors.a…...
H5+CSS+JS工作性价比计算器
工作性价比=平均日新x综合环境系数/35 x(工作时长+通勤时长—0.5 x摸鱼时长) x学历系数 如果代码中的公式不对,请指正 效果图 源代码 <!DOCTYPE html> <html> <head> <style> .calculator { width: 300px; padd…...
Linux:基础命令学习
目录 一、ls命令 实例:-l以长格式显示文件和目录信息 实例:-F根据文件类型在列出的文件名称后加一符号 实例: -R 递归显示目录中的所有文件和子目录。 实例: 组合使用 Home目录和工作目录 二、目录修改和查看命令 三、mkd…...
遇到Websocket就不会测了?别慌,学会这个Jmeter插件轻松解决....
websocket 是一种双向通信协议,在建立连接后,websocket服务端和客户端都能主动向对方发送或者接收数据,而在http协议中,一个request只能有一个response,而且这个response也是被动的,不能主动发起。 websoc…...
高性能 Java 本地缓存 Caffeine 框架介绍及在 SpringBoot 中的使用
在现代应用程序中,缓存是一种重要的性能优化技术,它可以显著减少数据访问延迟,降低服务器负载,提高系统的响应速度。特别是在高并发的场景下,合理地使用缓存能够有效提升系统的稳定性和效率。 Caffeine 是一个高性能的…...
Http 和 Https 的区别(图文详解)
在现代网络通信中,保护数据的安全性和用户的隐私是至关重要的。HTTP(Hypertext Transfer Protocol)和 HTTPS(Hypertext Transfer Protocol Secure)是两种常见的网络通信协议,但它们在数据保护方面的能力存在…...
DP学习——外观模式
学而时习之,温故而知新。 外观模式 角色 2个角色,外观类,子系统类。 个人理解 感觉就是对外接口封装,这个是封装一个功能的对外接口,越简单越好,提供给第三方用。 应用场景 封装为对外库时ÿ…...
Vue3 + Vite 打包引入图片错误
1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入,注意src最好引用为符引入,不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …...
搭建NFS、web、dns服务器
目录 1、搭建一个nfs服务器,客户端可以从该服务器的/share目录上传并下载文件 服务端配置: 客户端测试: 2、搭建一个Web服务器,客户端通过www.haha.com访问该网站时能够看到内容:this is haha 服务端配置: 客户端…...
C++的UI框架和开源项目介绍
文章目录 1.QT2.wxWidgets3.Dear ImGui 1.QT QT的开源项目:QGIS(地理信息系统) https://github.com/qgis/QGIS?tabreadme-ov-file 2.wxWidgets wxWidgets的开源项目:filezilla https://svn.filezilla-project.org/svn/ wxWidg…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

