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

【仿真】ruckig在线轨迹生成器示例

该场景说明了使用 CoppeliaSim 中提供的 Ruckig 在线轨迹生成功能的各种方法:

1. 在线程脚本内使用单个阻塞函数(红色)

2. 在线程脚本中使用多个非阻塞函数(黄色)

3. 在非线程脚本中使用多个非阻塞函数(蓝色)

4.使用关节回调函数(绿色) 

-- 红色圆柱体  -- 线程化子脚本,使用sim.moveToPose:

-- 引入sim库
sim = require 'sim'-- Threaded child script, using sim.moveToPose:
-- 线程化子脚本,使用sim.moveToPose:function sysCall_init()-- 获取当前对象句柄h = sim.getObject('.')-- 获取速度图形对象句柄graph = sim.getObject('/Object_Velocity_Graph')-- 创建图形流stream = sim.addGraphStream(graph, 'Red cylinder', 'm/s', 0, {1, 0, 0})-- 设置图形流的变换   对图形流进行原始类型的变换,不进行缩放,但在垂直方向上偏移了0.0002个单位。-- graph: 图形对象的句柄,表示图形流所属的图形对象。-- stream: 图形流的句柄,表示要设置变换的图形流。-- sim.stream_transf_raw: 表示变换的类型,这里使用原始类型。-- 1: 表示缩放比例的因子,这里为1,表示不进行缩放。-- 0.0002: 表示平移的偏移量,这里设置为0.0002,表示在图形流上方偏移0.0002个单位。sim.setGraphStreamTransformation(graph, stream, sim.stream_transf_raw, 1, 0.0002)
endfunction sysCall_sensing()-- 获取对象速度的第三个分量(在z轴上的速度)sim.setGraphStreamValue(graph, stream, sim.getObjectVelocity(h)[3])--获取对象在Z方向速度
endfunction cb(tr, vel, accel, handle)-- 设置对象的姿态sim.setObjectPose(handle, tr)
endfunction sysCall_thread()-- 定义最大速度local maxVel = {0.02, 0.02, 0.02, 0.2}  -- vx, vy, vz in m/s, Vtheta is rad/s-- 定义最大加速度local maxAccel = {0.002, 0.002, 0.002, 0.02}  -- ax, ay, az in m/s^2, Atheta is rad/s^2-- 定义最大加加速度(在RML类型2下被忽略,即无穷大)local maxJerk = {0.001, 0.001, 0.001, 0.01}  -- is ignored (i.e. infinite) with RML type 2-- 获取起始姿态local startTr = sim.getObjectPose(h)-- 复制起始姿态作为目标姿态local goalTr = sim.copyTable(startTr)-- 将目标姿态的z分量增加0.5goalTr[3] = goalTr[3] + 0.5-- 使用sim.moveToPose移动到目标姿态   使机器人从当前姿态 (startTr) 移动到目标姿态 (goalTr),在移动过程中受到了速度、加速度和加加速度的限制,并在运动完成后调用回调函数 cb 来设置对象的姿态。-- -1: 表示移动的方式。在这里,-1 表示使用默认的移动方式,即线性插值。-- startTr: 表示起始姿态,即机器人当前的姿态。-- maxVel: 表示最大速度的限制,是一个包含四个元素的表,分别对应 x、y、z 方向的线速度和绕姿态的角速度。-- maxAccel: 表示最大加速度的限制,同样是一个包含四个元素的表,分别对应 x、y、z 方向的线加速度和绕姿态的角加速度。-- maxJerk: 表示最大加加速度的限制,同样是一个包含四个元素的表,但在这里被忽略,因为 RML (Robotics Motion Library) 类型 2 下其值被视为无穷大。-- goalTr: 表示目标姿态,即机器人要达到的目标位置和姿态。-- cb: 表示在运动完成后的回调函数,即运动结束后会调用此函数,这里是 cb(tr, vel, accel, handle)。-- h: 表示机器人对象的句柄,即要执行移动操作的对象。sim.moveToPose(-1, startTr, maxVel, maxAccel, maxJerk, goalTr, cb, h)
end

