The sample project needs to palletize the products with 2x2 arrangement. The distance between the products is 45mm on X-axis and 50mm on Y-axis. The height between each layer is 30mm. User Frame 1 is configured to match the layout of the operating field. As the figure shows, the picking up position starts from P0, then P1, P2, P3. The lifting-up height after gripping the product is 200mm.
Known:
Using User Frame 1
50mm between the products on X-axis
45mm between the products on Y-axis
30mm height difference between each layer
P0 is the starting point
The sample code is done by Lua script
pose_mul and pose_inv are exiting functions. Please use EC Lua Manual as reference.
The following concept designs only introduce using the script for position calculation.
For downloading Lua script to robot and interacting with JBI program, please read: https://bbs.elibot.cn/forum/detail/topic/79.html
Design 1: User Frame stays constant, calculates offset distance from other products to P0 under User Frame 1.
As the figure above, assuming the position for P0 under User Frame 1 is [dx, dy, 0, 0, 0, 0], with the give information, the offset based position for other point will be as figures below.
P1:[dx+45,dy,0,0,0,0]
p2:[dx,dy+50,0,0,0,0]
p3:[dx+45, dy+50, 0, 0, 0, 0]
--[[
p0_in_cart: P0 under Cartesian (base) frame
p0_in_user: P0 under user frame
user_frame: User Frame
trsf_x:x-axis offset value
trsf_y:y-axis offset value
trsf_z:z-axis offset value
]]--
-- Calculate each positon under the user frame
p0_in_user = pose_mul(pose_inv(user_frame), p0_in_cart)
p1_in_user = [p0_in_user[1]+trsf_x, p0_in_user[2], p0_in_user[3], p0_in_user[4], p0_in_user[5], p0_in_user[6]]
p2_in_user = [p0_in_user[1], p0_in_user[2]+trsf_y, p0_in_user[3], p0_in_user[4], p0_in_user[5], p0_in_user[6]]
p3_in_user = [p0_in_user[1]+trsf_x, p0_in_user[2]+trsf_y, p0_in_user[3], p0_in_user[4], p0_in_user[5], p0_in_user[6]]
-- convert each point to Cartesian frame position
p1_in_cart = pose_mul(user_frame, p1_in_user)
p2_in_cart = pose_mul(user_frame, p2_in_user)
p3_in_cart = pose_mul(user_frame, p3_in_user)
Design 2 Update user frame for every position, but the product position stays same.
Calculate the position for P0 for the initial user frame.
p0_in_user = pose_mul(pose_inv(user_frame), p0_in_cart)
user_frame:Initial user_frame
p0_in_cart:taught P0 position
user_frame1 = pose_mul(user_frame, [trsf_x, 0, 0, 0, 0, 0])
p1 =
user_frame2 = pose_mul(user_frame, [0, trsf_y, 0, 0, 0, 0])
user_frame3 = pose_mul(user_frame, [trsf_x, trsf_y, 0, 0, 0, 0])
--[[
p0_in_cart:P0在世界坐标系下的位姿数据
p0_in_user: Position for P0 under user frame
user_frame: initial user frame
user1_frame: user frame for P1
...... : user frame for other product
trsf_x: X-axis offset.
trsf_y: Y-axis offset.
trsf_z: Z-axis offset.
]]--
-- Calculate user frames for each product., then convert result to Cartesian frame position
p0_in_user = pose_mul(pose_inv(user_frame), p0_in_cart)
user_frame1 = pose_mul(user_frame, [trsf_x, 0, 0, 0, 0, 0])
p1_in_cart = pose_mul(user1_frame, p0_in_user)
user_frame2 = pose_mul(user_frame, [0, trsf_y, 0, 0, 0, 0])
p2_in_cart = pose_mul(user2_frame, p0_in_user)
user_frame3 = pose_mul(user_frame, [trsf_x, trsf_y, 0, 0, 0, 0])
p3_in_cart = pose_mul(user3_frame, p0_in_user)