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

news2024/11/17 13:20:38

该场景说明了使用 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)
end

function sysCall_sensing()
    -- 获取对象速度的第三个分量(在z轴上的速度)
    sim.setGraphStreamValue(graph, stream, sim.getObjectVelocity(h)[3])--获取对象在Z方向速度
end

function cb(tr, vel, accel, handle)
    -- 设置对象的姿态
    sim.setObjectPose(handle, tr)
end

function 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.5
    goalTr[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)
end

function sysCall_sensing()
    -- 获取关节速度并将其转换为度/秒
    sim.setGraphStreamValue(graph, stream, sim.getJointVelocity(h) * 180 / math.pi)
end

function cb(config, vel, accel, handle)
    -- 设置关节的位置
    sim.setJointPosition(handle, config[1])
end

function 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)
end

function sysCall_sensing()
    -- 获取对象速度的第三个分量(在z轴上的速度)
    sim.setGraphStreamValue(graph, stream, sim.getObjectVelocity(h)[3])
end

function 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 = 0
    while 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)
end

function sysCall_sensing()
    -- 获取关节速度并将其转换为度/秒
    sim.setGraphStreamValue(graph, stream, sim.getJointVelocity(h) * 180 / math.pi)
end

function 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 = 0
    while result == 0 do
        -- 在每个模拟步长内执行Ruckig运动规划的一步
        result, newPosVelAccel = sim.ruckigStep(rmlObject, sim.getSimulationTimeStep())
        if result ~= -1 then
            -- 更新关节的位置
            sim.setJointPosition(h, newPosVelAccel[1]) -- 或者根据关节模式使用 sim.setJointTargetPosition
        end
        -- 推进仿真
        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)
end

function sysCall_sensing()
    -- 获取对象速度的第三个分量(在z轴上的速度)
    sim.setGraphStreamValue(graph, stream, sim.getObjectVelocity(h)[3])
end

function sysCall_actuation()
    -- 如果Ruckig对象存在,则执行一步运动规划
    if rmlObject then
        local result, newPosVelAccel = sim.ruckigStep(rmlObject, sim.getSimulationTimeStep())
        -- 如果运动规划成功,则更新对象的位置
        if result ~= -1 then
            sim.setObjectPosition(h, newPosVelAccel)
        end
        -- 如果运动规划完成或出错,则移除Ruckig对象
        if result == 1 or result == -1 then
            sim.ruckigRemove(rmlObject)
            rmlObject = nil
        end
    end
end

function sysCall_cleanup()
    -- 在清理阶段,确保移除Ruckig对象
    if rmlObject then
        sim.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})
end

function sysCall_sensing()
    -- 获取关节速度并将其转换为度/秒
    sim.setGraphStreamValue(graph, stream, sim.getJointVelocity(h) * 180 / math.pi)
end

function sysCall_actuation()
    -- 如果Ruckig对象存在,则执行一步运动规划
    if rmlObject then
        local result, newPosVelAccel = sim.ruckigStep(rmlObject, sim.getSimulationTimeStep())
        -- 如果运动规划成功,则更新关节的位置
        if result ~= -1 then
            sim.setJointPosition(h, newPosVelAccel[1]) -- 或者根据关节模式使用 sim.setJointTargetPosition
        end
        -- 如果运动规划完成或出错,则移除Ruckig对象
        if result == 1 or result == -1 then
            sim.ruckigRemove(rmlObject)
            rmlObject = nil
        end
    end
end

function sysCall_cleanup()
    -- 在清理阶段,确保移除Ruckig对象
    if rmlObject then
        sim.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)
end

function sysCall_sensing()
    -- 获取关节速度并将其转换为度/秒
    sim.setGraphStreamValue(graph, stream, sim.getJointVelocity(h) * 180 / math.pi)
end

function sysCall_thread()
    -- 定义最大关节速度
    maxVel = 0.1 -- 弧度/秒
    -- 定义最大关节加速度
    maxAccel = 0.01 -- 弧度/秒^2
    -- 定义最大关节加加速度
    maxJerk = 0.001 -- 弧度/秒^3
    -- 通过设置关节的目标位置,触发关节的回调函数
    sim.setJointTargetPosition(h, 179 * math.pi / 180, {maxVel, maxAccel, maxJerk})