-- 红色关节  -- 线程化子脚本,使用sim.moveToConfig:

-- 引入sim库
sim = require 'sim'-- Threaded child script, using sim.moveToConfig:
-- 线程化子脚本,使用sim.moveToConfig:function sysCall_init()-- 获取当前对象句柄h = sim.getObject('.')-- 获取关节速度图形对象句柄graph = sim.getObject('/Joint_Velocity_Graph')-- 创建图形流stream = sim.addGraphStream(graph, 'Red joint', 'deg/s', 0, {1, 0, 0})-- 设置图形流的变换sim.setGraphStreamTransformation(graph, stream, sim.stream_transf_raw, 1, 0.02)
endfunction sysCall_sensing()-- 获取关节速度并将其转换为度/秒sim.setGraphStreamValue(graph, stream, sim.getJointVelocity(h) * 180 / math.pi)
endfunction cb(config, vel, accel, handle)-- 设置关节的位置sim.setJointPosition(handle, config[1])
endfunction sysCall_thread()-- 定义最大关节速度maxVel = 0.1 -- 弧度/秒-- 定义最大关节加速度maxAccel = 0.01 -- 弧度/秒^2-- 定义最大关节加加速度maxJerk = 0.001 -- 弧度/秒^3-- 移动到目标关节配置  使机器人的第一个关节从当前位置移动到目标位置0弧度,并受到了关节速度、关节加速度和关节加加速度的限制,在运动完成后调用回调函数 cb 来设置关节的位置。-- -1: 表示移动的方式。在这里,-1 表示使用默认的移动方式,即线性插值。-- {0}: 表示目标关节的配置,这里是一个包含一个元素的表,表示第一个关节的目标位置为0弧度。-- nil, nil: 表示不设置目标速度和目标加速度。-- {maxVel}: 表示最大关节速度的限制,是一个包含一个元素的表,表示第一个关节的最大速度。-- {maxAccel}: 表示最大关节加速度的限制,是一个包含一个元素的表,表示第一个关节的最大加速度。-- {maxJerk}: 表示最大关节加加速度的限制,是一个包含一个元素的表,表示第一个关节的最大加加速度。-- {179 * math.pi / 180}: 表示目标关节的位置范围,这里设置为179度转换为弧度。-- {0}: 表示不设置目标关节的速度。-- cb: 表示在运动完成后的回调函数,即运动结束后会调用此函数,这里是 cb(config, vel, accel, handle)。-- h: 表示机器人对象的句柄,即要执行移动操作的对象。sim.moveToConfig(-1, {0}, nil, nil, {maxVel}, {maxAccel}, {maxJerk}, {179 * math.pi / 180}, {0}, cb, h)
end

-- 黄色圆柱   -- 线程化子脚本,使用sim.ruckigPos和sim.ruckigStep:

-- 引入sim库
sim = require 'sim'-- Threaded child script, using sim.ruckigPos and sim.ruckigStep:
-- 线程化子脚本,使用sim.ruckigPos和sim.ruckigStep:function sysCall_init()-- 获取当前对象句柄h = sim.getObject('.')-- 获取速度图形对象句柄graph = sim.getObject('/Object_Velocity_Graph')-- 创建图形流stream = sim.addGraphStream(graph, 'Yellow cylinder', 'm/s', 0, {1, 1, 0})-- 设置图形流的变换sim.setGraphStreamTransformation(graph, stream, sim.stream_transf_raw, 1, 0.0001)
endfunction sysCall_sensing()-- 获取对象速度的第三个分量(在z轴上的速度)sim.setGraphStreamValue(graph, stream, sim.getObjectVelocity(h)[3])
endfunction sysCall_thread()-- 获取对象当前位置local p = sim.getObjectPosition(h)-- 构建当前位置、速度、加速度信息的表local currentPosVelAccel = {p[1], p[2], p[3], 0, 0, 0, 0, 0, 0}-- 定义最大速度、加速度、加加速度信息的表local maxVelAccelJerk = {0.02, 0.02, 0.02, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001} -- vx, vy, vz in m/s, ax, ay, az in m/s^2, jx, jy, jz is ignored (i.e. infinite) with RML type 2-- 定义目标位置和速度信息的表local targetPosVel = {p[1], p[2], p[3] + 0.5, 0, 0, 0} -- x, y, z in m, vx, vy, vz in m/s-- 创建Ruckig对象并初始化  创建一个用于进行三维运动规划的Ruckig对象,并初始化其参数。-- 3: 表示运动的维度,这里为3,表示是三维运动。-- 0.0001: 表示最小步长,即运动规划的最小时间间隔。-- -1: 表示运动类型。在这里,-1 表示使用默认的运动类型,即 RML (Robotics Motion Library) 类型 2。-- currentPosVelAccel: 表示当前位置、速度、加速度信息的表,包含9个元素,依次是x、y、z位置,线速度,角速度,线加速度,角加速度。-- maxVelAccelJerk: 表示最大速度、加速度、加加速度信息的表,包含9个元素,依次是x、y、z方向的最大速度、加速度和加加速度。-- {1, 1, 1}: 表示是否考虑每个维度的运动限制,这里都设置为1表示考虑所有维度的运动限制。-- targetPosVel: 表示目标位置和速度信息的表,包含6个元素,依次是x、y、z位置,线速度,角速度,线加速度。local rmlObject = sim.ruckigPos(3, 0.0001, -1, currentPosVelAccel, maxVelAccelJerk, {1, 1, 1}, targetPosVel)-- 启用步进模式local lb = sim.setStepping(true)result = 0while result == 0 do-- 在每个模拟步长内执行Ruckig运动规划的一步result, newPosVelAccel = sim.ruckigStep(rmlObject, sim.getSimulationTimeStep())if result ~= -1 then-- 更新对象的位置sim.setObjectPosition(h, newPosVelAccel)end-- 推进仿真sim.step()end-- 恢复仿真步进模式状态sim.setStepping(lb)-- 移除Ruckig对象sim.ruckigRemove(rmlObject)
end

--黄色关节   -- 线程化子脚本,使用sim.ruckigPos和sim.ruckigStep:

-- 引入sim库
sim = require 'sim'-- Threaded child script, using sim.ruckigPos and sim.ruckigStep:
-- 线程化子脚本,使用sim.ruckigPos和sim.ruckigStep:function sysCall_init()-- 获取当前对象句柄h = sim.getObject('.')-- 获取关节速度图形对象句柄graph = sim.getObject('/Joint_Velocity_Graph')-- 创建图形流stream = sim.addGraphStream(graph, 'Yellow joint', 'deg/s', 0, {1, 1, 0})-- 设置图形流的变换sim.setGraphStreamTransformation(graph, stream, sim.stream_transf_raw, 1, 0.01)
endfunction sysCall_sensing()-- 获取关节速度并将其转换为度/秒sim.setGraphStreamValue(graph, stream, sim.getJointVelocity(h) * 180 / math.pi)
endfunction sysCall_thread()-- 定义最大关节速度maxVel = 0.1 -- 弧度/秒-- 定义最大关节加速度maxAccel = 0.01 -- 弧度/秒^2-- 定义最大关节加加速度maxJerk = 0.001 -- 弧度/秒^3-- 创建Ruckig对象并初始化  创建一个用于进行单轴关节运动规划的Ruckig对象,并初始化其参数。-- 1: 表示运动的维度,这里为1,表示是单轴运动(关节运动)。-- 0.0001: 表示最小步长,即运动规划的最小时间间隔。-- -1: 表示运动类型。在这里,-1 表示使用默认的运动类型,即 RML (Robotics Motion Library) 类型 2。-- {0, 0, 0}: 表示当前位置、速度、加速度信息的表,包含3个元素,依次是关节的当前位置、速度和加速度。-- {maxVel, maxAccel, maxJerk}: 表示最大速度、加速度、加加速度信息的表,包含3个元素,依次是关节的最大速度、加速度和加加速度。-- {1}: 表示是否考虑每个维度的运动限制,这里设置为1表示考虑所有维度的运动限制。-- {179 * math.pi / 180, 0, 0}: 表示目标位置、速度、加速度信息的表,包含3个元素,依次是关节的目标位置、速度和加速度。这里将179度转换为弧度。rmlObject = sim.ruckigPos(1, 0.0001, -1, {0, 0, 0}, {maxVel, maxAccel, maxJerk}, {1}, {179 * math.pi / 180, 0, 0})-- 启用步进模式local lb = sim.setStepping(true)result = 0while result == 0 do-- 在每个模拟步长内执行Ruckig运动规划的一步result, newPosVelAccel = sim.ruckigStep(rmlObject, sim.getSimulationTimeStep())if result ~= -1 then-- 更新关节的位置sim.setJointPosition(h, newPosVelAccel[1]) -- 或者根据关节模式使用 sim.setJointTargetPositionend-- 推进仿真sim.step()end-- 恢复仿真步进模式状态sim.setStepping(lb)-- 移除Ruckig对象sim.ruckigRemove(rmlObject)
end

