【仿真】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)
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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024免费的内存卡数据恢复软件EasyRecovery

内存卡删除的视频是有可能恢复的,当您在内存卡上删除视频文件时,实际上只是将该文件标记为可被覆盖,而并不是立即将其从内存卡上删除。这意味着在文件被覆盖之前,您有机会将其恢复。内存卡上的数据恢复原理有以下几点:…

【芯片设计- RTL 数字逻辑设计入门 5 -- 芯片产业 - 常见流程和术语】

文章目录 芯片产业 - 常见流程和术语角色晶圆晶圆等级工艺和阶段流片的过程和成本三大EDA厂商主流IP供应商 IC专业术语盘点(A—G)Flip-Flop 是什么?Flip-Flop 与 D触发器 芯片产业 - 常见流程和术语 角色 Foundry:在集成电路领域是…

索引的认识

目录 一、索引的介绍 介绍 为什么要引入索引: 索引的使用场景: 二、索引的优缺点 三、索引的类别 1、普通索引 2、唯一索引 3、主键索引 4、组合索引 5、全文索引 四、索引的失效与生效 五、聚集索引和非聚集索引的区别(MYSQL&…

PHP 论文发表管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 PHP 论文发表管理系统是一套完善的web设计系统mysql数据库 ,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php 论文发表系统1 代码 https://download.csdn.net/download/qq_412213…

C# Onnx 轻量实时的M-LSD直线检测

目录 介绍 效果 效果1 效果2 效果3 效果4 模型信息 项目 代码 下载 其他 介绍 github地址:https://github.com/navervision/mlsd M-LSD: Towards Light-weight and Real-time Line Segment Detection Official Tensorflow implementation of "M-…

【LeetCode:2656. K 个元素的最大和 | 贪心+等差数列】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

sql查询结果跟in传入参数顺序一致

Orcle、postgresql、td-sql中可以使用如下语句 select namefrom tbl_user_infowhere id in (4,3,1)order by instr(4,3,1,id);查询结果:

2023.11.14-hive的类SQL表操作之,4个by区别

目录 1.表操作之4个by,分别是 2.Order by:全局排序 3.Cluster by 4.Distribute by :分区 5. Sort by :每个Reduce内部排序 6.操作练习 步骤一.创建表 步骤二.加载数据 步骤三.验证数据 1.表操作之4个by,分别是 order by 排序字段名 cluster by 分桶并排序字段名 dis…

Golang实现一个一维结构体,根据某个字段排序

package mainimport ("fmt""sort" )type Person struct {Name stringAge int }func main() {// 创建一个一维结构体切片people : []Person{{"Alice", 25},{"Bob", 30},{"Charlie", 20},{"David", 35},{"Eve…

Spring-boot Mybatis-plus 实战应用

文章目录 前言一、springBoot 集成mybatis-plus1.1 maven 引入依赖:1.2 配置数据源:: 二、使用:2.1 mysql 打印执行的sql 设置:2.2 分页查询:2.3 条件构造器:2.3.1 QueryWrapper 查询:2.3.2 Upd…

Linux软硬链接

文章目录 🐋1. 建立软硬链接现象🐠2. 软硬链接🪸2.1 软链接🪸2.2 硬链接 🐦3. 应用场景🪹3.1 软链接应用场景🪹3.2 硬链接应用场景 🐋1. 建立软硬链接现象 我们这里给file.txt建立软…

手机-电脑互传软件:在 Windows 上安装和使用 Localsend 的完整指南

引言: Localsend 是一个简单而强大的本地文件传输工具,它可以让您在本地网络中快速、安全地共享文件和文件夹。本文将介绍如何在 Windows 上安装和使用 Localsend,以便您可以轻松地在本地网络中共享文件。 电脑端安装: 下载&…

基于单片机的电子万年历(论文+源码)

1.系统设计 本次基于proteus仿真的电子万年历的设计,对功能设计如下: 整个系统可以实现显示年、月、日、吋、分、秒的信息显示。带有温度检测功能,检测范围为0-100℃。具有闹钟功能,可以通过按键设定闹钟时间;可以通…

【python】—— 控制语句和组合数据类型(其一)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

全方位移动机器人 Stanley 轨迹跟踪 Gazebo 仿真

全方位移动机器人 Stanley 轨迹跟踪 Gazebo 仿真 本来打算今天出去跑一下 GPS,但是下雨,作罢 添加参考轨迹信息 以下三个功能包不需要修改: mrobot:在 Rviz 和 Gazebo 中仿真机器人cmd_to_mrobot:运动学解算&#…

冯诺依曼体系和操作系统简单介绍

冯诺依曼体系和操作系统简单介绍 冯诺依曼体系 输入设备:键盘,话筒,摄像头,usb,鼠标,磁盘/ssd,网卡等等输出设备:显示器,喇叭,打印机,磁盘&#…

Path Aggregation Network for Instance Segmentation(2018.9)

文章目录 Abstract1. IntroductionOur FindingsOur Contributions 3. Framework3.1. Bottom-up Path AugmentationMotivationAugmented Bottom-up Structure 3.2. Adaptive Feature PoolingMotivationAdaptive Feature Pooling Structure 3.3. Fully-connected FusionMask Pred…

如何从 iCloud 恢复永久删除的照片?答案在这里!

在数字时代,丢失珍贵的照片可能会令人痛苦。然而,了解如何从 iCloud 恢复永久删除的照片可以带来一线希望。无论是意外删除还是技术故障,本指南都提供了 2023 年的最新方法来找回您的珍贵记忆。发现分步解决方案并轻松重新访问您的照片库。不…

Linux Ubuntu系统中添加磁盘

在学习与训练linux系统的磁盘概念、文件系统等,需要增加磁盘、扩展现有磁盘容量等,对于如何添加新的磁盘,我们在“Linux centos系统中添加磁盘”中对centos7/8版本中如何添加、查看、删除等,作了介绍,而对Ubuntu版本中…

css技巧分享(优惠券缺角样式实现)

主要知识点:radial-gradient radial-gradient() CSS 函数创建一个图像,该图像由从原点辐射的两种或多种颜色之间的渐进过渡组成。它的形状可以是圆形或椭圆形。函数的结果是 数据类型的对象。这是一种特别的 。 .coupon{width: 190rpx;height: 194rpx;b…