运动

运动指令除 move_xxx_until 外,都是不等待运动完成的。如果需要等待运动完成,请使用 sync()

开始录制运动轨迹 3.1.11

开始录制运动轨迹。

  • 函数名:lua模块的函数start_record_trajectory
  • 参数:
    1. time: [float] 采样周期,最小 0.01s,默认 0.1s。可选
  • 返回:[bool] 是否执行成功

示例程序

start_record_trajectory(0.01)

结束录制运动轨迹 3.1.11

结束录制运动轨迹,并将轨迹存储到 name 中。

  • 函数名:lua模块的函数end_record_trajectory
  • 参数:
    1. name: [str] 轨迹名称
  • 返回:[bool] 是否执行成功

示例程序

end_record_trajectory("test")

回放运动轨迹 3.1.11

回放指定名称的运动轨迹。

  • 函数名:lua模块的函数move_trajectory
  • 参数:
    1. name: [str] 轨迹名称
  • 返回:[int] 运动 ID(motion_id),或抛出错误

示例程序

motion_id = move_trajectory("test")

进入示教模式

当机器人处于空闲状态时,调用该指令可进入示教(自由驱动)模式。在示教模式下,机器人各关节可被自由拖拽,故又称自由驱动模式。末端负载配置会影响示教效果,设置值比实际负载大时,机器人会向上用力,反之则会向下用力,请注意检查。

注意

当机器人处于非空闲状态时,调用该指令将会产生错误 1000: 机器人处于空闲中才能示教

  • 函数名:lua模块的函数teach_mode
  • 参数:无
  • 返回:[bool] 是否执行成功

示例程序

teach_mode()

退出示教模式

当机器人处于示教中状态,即示教(自由驱动)模式时,调用该指令可退出示教模式,恢复到空闲状态。处于其他模式时调用不产生错误。

  • 函数名:lua模块的函数end_teach_mode
  • 参数:无
  • 返回:[bool] 是否执行成功

示例程序

end_teach_mode()

暂停运动 3.1.24

暂停所有运动。不影响任务运行状态。

  • 函数名:lua模块的函数pause_move
  • 参数:无
  • 返回:[bool] 是否执行成功

示例程序

pause_move()

恢复运动 3.1.24

恢复所有运动。不影响任务运行状态。

  • 函数名:lua模块的函数resume_move
  • 参数:无
  • 返回:[bool] 是否执行成功

示例程序

resume_move()

跳过运动

跳过当前运动。该命令是 move_xxx_until 系列命令的内部实现机制。

  • 函数名:lua模块的函数skip_move
  • 参数:无
  • 返回:[bool] 是否执行成功

示例程序

skip_move()

停止运动

停止所有运动,但无法取消后续新发的运动指令。

  • 函数名:lua模块的函数stop_move
  • 参数:无
  • 返回:[bool] 是否执行成功

示例程序

stop_move()

可以使用以下代码实现 move_until 功能:

disable_auto_sync()

motion_id = movej({j1 = 0, j2 = 1.57, j3 = -1.57, j4 = 0, j5 = 3.14, j6 = 3.14}, 1.0, 0.2, 0, 0)
function wait_io()
  while get_tcp_dio(1) != 1 do
    wait(10)
  end
  stop_move()
end
task_wait_move = async_task(wait_move, motion_id)
task_wait_io = async_task(wait_io)
wait_any(task_wait_move, task_wait_io) -- 等待任意一个任务完成

等待运动完成 3.1.23

等待指定运动完成。

  • 函数名:lua模块的函数wait_move
  • 参数:
    1. motion_id: [int] move_xxx 返回的运动 ID。可选,默认为 0,等待全部运动完成
  • 返回:[bool] 是否执行成功

示例程序

motion_id = movej({j1 = 0, j2 = 1.57, j3 = -1.57, j4 = 0, j5 = 3.14, j6 = 3.14}, 1.0, 0.2, 0, 0)
wait_move(motion_id)

关节运动

在关节空间内执行线性运动。使用该命令,机器人必须处于静止状态或者上一个命令是 movej 或者带交融的 movel