end

function sysCall_joint(inData)
    -- 用户可以在这里自由实现回调函数
    -- 由于该函数没有返回任何值,调用将被重定向到场景层次结构的上层
    -- 并最终由主脚本中的默认关节回调函数处理
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1211333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

url找不到404的问题,url被拼接

今天遇到一个测试feign调用的功能,如图所示 先说结论 Controller换成RestController 将日志设置为debug模式 被DispatcherServlet FORWARD了 找到路径 对属性设置断点,看下是哪注进来的 我们再去找encodedPath 此处是undertow的源码,但是und…

实验室EM3电磁铁

锦正茂EM3电磁铁,可以通过更换电磁铁极头在一定范围内改善磁场的大小和磁场的均匀度 ,并且可以通过调整极头间距改变磁场的大小。主要用于磁滞现象研究、磁化系数测量、霍尔效应研究、磁光实验、磁场退火、核磁共振、电子顺磁共振、生物学研究、磁性测量…

ERP和MES对接都有什么方式

万界星空科技MES生产管理系统的应用比较广,在和ERP连接时,必须先掌握什么模块是和MES业务流程有关的。 通过详细介绍ERP和MES对接方式的不同特点、应用场景和操作方法,可帮助企业更好地实现信息集成,提升生产效率和质量&#xff…

excel中用NORM.INV函数计算正态累积分布的逆

NORM.INV函数返回正态累积分布的逆。它的形式为NORM.INV(probability,mean,standard_dev)。 正态累积分布函数和正态概率密度函数互为逆。 参数说明: probability:对应正态分布的累积分布值。例如该值等于0.9,表示累积概率之和是0.9Mean&am…

舞台演出控制软件:QLab Pro

QLab Pro是一款功能强大的现场多媒体控制器软件,专为Mac用户设计。它提供了一个直观简洁的用户界面,使得用户能轻松管理和组织所有的媒体资源。QLab Pro支持导入各种音频和视频文件,并具备强大的音频、视频处理和灯光控制功能,可以…

JAVA 中集合取交集

