ROS多设备交互
ROS多设备连接同一个Master:ROS Master多设备连接-CSDN博客
在多个PC端连接同一个ROS Master后,接下来就可以实现不同设备之间的话题交流,Master主机端启动不同PC端的功能包等功能了
尽管多个PC端拥有不同的ROS工作空间,但是只要他们都连接在同一个ROS Master下,它们就能互相通信(工作空间只是存放ROS代码(功能包)的目录(如 ~/catkin_ws
),它不影响ROS节点如何连接Master)
一,跨设备文件启动
要在 PC1(运行ROS Master的PC) 上启动 PC2(另一个PC) 的 ROS 功能包,你需要确保:
-
PC2 的功能包已经编译(
catkin_make
或colcon build
)。 -
PC1 能够访问 PC2 的 ROS 功能包(通常通过 SSH 远程执行命令)。
-
PC2 的
ROS_MASTER_URI
指向 PC1 的 Master(确保节点注册到正确的 Master)。
一般启动方式有两种,使用ssh启动和roslaunch启动
1, SSH远程运行
最基本的就是在终端中连接到另一个PC端,然后执行终端命令
ssh <PC2_USER>@<PC2_IP> "source /opt/ros/noetic/setup.bash && source ~/catkin_ws/devel/setup.bash && rosrun <package_name> <node_name>"
例如
ssh user@192.168.1.101 "source /opt/ros/noetic/setup.bash && source ~/catkin_ws/devel/setup.bash && rosrun my_package my_node"
在文章(Python实现ssh自动连接-CSDN博客)中我们使用了Python代码进行远程ssh连接和命令执行,同样的我们也可以在这里使用Python代码执行
import paramikodef ssh_run_ros_node(host, username, password, package, node):"""通过SSH远程执行ROS节点:param host: 远程PC的IP地址:param username: 远程PC的用户名:param password: 远程PC的密码:param package: ROS包名:param node: 节点名"""# 创建SSH客户端ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:# 连接远程主机ssh.connect(host, username=username, password=password)# 构造ROS运行命令command = f"source /opt/ros/noetic/setup.bash && source ~/catkin_ws/devel/setup.bash && rosrun {package} {node}"# 执行命令(非阻塞方式)stdin, stdout, stderr = ssh.exec_command(command, get_pty=True)print(f"已在 {host} 上启动 {package}/{node}")# 返回SSH连接和通道,以便后续管理return ssh, stdin, stdout, stderrexcept Exception as e:print(f"SSH连接失败: {str(e)}")ssh.close()return None, None, None, None
启动bash文件,只需要将command替换一下即可
def run_bash_script(ssh_client, script_path, arguments=""):"""通过SSH远程执行bash脚本:param ssh_client: 已建立的SSH连接:param script_path: 远程机器上的脚本路径(如 ~/catkin_ws/scripts/start_robot.sh):param arguments: 传递给脚本的参数"""command = f"bash {script_path} {arguments}"stdin, stdout, stderr = ssh_client.exec_command(command)# 读取输出(可选)print(stdout.read().decode())print(stderr.read().decode()) # 如果有错误
如果脚本依赖 ROS 环境,需要先 source
:
command = ("source /opt/ros/noetic/setup.bash && ""source ~/catkin_ws/devel/setup.bash && "f"bash {script_path} {arguments}"
)
ssh.exec_command(command)
启动Python文件,也是将command替换一下即可
def run_python_script(ssh_client, script_path, arguments=""):"""通过SSH远程执行Python脚本:param script_path: 远程机器上的Python脚本路径:param arguments: 传递给脚本的参数"""command = f"python3 {script_path} {arguments}"stdin, stdout, stderr = ssh_client.exec_command(command)print(stdout.read().decode()) # 输出print(stderr.read().decode()) # 错误
2,roslaunch远程启动
使用roslaunch启动方式可以一次性启动多个节点。
使用launch文件启动有两种方式:第一种是先要使用ssh连接后再运行command命令执行,实际上相当于在被连接端使用roslaunch命令。第二种直接使用<machine>标签实现多机协同,无需手动调用ssh(无需手动编写 SSH 代码,ROS 内部自动处理远程连接)。
第一种
import paramikodef remote_roslaunch(host, username, password, package, launch_file, args=""):"""远程执行roslaunch:param host: 远程PC的IP:param username: 远程PC的用户名:param password: 远程PC的密码:param package: ROS包名:param launch_file: launch文件名(不含.launch后缀):param args: 传递给launch文件的参数(如 "arg1:=value1 arg2:=value2")"""ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:ssh.connect(host, username=username, password=password)# 构造roslaunch命令command = (f"source /opt/ros/noetic/setup.bash && "f"source ~/catkin_ws/devel/setup.bash && "f"roslaunch {package} {launch_file}.launch {args}")# 执行命令(非阻塞)stdin, stdout, stderr = ssh.exec_command(command, get_pty=True)print(f"已在 {host} 上启动 {package}/{launch_file}.launch")return ssh # 返回SSH连接,用于后续管理except Exception as e:print(f"SSH执行失败: {str(e)}")ssh.close()return None
如果希望 roslaunch
在 SSH 断开后继续运行,使用 nohup
:
command = ("nohup roslaunch {package} {launch_file}.launch {args} ""> /dev/null 2>&1 &"
)
第二种
<machine>
标签:定义远程计算机的配置(IP、用户名、密码、环境加载脚本等)。ROS 的 roslaunch
工具会自动通过 SSH 在指定机器上启动节点。
<launch><!-- 定义远程机器 pc1 --><machine name="pc1" <!-- 逻辑名称(用于node的machine属性) -->address="192.168.1.101" <!-- 远程IP -->user="user" <!-- 用户名 -->password="pass" <!-- 密码(可选,建议用密钥替代) -->env-loader="/opt/ros/noetic/env.sh" <!-- 环境加载脚本 -->/><!-- 定义远程机器 pc2 --><machine name="pc2" address="192.168.1.102" user="user" password="pass" env-loader="/opt/ros/noetic/env.sh" /><!-- 在 pc1 上启动 node1 --><node machine="pc1" name="node1" pkg="your_pkg" type="node1"/><!-- 在 pc2 上启动 node2 --><node machine="pc2" name="node2" pkg="your_pkg" type="node2"/>
</launch>
复用机器定义:用于模块化地定义和复用远程机器配置,并启动对应的节点。假设你有两台机器人(robot1
和 robot2
),需要分别在它们上面启动相同的节点组(如导航、感知等),通过将主launch文件中定义机器配置,并引用子launch文件(定义节点逻辑),就可以实现同一个节点在不同机器上复用
<!-- 定义机器模板 -->
<group><!-- 定义一个名为robot1的远程机器 --><machine name="robot1" <!-- 逻辑名称(用于后续引用) -->address="192.168.1.101" <!-- 远程机器的IP地址 -->user="user" <!-- SSH登录用户名 -->env-loader="~/env.sh" <!-- 远程机器的环境加载脚本 -->/><!-- 包含另一个launch文件,并传递参数 --><include file="$(find your_pkg)/launch/robot_nodes.launch"><arg name="machine" value="robot1"/> <!-- 将machine名称传递给子launch文件 --></include>
</group>
子launch文件内容示例如下:
<launch><!-- 接收从主文件传递的machine名称 --><arg name="machine"/><!-- 在指定的远程机器上启动节点 --><node machine="$(arg machine)" name="nav_node" pkg="your_pkg" type="nav.py"/><node machine="$(arg machine)" name="sensor_node" pkg="your_pkg" type="sensor.py"/>
</launch>
比如下面的多机器并行启动,均使用同样的节点
<!-- main.launch -->
<launch><!-- 启动robot1 --><group><machine name="robot1" address="192.168.1.101" .../><include file="robot_nodes.launch"><arg name="machine" value="robot1"/></include></group><!-- 同时启动robot2 --><group><machine name="robot2" address="192.168.1.102" .../><include file="robot_nodes.launch"><arg name="machine" value="robot2"/></include></group>
</launch>
3,命名冲突问题
有时在不同的PC端可能需要启动同一个功能包来分别完成对应的功能,这些功能包会发布同一个话题,但是所有设备都只有一个ROS Master,这时就会出现话题名冲突的问题和节点名冲突的问题,这时就要进行命名空间的隔离
通过为每台PC的节点分配独立命名空间,避免话题和节点冲突。如下所示
group结构加命名空间
<launch><!-- PC1节点放入 /PC1 命名空间 --><group ns="PC1"><node pkg="navigation_pkg" name="nav" type="nav_node" output="screen"></node></group>
</launch>
<launch><!-- PC2节点放入 /PC2 命名空间 --><group ns="PC2"><node pkg="sim_navigation_pkg" name="nav" type="nav_node" output="screen"></node></group>
</launch>
node加命名空间
<launch><!-- 定义 PC2 --><machine name="pc2" address="192.168.1.102" user="user" password="pass" env-loader="/opt/ros/noetic/env.sh" <!-- PC2 的环境脚本 -->/><!-- 定义 PC3 --><machine name="pc3" address="192.168.1.103" user="user" env-loader="/opt/ros/noetic/env.sh" /><!-- 在 PC2 上运行 PC1 的节点 --><node machine="pc2" name="nav_node" pkg="navigation_pkg" type="nav_node" ns="pc2"/><!-- 在 PC3 上运行同一节点(通过命名空间隔离) --><node machine="pc3" name="nav_node" pkg="navigation_pkg" type="nav_node" ns="pc3"/>
</launch>
这样输出话题时就会加一个前缀,如下所示
/pc2/cmd_vel
/pc3/cmd_vel
/pc2/odom
/pc3/odom
如果无法修改命名空间,也可以重映射话题名称,但是话题如果很多的话这种方式就比较麻烦
<!-- PC1的Launch文件 -->
<node pkg="navigation_pkg" name="nav" type="nav_node"><remap from="cmd_vel" to="PC1_cmd_vel"/> <!-- PC1的控制话题 -->
</node><!-- PC2的Launch文件 -->
<node pkg="sim_navigation_pkg" name="nav" type="nav_node"><remap from="cmd_vel" to="PC2_cmd_vel"/> <!-- PC2的控制话题 -->
</node>
二,跨设备通信
我们将各PC端连接到同一个ROS Master下之后,它们的话题服务等就都是一样的了,设备之间就可以同步发布话题,订阅话题等进行数据之间的交换,与一个PC端各节点之间订阅话题是一样的
以话题为例(服务一样)
PC1发布话题/cmd_vel
# PC1的节点
pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
PC2订阅同一话题
# PC2的节点
rospy.Subscriber('/cmd_vel', Twist, callback)
三,工作空间同步
通过 rsync
将 PC1 的工作空间完整拷贝到 PC2。注意PC2 需安装与 PC1 相同版本的 ROS 和系统依赖(如 Ubuntu 20.04 + ROS Noetic
)。
# 在 PC1 上执行(同步到 PC2)
rsync -avz ~/catkin_ws/ user@192.168.1.101:~/catkin_ws/
rsync
会将 PC1 的 ~/catkin_ws/
目录(包括源代码、编译生成的节点和消息)同步到 PC2 的相同路径下。PC2 的工作空间内容与 PC1 完全一致(包括编译后的可执行文件)。PC2 可以直接运行 功能包中的节点,无需重新编译。
# 在 PC1 上执行(将工作空间同步到 PC2)
rsync -avz --delete ~/catkin_ws/ user@192.168.1.101:~/catkin_ws/
-
参数说明:
-
-a
:归档模式(保留权限、符号链接等)。 -
-v
:显示同步详情。 -
-z
:压缩传输数据。 -
--delete
:删除 PC2 上多余的文件(保持严格一致)。
-
如果 PC1 修改了代码,需重新运行 rsync
同步到 PC2,可以搭配 inotifywait
工具实现自动同步。
除此之外,也可以仅同步必要的功能包,如下:
rsync -avz ~/catkin_ws/src/navigation_pkg/ user@192.168.1.101:~/catkin_ws/src/navigation_pkg/
# 在 PC2 上单独编译该包:
cd ~/catkin_ws/ && catkin_make --pkg navigation_pkg
相关文章:
ROS多设备交互
ROS多设备连接同一个Master:ROS Master多设备连接-CSDN博客 在多个PC端连接同一个ROS Master后,接下来就可以实现不同设备之间的话题交流,Master主机端启动不同PC端的功能包等功能了 尽管多个PC端拥有不同的ROS工作空间,但是只要…...
浅谈 MVVM 模式
MVVM(Model-View-ViewModel) 是一种软件架构设计模式,旨在将用户界面(UI)与业务逻辑分离,从而提高代码的可维护性和可测试性。它在现代前端开发和桌面应用开发中得到了广泛应用,尤其是在构建复杂…...
flutter点击事件教程
在 Flutter 中,处理点击事件是非常常见的操作。Flutter 提供了多种方式来实现用户交互,比如按钮点击、手势检测等。下面是一个详细的教程,帮助你理解如何在 Flutter 中实现点击事件。 一、使用 onPressed 实现按钮点击事件 Flutter 提供了 E…...
[SAP SD] 常用事务码
在SAP系统中,事务码(Transaction Code)是一个具有特定功能的代码标识符,用于快速调用和执行SAP系统内的各种业务模块的功能 /NT-code: 关闭当前业务窗口,退回到SAP初始界面,进入对应的T-Code窗口 /OT-code: 新建SAP GUI窗口&…...
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 的未来:从微服务到云原生的演进
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、引子&…...
保留格式地一键翻译英文ppt
我手头上有一个贝叶斯推断的英文ppt,假如我想翻译成中文,整合起来进行pre,你会怎么做? 1,复制粘贴型: 在翻译软件与源文件ppt之间不断流转,效率太低 2,office ppt自带翻译插入整合…...
晶晨S905L3S/S905L3SB_安卓9.0_10秒开机_通刷-线刷固件包
晶晨S905L3S/S905L3SB_安卓9.0_10秒开机_通刷-线刷固件包 线刷方法:(新手参考借鉴一下) 使用晶晨刷机工具USB_Burning_Tool进行刷机;请使用Amlogic USB Burning Tool v2.2.5或v2.2.7(晶晨线刷烧录工具v2.2…...
Android Transition转场动效使用全解析
Transition的使用和原理 项目效果 1. 简述 Android 4.4.2 中引入了 Transition 过渡动画,不过功能比较简单。在 Android 5.0 的 Material Design 中引入更完整和强大的 Transition 框架。通过Transition可以实现: 同一个页面中的场景过渡动画Activit…...
第九章Python语言高阶加强-面向对象篇
目录 一.初始对象 二.成员方法 1.成员变量和成员方法 三.类和对象 四.构造方法 五.其他内置方法(魔术方法) 1.__str__字符串方法 2.__lt__小于符号比较方法 3.__le__小于等于比较符号方法 4.__eq__比较运算符实现方法 六.封装 七.继承 1.继承…...
AI重构SEO关键词智能布局
内容概要 随着人工智能技术在搜索引擎优化领域的深入发展,AI驱动的关键词智能布局正在重塑传统SEO策略的核心逻辑。通过整合自然语言处理、深度学习与语义分析技术,现代SEO系统已形成包含智能分词、意图解码、动态优化的三维技术框架,使关键…...
言同数字:法新社AFP海外新闻媒体发稿成功案例——出海品牌背书必备
作者:言同数字全球传播团队 一、品牌困境:当中国技术遇上海外认知壁垒 案例背景: 某中国光伏储能企业(应保密要求匿名,代号"GreenTech"),其家用储能系统在欧洲市场遭遇࿱…...
第三章 react redux的学习之redux和react-redux,@reduxjs/toolkit依赖结合使用
redux系列文章目录 第一章 简单学习redux,单个reducer 第二章 简单学习redux,多个reducer 第四章 react-redux,reduxjs/toolkit依赖,学习 第五章 两张图告诉你redux常使用的api有哪些 前言 前面两章,我们是只使用的redux的依赖。 本章…...
【HTML】纯前端网页小游戏-戳破彩泡
分享一个简单有趣的网页小游戏 - 彩色泡泡爆破。玩家需要点击屏幕上随机出现的彩色泡泡来得分。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…...
【Python使用】嘿马云课堂web完整实战项目第3篇:增加数据,修改数据【附代码文档】
教程总体简介:项目概述 项目背景 项目的功能构架 项目的技术架构 CMS 什么是CMS CMS需求分析与工程搭建 静态门户工程搭建 SSI服务端包含技术 页面预览开发 4 添加“页面预览”链接 页面发布 需求分析 技术方案 测试 环境搭建 数据字典 服务端 前端 数据模型 页面原…...
数据结构【栈和队列附顺序表应用算法】
栈和队列和顺序表应用算法练习 1.栈1.1概念与结构1.2栈的实现 2.队列2.1概念与结构2.2队列的实现 3.附(顺序表应用算法)3.1移除元素3.2删除有序数组中的重复项3.3合并两个有序数组 1.栈 1.1概念与结构 栈:⼀种特殊的线性表,其只…...
Redis数据结构之String
目录 1.概述2.常见操作2.1 SET/GET2.2 MSET/MGET/MSETNX2.3 GETRANGE/SETRANGE2.4 INCR(BY)/DECR(BY)2.5 STRLEN2.6 APPEND2.7 GETSET 3.小结 1.概述 String是最常用的数据类型,一个key对应一个value。String是二进制安全的,可以包含任何数据࿰…...
Maven 远程仓库推送方法
步骤 1:配置 pom.xml 中的远程仓库地址 在项目的 pom.xml 文件中添加 distributionManagement 配置,指定远程仓库的 URL。 xml 复制 <project>...<distributionManagement><!-- 快照版本仓库 --><snapshotRepository><id…...
uname
在 C 语言中,uname 函数用于获取当前操作系统的相关信息。 它是 POSIX 标准的一部分,定义在 <sys/utsname.h> 头文件中。 通过调用 uname 函数,可以获取系统名称、节点名称(主机名)、操作系统版本、机器硬件架构…...
【无标题】object,wait,notifyAll
在 Java 中,Object类提供了wait()方法,用于线程间的协作和同步。wait()方法使得当前线程暂停执行,并释放当前对象的锁,直到其他线程调用该对象的notify()或notifyAll()方法将其唤醒。这是实现线程间通信和同步的重要机制之一。 w…...
【Vue】 核心特性实战解析:computed、watch、条件渲染与列表渲染
目录 一、计算属性(computed) ✅ 示例: 计算属性-methods实现:在插值模块里,实现函数的调用功能 计算属性-computed的实现: 计算属性-简写: ✅ 特点: ⚠️ 与 methods 的区别…...
精品可编辑PPT | 基于湖仓一体构建数据中台架构大数据湖数据仓库一体化中台解决方案
本文介绍了基于湖仓一体构建数据中台架构的技术创新与实践。它详细阐述了数据湖、数据仓库和数据中台的概念,分析了三者的区别与协作关系,指出数据湖可存储大规模结构化和非结构化数据,数据仓库用于高效存储和快速查询以支持决策,…...
基于Python网络爬虫的智能音乐可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,智能音乐可视化系统当然不能排除在外。我本次开发的基于网络爬虫的智能音乐可视化系统是在实际应用和软件工程的开发原理之上,…...
基于STM32与应变片的协作机械臂力反馈控制系统设计与实现----2.2 机械臂控制系统硬件架构设计
2.2 机械臂控制系统硬件架构设计 一、总体架构拓扑 1.1 典型三级硬件架构 #mermaid-svg-MWmxD3zX6bu4iFCv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MWmxD3zX6bu4iFCv .error-icon{fill:#552222;}#mermaid-s…...
在线记事本——支持Markdown
项目地址 https://github.com/Anyuersuper/CloudNotebook 百度网盘 通过网盘分享的文件:CloudNotebook-master.zip 链接: https://pan.baidu.com/s/1kd2qNvm0eXc6_7oYDR769A?pwdyuer 提取码: yuer 📝 云笔记 (Cloud Notebook) 云笔记是一个简洁、安全…...
DDPM 做了什么
本博客主要侧重点在于HOW也就是DDPM怎么做的而不是WHY为什么要这样做 那么第一个问题DDPM做了一件什么事:这个算法通过逐渐向原图像添加噪声来破坏图像,然后再学习如何从噪声成恢复图像。 第二件事如何做到的:通过训练一个网络,…...
Redis数据结构之List
目录 1.概述2.常见操作2.1 LPUSH/RPUSH/LRANGE2.2 LPOP/RPOP2.3 LINDEX2.4 LLEN2.5 LREM2.6 LTRIM2.7 RPOPLPUSH2.8 LSET2.9 LINSERT 1.概述 List是简单的字符串列表,单key多个value,按照插入顺序排序。 支持添加一个元素到列表的头部(左边)或者尾部(右…...
L2-023 图着色问题 #DFS C++邻接矩阵存图
文章目录 题目解读输入格式输出格式 思路Ac CODE 参考 题目解读 给定一个无向图V,询问是否可以用K种颜色为V中每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色 输入格式 第一行给出V,E,K, 分别代表无向图的顶点,…...
架构下的按钮效果设置
以下是一个完整的跨QML/Qt Widgets的主题方案实现,包含对按钮阴影的统一管理: 一、项目结构 Project/ ├── core/ │ ├── thememanager.h │ └── thememanager.cpp ├── widgets/ │ ├── mainwindow.h │ ├── mainwindow.cpp …...
Unhandled exception: org.apache.poi.openxml4j.exceptions.InvalidFormatException
代码在main方法里面没有报错,在Controller里面就报错了。 原来Controller类里面少了行代码 import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 加上去就解决了。...
Vue2_Vue.js教程
目录 一、Vue.js安装 1、独立版本 2、CDN 方法 3、npm 方法 二、Vue Al编程助手 三、Vue.js目录结构 目录解析 四、Vue.js 起步 1.如何定义数据对象和方法并渲染进页面 五、Vue.js 模板语法 插值 文本_{{}} Html_v-html 指令 属性_v-bind (数据传输工具)指令 表…...
2025/4/2 心得
第一题 题目描述 给定1001个范围在[1,1000]的数字,保证只有1个数字重复出现2次,其余数字只出现1次。试用O(n)时间复杂度来求出出现2次的这个数字。 不允许用数组 输入格式 第一行:一个整数1001; 第二行:1001个用…...
Deep Reinforcement Learning for Robotics翻译解读
a. 机器人能力 1 单机器人能力(Single-robot competencies) 运动能力(Mobility) 行走(Locomotion)导航(Navigation) 操作能力(Manipulation) 静态操作&…...
【Linux】日志模块实现详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
AT_abc212_d [ABC212D] Querying Multiset
链接:AT_abc212_d [ABC212D] Querying Multiset - 洛谷 题目描述 高橋君は何も書かれていないたくさんのボールと 1 つの袋を持っています。 最初、袋は空で、高橋君は Q 回の操作を行います。 それぞれの操作は以下の 3 種類のうちのいずれかです。 操作 1 : ま…...
Android使用OpenGL和MediaCodec录制
目录 一,什么是opengl 二,什么是Android OpenGL ES 三, OpenGL 绘制流程 四, OpenGL坐标系 五, OpenGL 着色器 六, GLSL编程语言 七,使用MediaCodec录制在Opengl中渲染架构 八,代码实现 8.1 自定义渲染view继承GLSurfaceView 8.2 自定义渲染器TigerRender 8.3 创建编…...
Java 实现插入排序:[通俗易懂的排序算法系列之三]
引言 大家好!欢迎继续关注我的排序算法系列。今天,我们要学习的是另一种非常基础且重要的排序算法——插入排序 (Insertion Sort)。 插入排序的思路非常贴近我们日常整理扑克牌的方式,理解起来相对自然。虽然它在最坏情况下的效率不高&…...
HarmonyOS:WebView 控制及 H5 原生交互实现
一、效果展示 二、技术栈 技术栈: 编程语言:使用 TypeScript 进行开发,借助其类型系统提升代码的可读性与稳定性。 框架与库:基于鸿蒙系统相关框架(如kit.ArkWeb、hadss/hmrouter)…...
250405-VSCode编辑launch.json实现Debug调试Open-WebUI
A. 最终效果 根据__init__.py配置launch.json 根据中utils/chat.py中form_data的messages [{role: user, content: 唐老鸭}],可以找到用户输入,进而通过关键词或模型调用的方式,对敏感问题进行特殊处理。 B. 文件配置 launch.json // { // /…...
SQL Server 数据库实验报告
1.1 实验题目:索引和数据完整性的使用 1.2 实验目的: (1)掌握SQL Server的资源管理器界面应用; (2)掌握索引的使用; (3)掌握数据完整性的…...
【寻找Linux的奥秘】第三章:基础开发工具(上)
请君浏览 前言1. 软件包管理器1.1 linux中安装软件1.2 yum的具体操作1.2.1 查找软件包1.2.2 安装软件1.2.3 卸载软件 1.3 小结 2. 编辑器vim2.1 vim的基本概念和操作2.2 命令模式的命令集光标定位其他命令模式切换(常用的) 2.3 末⾏模式的命令集2.4 小结…...
Photoshop 2025 Mac中文Ps图像编辑
Photoshop 2025 Mac中文Ps图像编辑 文章目录 Photoshop 2025 Mac中文Ps图像编辑一、介绍二、效果三、下载 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用,通过智能抠图、自动修复、图像生成等功能…...
#SVA语法滴水穿石# (004)关于 ended 和 triggered 用法
在 SystemVerilog 断言(SVA, SystemVerilog Assertions)中,ended 是一个用于 序列(sequence) 的关键字,它表示某个序列(sequence)在特定时间点已经成功匹配(即“结束”)。 ended 主要用于 同步不同序列的时间关系,尤其是在多序列组合或属性(property)中需要对齐时…...
16.1Linux自带的LED灯驱动实验(知识)_csdn
前面我们都是自己编写 LED 灯驱动,其实像 LED 灯这样非常基础的设备驱动, Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 platform 框架,因此我们只需要按照要求在设备树文件中添加相应的 LED 节点即可,本章我们就来学习如…...
普通类、抽象类和接口的区别
1. 普通类 (Concrete Class) 定义:完整的类,可以直接实例化 特点: 可以包含属性、普通方法(有具体实现)和构造方法 可以被直接实例化创建对象 可以被继承(除非用final修饰) 示例࿱…...
使用 Elastic 实现端到端的大语言模型(LLM)可观测性:洞察生成式 AI 应用这个不透明的世界
作者:来自 Elastic Daniela Tzvetkova 及 Bahubali Shetti 在快速发展的人工智能领域,大语言模型(Large Language Models - LLMs)已成为创新的灯塔,为各行各业带来了前所未有的能力。从生成类人文本、翻译语言到提供个…...
15.2linux设备树下的platform驱动编写(程序)_csdn
我尽量讲的更详细,为了关注我的粉丝!!! 修改设备树文件: 这个我们在上一章已经写过了,但是还是带着大家来重写一遍! 1.打开pinctrl-stm32.c 这个文件: strict 成员变量默认为 true&…...
Java的Selenium的特殊元素操作与定位之window切换
当你要操作另外一个窗口页面的元素时,一定要注意先切换窗口 切换方式:传入要操作窗口的name或者句柄handle driver.switchTo.window(nameOrHandle); 如何获取到窗口的句柄 driver.getWindowHandle();//获取当前操作窗口的句柄driver.getWindowHandles();//获取测…...
【Rust学习】Rust环境搭建和Rust基础语法
本文专栏:Rust学习 目录 一,Rust环境搭建 1,C环境安装 2,Rust下载 3,Rust安装 4,Rust环境检测 二,创建Rust项目 1,rustc 2,cargo 三,输出到命令行 …...
在windows环境下通过docker-compose脚本自动创建mysql和redis
一、环境版本 在windows环境下通过docker容器运行各种服务,使用的软件版本如下: docker desktop :V4.39.0 【docker的安装环境设置略】 mysql:9.2 redis:7.4.2 二、各配置文件 1.已经解决了字符集和排序规则问题造成…...
【玩泰山派】2、制作buildroot镜像,并烧录
文章目录 前言制作buildroot镜像过程搭建环境(docker版)下载泰山派开发的sdk利用制作的镜像和下载的sdk去启动开发docker容器编译buildroot镜像 参考 前言 泰山派官方提供了不少现成的镜像 但是都买了泰山派了,肯定是想自己编译折腾下&…...