该调用会立刻返回,并不会等到运动完成。可以通过 get_robot_mode 查询状态直到空闲,或调用 sync 指令使得机器人同步等待到当前所有指令执行完成。

  • 函数名:lua模块的函数movej
  • 参数:
    1. p: [Pose] 目标位置。可为关节位置 {j1 = 0.1, j2 = 0.2, j3 = 0.2, j4 = 0.3, j5 = 0.1, j6 = 0.2},也可为坐标位置 {x, y, z, rz, ry, rx}(将通过逆向运动学反解转为关节位置)。详情参考 位置和姿态
    2. a: [float] 主轴的关节加速度 (rad/s²),最大可设置为安全设置中最大加速度
    3. v: [float] 主轴的关节速度 (rad/s),最大可设置为安全设置中最大速度
    4. t: [float] 运动时间 (s)。可选,默认 0
      • t > 0 时,参数速度 v 和加速度 a 无效。2.1
      • 因受到安全设置中最大加速度、最大速度影响,会自动延长运动时间
    5. r: [float] 交融半径 (m)。可选,默认 0。用于指定路径的平滑效果
      • 0 表示关闭平滑运动。
      • r > 0 表示启用平滑运动(最大交融半径为 1 m),过渡时不一定经过目标位置。
  • 返回:[int] 运动 ID(motion_id),或抛出错误

示例程序

motion_id = movej({j1 = 0, j2 = 1.57, j3 = -1.57, j4 = 0, j5 = 3.14, j6 = 3.14}, 1.0, 0.2, 0, 0)

关节运动直到 auto_sync

执行运动命令,如果需要在运动过程中当某个条件发生时停止当前运动,则采用 move until 系列命令。

相比于 关节运动,取消了交融半径 r 的设置,代之以回调函数 fn。该回调函数的效果是,当运动命令执行时,系统会每周期(约 10ms)调用一次该函数,如果该函数返回 true,则自动调用 停止运动 命令停止当前运动。如果该函数一直不返回真值,机器人将最终运动到 p。如果该函数无法在 10ms 内完成,会导致跳过后续若干周期的判断。

  • 函数名:lua模块的函数movej_until
  • 参数:
    1. p: [Pose] 目标位置,同 关节运动
    2. a: [float] 关节加速度 (rad/s²)
    3. v: [float] 关节速度 (rad/s)
    4. t: [float] 运动时间 (s)。可选,默认 0
    5. fn: [function] 条件回调函数,每周期执行一次,返回 true 时停止当前运动
  • 返回:[bool] 是否执行成功

示例程序

在 Lua 语法中,函数可以是匿名的。

movej_until({j1 = 0, j2 = 1.57, j3 = -1.57, j4 = 0, j5 = 3.14, j6 = 3.14}, 1.2, 0.2, 0, function()
  return get_aio(2) > 10
end)

直线运动

在工具空间内执行线性运动路径。使用该命令,机器人必须处于静止状态或者上一个命令是 movej 或者带交融的 movel

  • 函数名:lua模块的函数movel
  • 参数:
    1. p: [Pose] 目标位置。可为坐标位置 {x, y, z, rz, ry, rx},也可为关节位置(将通过运动学正解转为坐标位置)
    2. a: [float] 工具空间加速度 (m/s²)
    3. v: [float] 工具空间速度 (m/s)。注意这里的速度和加速度指的是在工具空间上的描述
    4. t: [float] 运动时间 (s)。可选,默认 0
    5. r: [float] 交融半径 (m)。可选,默认 0
  • 返回:[int] 运动 ID(motion_id),或抛出错误

注意

在临近奇异位置工作空间边界时会发生异常,需要改用关节运动

示例程序

movel({0.2, 0.5, 0.4, 0, 0, 1.57}, 1.0, 0.2, 0, 0)
movel({j1 = 0, j2 = 1.57, j3 = -1.57, j4 = 0, j5 = 3.14, j6 = 3.14}, 1.0, 0.2, 0, 0)

直线运动直到 auto_sync