日常工作 经常需要取两个数据集的交集。对常用的List 和Set集合做了一个测试 public static void main(String[] args) {List<Integer> list1 Lists.newArrayList();List<Integer> list2 Lists.newArrayList();Set<Integer> set3 Sets.newHashSet();Set&l…

自定义windows右键菜单,软件卸载后 右键菜单残留 打开方式残留 解决方法

问题&#xff1a; 更改windows右键菜单软件卸载残留&#xff0c;其仍然出现在文件的打开方式列表&#xff0c;右键菜单中。 解决方法1&#xff1a;推荐使用registry workshop批量搜索删除注册表 绿色版&#xff1a; 蓝奏云&#xff1a;https://wwzd.lanzouw.com/iPJNp1em339…

简易搜索引擎SEWeibo

背景 有一组微博事件数据&#xff0c;之前做了一些数据分析与挖掘的工作。想着用C做一个简单的搜索引擎玩玩。 亮点&#xff1a; 搜索支持关系关键字作为搜索条件&#xff0c;以文本情感极性作为初筛条件&#xff0c;以TF-IDF为搜索排序依据以Reactor模式为基础&#xff0c;…

win10关闭讲述人、粘滞键功能的快捷键启动

简单记录下在win10关闭讲述人、粘滞键快速启动的快捷键&#xff0c;这两个功能对正常人没什么用。误触发很烦。 禁用讲述人 按windows键&#xff0c;输入“轻松使用设置”&#xff0c;点“讲述人”&#xff0c;如下图取消讲述人开关和快捷键的勾选。 禁用粘滞键 按windows…

CSGO游戏搬砖还能做吗?CSGO饰品未来走势如何?

CSGO饰品市场会崩盘吗&#xff1f;CSGO还能做多久&#xff1f; 如何看待CSGO饰品市场的整体走向&#xff1f; 从整体来说&#xff0c;CSGO的饰品市场与规模肯定会持续不断的上升&#xff0c;大盘不会发生特别大的波动&#xff0c;目前处于稳定期&#xff01;&#xff01;&…

什么是数据泄露?泄露途径有哪些?企业如何免遭数据泄露?

数据泄露指将机密信息、私人信息或其他敏感信息发布到不安全的环境中。数据泄露可能由意外引起&#xff0c;也可能是蓄意攻击的结果。 每年都有数百万人卷入数据泄露&#xff0c;包括意外看错病人图表的医生&#xff0c;以及大规模尝试访问政府计算机以发现敏感信息。 因为敏…

一文详解oa人事系统!

一、什么是OA系统 OA系统全称为Office Automation&#xff0c;即办公自动化系统。它是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台&#xff0c;具有信息管理、流程管理、知识管理&#xff08;档案和业务管理&#xff09;、协同办公等多种功能。 OA系统可以帮…

vue中bus的详细使用

vue中关于兄弟组件bus的使用方法 首先&#xff0c;bus可以用在任何组件之间的传值 废话不多说&#xff0c;请看下面代码解说 首先&#xff0c;先创建bus.js文件&#xff0c;然后在引用&#xff0c;这里有两种引用方法&#xff1a;局部引用和全局引用。 // bus.js文件内容 imp…

【Spring进阶系列丨第一篇】初识Spring开发

前言 小伙伴们大家好&#xff0c;我是陈橘又青&#xff0c;今天起 《Spring进阶系列》 开始更新。本专栏将涵盖Spring框架的核心概念、配置管理、Web开发、AOP、Boot、Security、Data、Integration和Batch等多个主题。通过理论讲解和实际案例的剖析&#xff0c;帮助读者深入理解…

南湖HIT论坛|《医疗数据安全风险分析及防范实践(2023)》正式发布

11月11日&#xff0c;2023年南湖HIT论坛在浙江嘉兴隆重举行。作为颇受HIT从业者关注的年度盛会——本届论坛以“数据驱动医院运营管理”为主题&#xff0c;全国各地医疗机构信息主管和骨干围绕“数据驱动运营管理、运营数据中心建设、数据治理和数据安全”等话题展开深入研讨。…

FPGA:我的零基础学习路线(2022秋招已上岸)持续更新中~

可内推简历&#xff0c;丝我即可 前言 初次接触FPGA是在2022年3月左右&#xff0c;正处在研二下学期&#xff0c;面临着暑假找工作&#xff0c;周围的同学大多选择了互联网&#xff0c;出于对互联网的裁员形势下&#xff0c;我选择了FPGA&#xff0c;对于硬件基础知识我几乎是…

【数据结构】堆(Heap):堆的实现、堆排序、TOP-K问题

目录 堆的概念及结构 ​编辑 堆的实现 实现堆的接口 堆的初始化 堆的打印 堆的销毁 获取最顶的根数据 交换 堆的插入&#xff08;插入最后&#xff09; 向上调整&#xff08;这次用的是小堆&#xff09; 堆的删除&#xff08;删除根&#xff09; 向下调整&#xff08;这次用的…

2013年6月26日 Go生态洞察:Go Race Detector的探索

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

centos下安装mysql8版本

1、如果服务器没有wget&#xff0c;先下载wget工具 sudo yum install wget 2、下载指定mysql版本的tar包 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.21-1.el7.x86_64.rpm-bundle.tar 3、解压tar包 sudo tar -xvf mysql-8.0.21-1.el7.x86_64.rpm…

现代浴室:从硬朗到柔美

现代浴室不再是冰冷的地方&#xff0c;而是一个温馨的角落。它是我们日常生活中的庇护所&#xff0c;一个能够唤起宁静和舒适感的地方。如今&#xff0c;浴室的设计注重的是颜色、材质、光线和表面的精心搭配&#xff0c;以创造一个柔和、温馨的空间。 与过去的硬朗陶瓷、锋利…