--蓝色圆柱体    -- 非线程化子脚本,使用sim.ruckigPos和sim.ruckigStep:

function sysCall_init()-- 获取当前对象句柄h = sim.getObject('.')-- 获取速度图形对象句柄graph = sim.getObject('/Object_Velocity_Graph')-- 创建图形流stream = sim.addGraphStream(graph, 'Blue cylinder', 'm/s', 0, {0, 0.5, 1})-- 获取对象当前位置local p = sim.getObjectPosition(h)-- 构建当前位置、速度、加速度信息的表local currentPosVelAccel = {p[1], p[2], p[3], 0, 0, 0, 0, 0, 0}-- 定义最大速度、加速度、加加速度信息的表local maxVelAccelJerk = {0.02, 0.02, 0.02, 0.002, 0.002, 0.002, 0.001, 0.001, 0.001} -- vx, vy, vz in m/s, ax, ay, az in m/s^2, jx, jy, jz is ignored (i.e. infinite) with RML type 2-- 定义目标位置和速度信息的表local targetPosVel = {p[1], p[2], p[3] + 0.5, 0, 0, 0} -- x, y, z in m, vx, vy, vz in m/s-- 创建Ruckig对象并初始化rmlObject = sim.ruckigPos(3, 0.0001, -1, currentPosVelAccel, maxVelAccelJerk, {1, 1, 1}, targetPosVel)
endfunction sysCall_sensing()-- 获取对象速度的第三个分量(在z轴上的速度)sim.setGraphStreamValue(graph, stream, sim.getObjectVelocity(h)[3])
endfunction sysCall_actuation()-- 如果Ruckig对象存在,则执行一步运动规划if rmlObject thenlocal result, newPosVelAccel = sim.ruckigStep(rmlObject, sim.getSimulationTimeStep())-- 如果运动规划成功,则更新对象的位置if result ~= -1 thensim.setObjectPosition(h, newPosVelAccel)end-- 如果运动规划完成或出错,则移除Ruckig对象if result == 1 or result == -1 thensim.ruckigRemove(rmlObject)rmlObject = nilendend
endfunction sysCall_cleanup()-- 在清理阶段,确保移除Ruckig对象if rmlObject thensim.ruckigRemove(rmlObject)end
end

--蓝色关节   -- 非线程化子脚本,使用sim.ruckigPos和sim.ruckigStep:

function sysCall_init()-- 获取当前关节对象句柄h = sim.getObject('.')-- 获取关节速度图形对象句柄graph = sim.getObject('/Joint_Velocity_Graph')-- 创建图形流stream = sim.addGraphStream(graph, 'Blue joint', 'deg/s', 0, {0, 0.5, 1})-- 定义最大关节速度maxVel = 0.1 -- 弧度/秒-- 定义最大关节加速度maxAccel = 0.01 -- 弧度/秒^2-- 定义最大关节加加速度maxJerk = 0.001 -- 弧度/秒^3-- 创建Ruckig对象并初始化rmlObject = sim.ruckigPos(1, 0.0001, -1, {0, 0, 0}, {maxVel, maxAccel, maxJerk}, {1}, {179 * math.pi / 180, 0, 0})
endfunction sysCall_sensing()-- 获取关节速度并将其转换为度/秒sim.setGraphStreamValue(graph, stream, sim.getJointVelocity(h) * 180 / math.pi)
endfunction sysCall_actuation()-- 如果Ruckig对象存在,则执行一步运动规划if rmlObject thenlocal result, newPosVelAccel = sim.ruckigStep(rmlObject, sim.getSimulationTimeStep())-- 如果运动规划成功,则更新关节的位置if result ~= -1 thensim.setJointPosition(h, newPosVelAccel[1]) -- 或者根据关节模式使用 sim.setJointTargetPositionend-- 如果运动规划完成或出错,则移除Ruckig对象if result == 1 or result == -1 thensim.ruckigRemove(rmlObject)rmlObject = nilendend
endfunction sysCall_cleanup()-- 在清理阶段,确保移除Ruckig对象if rmlObject thensim.ruckigRemove(rmlObject)end
end

--绿色关节 -- 线程化子脚本,使用sim.moveToConfig:

function sysCall_init()-- 获取当前关节对象句柄h = sim.getObject('.')-- 获取关节速度图形对象句柄graph = sim.getObject('/Joint_Velocity_Graph')-- 创建图形流stream = sim.addGraphStream(graph, 'Green joint', 'deg/s', 0, {0, 1, 0})-- 设置图形流的变换sim.setGraphStreamTransformation(graph, stream, sim.stream_transf_raw, 1, -0.01)
endfunction sysCall_sensing()-- 获取关节速度并将其转换为度/秒sim.setGraphStreamValue(graph, stream, sim.getJointVelocity(h) * 180 / math.pi)
endfunction sysCall_thread()-- 定义最大关节速度maxVel = 0.1 -- 弧度/秒-- 定义最大关节加速度maxAccel = 0.01 -- 弧度/秒^2-- 定义最大关节加加速度maxJerk = 0.001 -- 弧度/秒^3-- 通过设置关节的目标位置,触发关节的回调函数sim.setJointTargetPosition(h, 179 * math.pi / 180, {maxVel, maxAccel, maxJerk})
endfunction sysCall_joint(inData)-- 用户可以在这里自由实现回调函数-- 由于该函数没有返回任何值,调用将被重定向到场景层次结构的上层-- 并最终由主脚本中的默认关节回调函数处理
end

相关文章:

【仿真】ruckig在线轨迹生成器示例

该场景说明了使用 CoppeliaSim 中提供的 Ruckig 在线轨迹生成功能的各种方法: 1. 在线程脚本内使用单个阻塞函数(红色) 2. 在线程脚本中使用多个非阻塞函数(黄色) 3. 在非线程脚本中使用多个非阻塞函数(…...

LeetCode 面试题 16.22. 兰顿蚂蚁

文章目录 一、题目二、C# 题解 一、题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时,网格全白,蚂蚁面向右侧。每行走一步,蚂蚁执行以下操作。 (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度…...

Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)

目录 一、从空白系统中克隆Centos7系统 二、使用xshell连接docker_tigerhhzz虚拟机​编辑 三、在CentOS7基础上安装Docker容器 四、在Docker中进行安装Portainer 4.1、在Docker中安装MySQL 4.2、在Docker中安装JDK8,安装Java环境 4.3、Docker安装redis&#…...

科研学习|研究方法——Python计量Logit模型

一、离散选择模型 莎士比亚曾经说过:To be, or not to be, that is the question,这就是典型的离散选择模型。如果被解释变量时离散的,而非连续的,称为“离散选择模型”。例如,消费者在购买汽车的时候通常会比较几个不…...

灵活运用Vue指令:探究v-if和v-for的使用技巧和注意事项

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、作…...

nvidia-docker部署pytorch服务【GPU工作站】

文章目录 一、安装 Docker二、安装 NVIDIA Container Toolkit三、宿主机安装 cuda 和 nvidia-driver四、测试一、安装 Docker 可以参考这篇文章 https://blog.csdn.net/weixin_43721000/article/details/124237932 二、安装 NVIDIA Container Toolkit 参考nvidia官方 https:/…...