在工具空间内执行线性运动路径,即直线运动,当满足指定条件时停止。

参考 直线运动关节运动直到 的说明。

  • 函数名:lua模块的函数movel_until
  • 参数:
    1. p: [Pose] 目标位置,同 直线运动
    2. a: [float] 工具空间加速度 (m/s²)
    3. v: [float] 工具空间速度 (m/s)
    4. t: [float] 运动时间 (s)。可选,默认 0
    5. fn: [function] 条件回调函数,每周期执行一次,返回 true 时停止当前运动
  • 返回:[bool] 是否执行成功

示例程序

movel_until({0.2, 0.5, 0.4, 0, 0, 1.57}, 1.0, 0.2, 0, function()
  return get_tcp_dio(1) == 0
end)

混合运动

直线运动。与 movel 不同的是,当遇到奇异位置时,会自动转换为关节运动。

  • 函数名:lua模块的函数move_hybrid
  • 参数:
    1. p: [Pose] 目标位置。可为坐标位置,也可为关节位置(将通过运动学正解转为坐标位置)
    2. a: [float] 工具空间加速度 (m/s²)
    3. v: [float] 工具空间速度 (m/s)。注意这里的速度和加速度指的是在工具空间上的描述
    4. t: [float] 运动时间 (s)。可选,默认 0
    5. r: [float] 交融半径 (m)。可选,默认 0
  • 返回:[int] 运动 ID(motion_id),或抛出错误

示例程序

move_hybrid({0.2, 0.5, 0.4, 0, 0, 1.57}, 1.0, 0.2, 0, 0)
move_hybrid({j1 = 0, j2 = 1.57, j3 = -1.57, j4 = 0, j5 = 3.14, j6 = 3.14}, 1.0, 0.2, 0, 0)

圆弧运动

在工具空间内进行圆弧运动,路径为以当前位置、viap 三点组成的唯一圆。如果三点位于一条直线上无法画圆,或者点之间距离过小以至于唯一圆过大或过小,命令均将执行失败。执行完圆弧运动的机器人姿态与 p 一致,与 rad 无关。

  • 函数名:lua模块的函数movec
  • 参数:
    1. via: [Pose] 途经位置。可为坐标位置,也可为关节位置(将转为坐标位置)
    2. p: [Pose] 目标位置。可为坐标位置,也可为关节位置(将转为坐标位置)
    3. rad: [float] 路径圆弧的弧度 (rad)。用于指定圆弧运动的弧度大小
      • 特殊且默认地,当 rad = 0 表示运动到 p 作为终点。
      • 如果 rad > 0,则表示走一个圆弧运动轨迹,途径 viap,并旋转对应的 rad
      • 如果 rad < 0,则表示反方向走圆弧运动轨迹,viap 在此模式下不一定经过。
    4. a: [float] 工具空间加速度 (m/s²)
    5. v: [float] 工具空间速度 (m/s)
    6. t: [float] 运动时间 (s)。可选,默认 0
    7. r: [float] 交融半径 (m)。可选,默认 0
  • 返回:[int] 运动 ID(motion_id),或抛出错误

示例程序

movec({0.2, 0.5, 0.4, 0, 0, 1.57}, {j1 = 0.1, j2 = 0.2, j3 = 0.2, j4 = 0.3, j5 = 0.1, j6 = 0.2}, 0.0, 1.0, 0.2, 0)

圆弧运动直到 auto_sync

进行工具空间内的圆弧运动,当满足指定条件时停止。

参考 圆弧运动关节运动直到 的说明。

  • 函数名:lua模块的函数movec_until
  • 参数:
    1. via: [Pose] 途经位置,同 圆弧运动
    2. p: [Pose] 目标位置,同 圆弧运动
    3. rad: [float] 路径圆弧的弧度 (rad)
    4. a: [float] 工具空间加速度 (m/s²)
    5. v: [float] 工具空间速度 (m/s)
    6. t: [float] 运动时间 (s)。可选,默认 0
    7. fn: [function] 条件回调函数,每周期执行一次,返回 true 时停止当前运动
  • 返回:[bool] 是否执行成功

