运动
运动指令除move_until外,都是不等待运动完成的。 如果需要等待运动完成,请使用sync()
3.1.11
开始录制运动轨迹start_record_trajectory(time)
- 参数
time
。采样周期,最小0.01s,默认0.1s
3.1.11
结束录制运动轨迹end_record_trajectory(name)
结束录制运动轨迹,并将轨迹存储到name
中
3.1.11
回放运动轨迹motion_id = move_trajectory(name)
进入示教模式
teach_mode()
当机器人处于空闲
状态时,调用该指令可进入示教(自由驱动)模式。在示教模式下,机器人各关节可被自由拖拽,故又称自由驱动模式。末端负载配置会影响示教效果,设置值比实际负载大时,机器人会向上用力,反之则会向下用力,请注意检查。
指令无返回值。
注意
当机器人处于非空闲状态时,调用该指令将会产生错误 1000: 机器人处于空闲中才能示教。
退出示教模式
end_teach_mode()
当机器人处于示教中
状态,即示教(自由驱动)模式时,调用该指令可退出示教模式,恢复到空闲
状态。处与其他模式时调用不产生错误。
指令无返回值。
3.1.24
暂停运动暂停所有运动。不影响任务运行状态。
pause_move()
3.1.24
恢复运动恢复所有运动。不影响任务运行状态。
resume_move()
停止运动
停止所有运动,但无法取消后续新发的运动指令。 该命令是 move_until 系列命令的内部实现机制。
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
等待运动完成wait_move(motion_id)
- 参数
motion_id
move_xxx 返回的 motion_id。可选,默认为0全部运动
关节运动
motion_id = movej(p, a, v, t, r)
在关节空间内执行线性运动。使用该命令,机器人必须处于静止状态或者上一个命令是 movej
或者带交融的 movel
。
该调用会立刻返回,并不会等到运动完成。可以通过 get_robot_mode 查询状态直到空闲,或调用 sync 指令使得机器人同步等待到当前所有指令执行完成。
- 参数
p
。关节位置,或者坐标位置(将通过逆向运动学反解转为关节位置)。- 若是
{j1 = 0.1, j2 = 0.2, j3 = 0.2, j4 = 0.3, j5 = 0.1, j6 = 0.2}
,表示关节位置。 - 若是
{x, y, z, Rz, Ry, Rx}
,则表示的是坐标位置。 - 详情参考 位置和姿态
- 若是
a
。主轴的关节加速度 (rad/s2),最大可设置为安全设置中最大加速度。v
。主轴的关节速度 (rad/s),最大可设置为安全设置中最大速度。t
。运动时间 (s)。- 当
t > 0
时,参数速度v
和加速度a
无效。2.1 - 因当受到安全设置中最大加速度、最大速度影响,会自动延长运动时间
- 当
r
。交融半径 (m)。用于指定路径的平滑效果。0
表示关闭平滑运动。r > 0
表示启用平滑运动(最大交融半径为 1 m),过渡时不一定经过目标位置。
auto_sync
关节运动直到movej_until(p, a, v, t, fn)
执行运动命令,如果需要在运动过程中当某个条件发生时停止当前运动,则采用 move until 系列命令。
相比于 关节运动,取消了交融半径 r
的设置,代之以回调函数 fn
。该回调函数的效果是,当运动命令执行时,系统会每周期 (约 10ms) 调用一次该函数,如果该函数返回 true
,则自动调用 停止运动 命令停止当前运动。如果该函数一直不返回真值,机器人将最终运动到 p
。如果该函数无法在 10ms 内完成,会导致跳过后续若干周期的判断。
示例程序
在 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)
直线运动
motion_id = movel(p, a, v, t, r)
在工具空间内执行线性运动路径,使用该命令,机器人必须处于静止状态或者上一个命令是movej
或者带交融的movel
。
- 参数基本同 关节运动:
p
。坐标位置,或者关节位置(将通过运动学正解转为坐标位置)。a
。工具空间加速度 (m/s2)。v
。工具空间速度 (m/s)。注意这里的速度和加速度指的是在工具空间上的描述。
示例程序
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
直线运动直到movel_until(p, a, v, t, fn)
在工具空间内执行线性运动路径,即直线运动,当满足指定条件时停止。
示例程序
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不同的是,当遇到奇异位置时,会自动转换为关节运动。
motion_id = move_hybrid(p, a, v, t, r)
- 参数基本同 关节运动:
p
。坐标位置,或者关节位置(将通过运动学正解转为坐标位置)。a
。工具空间加速度 (m/s2)。v
。工具空间速度 (m/s)。注意这里的速度和加速度指的是在工具空间上的描述。
示例程序
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)
圆弧运动
motion_id = movec(via, p, rad, a, v, t, r)
在工具空间内进行圆弧运动,路径为以当前位置、via
和 p
三点组成的唯一圆。如果三点位于一条直线上无法画圆,或者点之间距离过小以至于唯一圆过大或过小,命令均将执行失败。执行完圆弧运动的机器人姿态与 p
一致,与 rad
无关。
- 参数具体说明可参见 关节运动。
via
。途经位置。坐标位置,或者关节位置(将转为坐标位置)。p
。目标位置。坐标位置,或者关节位置(将转为坐标位置)。rad
。路径圆弧的弧度 (rad) 。用于指定圆弧运动的弧度大小。- 特殊且默认地,当
rad = 0
表示运动到p
作为终点。 - 如果
rad > 0
,则表示走一个圆弧运动轨迹,途径via
和p
,并旋转对应的rad
。 - 如果
rad < 0
,则表示反方向走圆弧运动轨迹,via
和p
在此模式下不一定经过。
- 特殊且默认地,当
a
。工具空间加速度 (m/s2)v
。工具空间速度 (m/s)t
。运动时间 (s)r
。交融半径 (m)
示例程序
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
圆弧运动直到movec_until(via, p, rad, a, v, t, fn)
进行工具空间内的圆弧运动,当满足指定条件时停止。
示例程序
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)
2.3.5
move_pvatmove_pvat(p, v, a, t)
指定每个关节的速度、加速度,让机器人连续地进行伺服运动。
注意
- 最小可以设置的时间为 0.01 (10ms),小于该值的路径点会被跳过。
- 2个相邻点位之间的发送间隔必须小于t,超出t会导致机器人自动减速停止。
- 参数
p
。关节位置v
。每个关节的速度 (rad/s)a
。每个关节的加速度 (rad/s2)t
。运动时间 (s)
示例程序
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)
2.3.5
move_pvtmove_pvt(p, v, t)
同 move_pvat,由机器人自动估算各个关节的加速度
- 参数
p
。关节位置v
。每个关节的速度 (rad/s)t
。运动时间 (s)
示例程序
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)
2.3.5
move_ptmove_pt(p, t)
同 move_pvat,由机器人自动估算各个关节的速度、加速度
- 参数
p
。关节位置t
。运动时间 (s)
示例程序
move_pt({j1=0.279099,j2=0.0499054,j3=0.320451,j4=0.172128,j5=1.67471,j6=0.427222}, 0.01)
示例
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)