单链表的实现

CSDN主页:醋溜马桶圈_C语言进阶,初始C语言,数据结构-CSDN博客 Gitee主页:mnxcc (mnxcc) - Gitee.com 专栏:数据结构_醋溜马桶圈的博客-CSDN博客 目录 1.认识单链表 2.创建单链表 3.单链表的操作 3.1打印单链表 3.2开辟新空间 3.3尾插 3.4头插…...

【python】面向对象(类型定义魔法方法)

目录 一、引言 二、类型定义 1、什么是类型的定义? 2、案例 三、魔法方法 1、什么是魔法方法 2、基础部分 3、比较操作 4、容器类型 5、属性管理 6、封装 7、方法拓展 8、继承 9、多态 一、引言 Python是一种面向对象的语言,它支持类&#…...

1.微服务与SpringCloud

微服务和SpringCloud 文章目录 微服务和SpringCloud1.什么是微服务2.SpringCloud3. 微服务 VS SpringCloud4. SpringCloud 组件5.参考文档6.版本要求 1.什么是微服务 微服务是将一个大型的、单一的应用程序拆分成多个小型服务,每个服务实现特定的业务功能&#xff…...

【2023全网最全最火】Selenium WebDriver教程(建议收藏)

在本教程中,我将向您介绍 Selenium Webdriver,它是当今市场上使用最广泛的自动化测试框架。它是开源的,可与所有著名的编程语言(如Java、Python、C#、Ruby、Perl等)一起使用,以实现浏览器活动的…...

dimp 导入dmp文件报错:无效的模式名(DM8:达梦数据库)

dimp 导入dmp文件报错:无效的模式名-DM8:达梦数据库 环境介绍1 搭建A1 数据库52361.1 A1数据库5236创建模式名,表,测试数据1.2 从A1数据库5236导出dmp文件 2 搭建A2数据库52372.1 创建 数据用户ABC2311152.2 在A2 数据库5237 导入DMP(报错无效的模式名)2.3 使用REMAP_SCHEMAABC…...

宿主机无法连接docker里的redis问题解决(生产环境慎用)

宿主机无法连接docker里的redis问题解决(生产环境慎用) 问题描述解决方案 问题描述 1.连接超时 2.连接能连上但马上断开并报错 3.提示保护模式什么的 (error) DENIED Redis is running in protected mode because protected mode is enabled链接redis …...

给女朋友开发个小程序低价点外卖吃还能赚钱

前言 今天又是无聊的一天,逛了下GitHub,发现一个库里面介绍美团饿了吗外卖红包外卖优惠券,先领红包再下单。外卖红包优惠券,cps分成,别人领红包下单,你拿佣金。哇靠,那我岂不是可以省钱还可以赚钱,yyds。。。。想想都美好哈哈哈!!! 回到正题,这个是美团饿了么分销…...

外贸客户管理系统是什么?推荐的管理软件?

外贸客户管理系统哪个好用?海洋建站如何选管理系统? 外贸客户管理系统,是一款专为外贸企业设计的客户关系管理系统,旨在帮助外贸企业建立与维护客户关系,提高客户满意度和忠诚度,提升企业业绩。海洋建站将…...

数据挖掘:分类,聚类,关联关系,回归

数据挖掘: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学&…...

力扣labuladong一刷day10一网打尽股票买卖问题共6题

力扣labuladong一刷day10股票买卖问题共6题 一、121. 买卖股票的最佳时机 题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ 思路:只能买入1次,定义dp[i][0]数组表示第i天持有股票时手中的最大金额 数,…...

微信小程序手写table表格

wxml <view class"table"><view class"tr bg-w"><view class"th">张三</view><view class"th" style"color: #409eff;">李四</view><view class"th ">王五</view&…...

UE5 - UI Material Lab 学习笔记

1、学习资料收集 UI Material Lab : https://www.unrealengine.com/marketplace/zh-CN/product/ui-material-lab 视频1&#xff1a;https://www.bilibili.com/video/BV1Hm4y1t7Kn/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 视…...

oracle删除重复的数据

去除重复数据&#xff1a; group by 对要比对的字段进行查询是否重复 CREATE TABLE 临时表 AS (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1) 上面这句话就是建立了临时表&#xff0c;并将查询到的数据插入其中。 下面就可以进行…...

Python中的并发编程是什么,如何使用Python进行并发编程?

Python中的并发编程是指使用多线程或多进程来同时执行多个任务。这样可以提高程序的执行效率&#xff0c;特别是在处理I/O密集型任务时。Python提供了多种方式来实现并发编程&#xff0c;如threading模块和multiprocessing模块。 使用Python进行并发编程的方法如下&#xff1a…...

【LeetCode】136. 只出现一次的数字

136. 只出现一次的数字 难度&#xff1a;简单 题目 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用…...

HTTP服务器——tomcat的安装和使用

文章目录 前言下载tomcattomcat 文件bin 文件夹conf 文件lib 文件log 文件temp 文件webapps 文件work 目录 如何使用 tomcat 前言 前面我们已经学习了应用层协议 HTTP 协议和 HTTP 的改进版——HTTPS&#xff0c;这些协议是我们在写与服务器相关的代码的时候息息相关的&#x…...

代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和

LeetCode T1143 最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 动规五部曲分析 1.确定dp数组的含义 这里dp数组的含义是结尾分别为i-1,j-1的text1和text2的最长公共子序列长度 至于为什么是i-1,j-1我之前已经说过了,这里再…...

写了个监控 ElasticSearch 进程异常的脚本!

服务器配置免密钥环境准备&#xff1a; 配置免密钥前&#xff0c;需要在服务器的 hosts 文件中配置目标主机名称与 IP 对应关系。 vim /etc/hosts IP1 hostname1 IP2 hostname2 ...... 将 mianmiyaojiaoben.zip 安装包解压在当前目录下 cd /usr/local/jiaoben unzip mianmi…...

第三篇 基于JSP 技术的网上购书系统—— 数据库系统设计(网上商城、仿淘宝、当当、亚马逊)

目录 1.逻辑关系设计 2.物理设计 2.1管理员表 2.2留言表 2.3会员登录表 2.4会员表 2.5订单表 2.6订单商品表 2.7产品表 2.8产品货架表 2.9收藏表 2.10类别表 2.11新闻表 数据库系统是用来保存数据的软件系统&#xff0c;当今比较流行的数据库系统&#xff0c;如 MS…...

电脑检测温度软件有哪些?

环境&#xff1a; Win10 专业版 问题描述&#xff1a; 电脑检测温度软件有哪些&#xff1f; 解决方案&#xff1a; 有很多电脑检测温度的软件可供选择&#xff0c;以下是一些常用的电脑温度监测工具&#xff1a; HWMonitor&#xff1a;一款免费的硬件监控软件&#xff0…...

设计模式 -- 单例模式(Singleton Pattern)

单例模式&#xff1a;最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式…...

ubuntu给终端加代理服务器

ubuntu给终端加代理 访问google.com 是否可以访问通 curl https://www.google.com如果访问不通说明代理服务器没有配置好。 使用 gedit ~/.bashrc 打开网络配置 gedit ~/.bashrc找到文章的最后添加代理 export http_proxyhttp://127.0.0.1:7890 export https_proxyhttp://…...

centos 6.10 安装 readline 6.2.0

下载地址 解压文件 cd readline-6.2 ./configure -prefix /usr/local/readline-6.2 make && make install安装完成...

IDEA 2023搭建 SpringMVC +FreeMarker+JDBC

1.IDEA的版本&#xff0c;目前最新是2023&#xff0c;要选择旗舰版。笔者曾选择社区版&#xff0c;发现少了很多功能。只能重新安装。 2.安装好以后的第1件事&#xff0c;是设置Maven&#xff0c;并将下载地址改为淘定站&#xff0c;参照这篇一次包会——最新IDEA配置Maven指南…...