示例程序

movec_until({0.2, 0.5, 0.4, 0, 0, 1.57}, {j1 = 0.1, j2 = 0.2, j3 = 0.2, j4 = 0.3, j5 = 0.1, j6 = 0.2}, 0.0, 1.0, 0.2, 0, function()
  return get_tcp_dio(1) == 0
end)

伺服运动(PVAT) 2.3.5

指定每个关节的速度、加速度,让机器人连续地进行伺服运动。

注意

  • 最小可以设置的时间为 0.01 (10ms),小于该值的路径点会被跳过。
  • 2 个相邻点位之间的发送间隔必须小于 t,超出 t 会导致机器人自动减速停止。
  • 函数名:lua模块的函数move_pvat
  • 参数:
    1. p: [JointPose] 关节位置
    2. v: [JointPose] 或 [float] 每个关节的速度 (rad/s),可为各关节速度数组或统一的速度值
    3. a: [JointPose] 或 [float] 每个关节的加速度 (rad/s²),可为各关节加速度数组或统一的加速度值
    4. t: [float] 运动时间 (s)
  • 返回:[bool] 是否执行成功

示例程序

move_pvat({j1=0.279099, j2=0.0499054, j3=0.320451, j4=0.172128, j5=1.67471, j6=0.427222}, {0.00141239, 0.017133, 0.015709, 0.0477418, 0.0037477, 0.0504095}, 0, 0.01)

move_pvat({-0.490491, -0.257047, -0.0192966, -1.60649, -0.311108, 2.14048}, 0.1, 0, 0.01)

伺服运动(PVT) 2.3.5

伺服运动(PVAT),由机器人自动估算各个关节的加速度。

  • 函数名:lua模块的函数move_pvt
  • 参数:
    1. p: [JointPose] 关节位置
    2. v: [JointPose] 或 [float] 每个关节的速度 (rad/s)
    3. t: [float] 运动时间 (s)
  • 返回:[bool] 是否执行成功

示例程序

move_pvt({j1=0.279099, j2=0.0499054, j3=0.320451, j4=0.172128, j5=1.67471, j6=0.427222}, {0.00141239, 0.017133, 0.015709, 0.0477418, 0.0037477, 0.0504095}, 0.01)

move_pvt({-0.490491, -0.257047, -0.0192966, -1.60649, -0.311108, 2.14048}, 0.1, 0.01)

伺服运动(PT) 2.3.5

伺服运动(PVAT),由机器人自动估算各个关节的速度、加速度。

  • 函数名:lua模块的函数move_pt
  • 参数:
    1. p: [JointPose] 关节位置
    2. t: [float] 运动时间 (s)
  • 返回:[bool] 是否执行成功

示例程序

move_pt({j1=0.279099, j2=0.0499054, j3=0.320451, j4=0.172128, j5=1.67471, j6=0.427222}, 0.01)

复位关节圈数

复位各关节的累计圈数。

  • 函数名:lua模块的函数reset_joint_laps
  • 参数:无
  • 返回:[bool] 是否执行成功

示例程序

reset_joint_laps()

示例

local v = 0.06
local a = 0.1

function 画☆(base, r)
  movej(base, 0.4, 1, 0, 1)

  local b = pose_times(base, {-r * math.sin(math.rad(18)), -r * math.cos(math.rad(18)), 0, 0, 0, 0})
  movel(b, v, a, 0, 0)

  local c = pose_times(base, {r / 2, -r / 2 * math.cos(math.rad(36)), 0 , 0, 0, 0})
  movel(c, v, a, 0, 0)

  local d = pose_times(base, {-r / 2, -r / 2 * math.cos(math.rad(36)), 0, 0, 0, 0})
  movel(d, v, a, 0, 0)

  local e = pose_times(base, {r * math.sin(math.rad(18)), -r * math.cos(math.rad(18)), 0, 0, 0, 0})
  movel(e, v, a, 0, 0)

  movel(base, v, a, 0, 0)
  sync()
end

local base = get_actual_tcp_pose()
画☆(base, 0.1)