-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNiryoOne0_Script.lua
More file actions
executable file
·168 lines (132 loc) · 6.33 KB
/
Copy pathNiryoOne0_Script.lua
File metadata and controls
executable file
·168 lines (132 loc) · 6.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
-- Importing required libraries
sim=require('sim')
simIK = require('simIK')
simROS2 = require('simROS2')
-- HELPER FUNCTIONS --
-- The function below moves the robot to a certain configuration
function moveToConfig(handles,maxVel,maxAccel,maxJerk,targetConf)
local params = {
joints = handles,
targetPos = targetConf,
maxVel = maxVel,
maxAccel = maxAccel,
maxJerk = maxJerk,
}
sim.moveToConfig(params)
end
-- The function below helps to solve inverse kinematics
function solveIK()
ikEnv = simIK.createEnvironment()
ikGroup_undamped = simIK.createGroup(ikEnv)
simIK.setGroupCalculation(ikEnv, ikGroup_undamped, simIK.method_pseudo_inverse, 0, 6)
simIK.addElementFromScene(ikEnv, ikGroup_undamped, simBase, simTip, simTarget, simIK.constraint_position)
ikGroup_damped = simIK.createGroup(ikEnv)
simIK.setGroupCalculation(ikEnv, ikGroup_damped, simIK.method_damped_least_squares, 0.01, 99)
simIK.addElementFromScene(ikEnv, ikGroup_damped, simBase, simTip, simTarget, simIK.constraint_position)
local result, jointPositions = simIK.handleGroup(ikEnv, ikGroup_undamped, {syncWorlds = true})
-- Check the result status
if result == simIK.result_success then
print('Niryo0: ik successful')
elseif result ~= simIK.result_success then
local result, jointPositions = simIK.handleGroup(ikEnv, ikGroup_damped, {syncWorlds = true})
if result == simIK.result_success then
print('Niryo0: ik successful')
else
print('Niryo0: ik not successful')
end
end
end
-- ROS2 CALLBACKS --
function onRodReadyForPickupFromNy1(msg)
if msg.data == true then
_G.rodReadyForPickupFromNy1 = true
end
end
-- This function initilizes the needed variables
function sysCall_init()
-- Load the robot's base, tip (end-effector), and target
_G.simTip = sim.getObject('/NiryoOne0/NiryoLGripper/tip')
_G.simTarget = sim.getObject('/fuelRod/target2')
_G.simBase = sim.getObject('/NiryoOne0')
-- Initial robot configuration
_G.initConfig = {math.pi/2, 0, 0, 0, -math.pi*1/12, -math.pi/2}
-- Initialize the gripper object
local connection=sim.getObject('../connection')
local gripper=sim.getObjectChild(connection,0)
_G.gripperName="NiryoNoGripper"
if gripper~=-1 then
_G.gripperName=sim.getObjectAlias(gripper,4)
end
-- Close the gripper object initially
sim.setInt32Signal(_G.gripperName..'_close', 1)
-- Set the joint target forces
leftJoint = sim.getObject('../leftJoint1')
rightJoint = sim.getObject('../rightJoint1')
sim.setJointTargetForce(leftJoint, 80.0)
sim.setJointTargetForce(rightJoint, 80.0)
-- Get all robot joint handles
_G.jointHandles={
sim.getObject('../NiryoOne_joint1'),
sim.getObject('../NiryoOne_joint2'),
sim.getObject('../NiryoOne_joint3'),
sim.getObject('../NiryoOne_joint4'),
sim.getObject('../NiryoOne_joint5'),
sim.getObject('../NiryoOne_joint6')
}
-- Initialize publishers and subscribers
rodReadyForPickupFromNy1Topic = '/niryo1/rod_ready_for_pickup'
rodPickedUpByNy0Topic = '/niryo0/rod_picked_up'
rodDroppedIntoReceptacleTopic = '/niryo0/rod_dropped_into_receptacle'
rodReadyForPickupFromNy1Subscriber = simROS2.createSubscription(rodReadyForPickupFromNy1Topic, 'std_msgs/msg/Bool', onRodReadyForPickupFromNy1)
sim.addLog(sim.verbosity_scriptinfos, 'Niryo0 rod pickup ready from Niryo1 subscriber initialized.')
rodPickedUpByNy0Publisher = simROS2.createPublisher(rodPickedUpByNy0Topic, 'std_msgs/msg/Bool')
sim.addLog(sim.verbosity_scriptinfos, 'Niryo0 rod pickup from Niryo1 publisher initialized.')
rodDroppedIntoReceptaclePublisher = simROS2.createPublisher(rodDroppedIntoReceptacleTopic, 'std_msgs/msg/Bool')
sim.addLog(sim.verbosity_scriptinfos, 'Niryo0 rod dropped into receptacle publisher initialized.')
end
-- Threaded function for movement
function sysCall_thread()
while sim.getSimulationState() ~= sim.simulation_advancing_abouttostop do
-- If the rod is ready for pickup from Niryo1
if _G.rodReadyForPickupFromNy1 then
_G.rodReadyForPickupFromNy1 = false
-- Open the gripper
sim.clearInt32Signal(_G.gripperName..'_close')
sim.wait(4)
-- Define dynamic trajectory constraints
local vel = 50
local accel = 100
local jerk = 120
local maxVel = {vel*math.pi/180, (vel)*math.pi/180, vel*math.pi/180, vel*math.pi/180, vel*math.pi/180, vel*math.pi/180}
local maxAccel = {accel*math.pi/180, accel*math.pi/180, accel*math.pi/180, accel*math.pi/180, accel*math.pi/180, accel*math.pi/180}
local maxJerk = {jerk*math.pi/180, jerk*math.pi/180, jerk*math.pi/180, jerk*math.pi/180, jerk*math.pi/180, jerk*math.pi/180}
-- Solve the inverse kinematics
solveIK()
sim.wait(4)
-- Close the gripper
sim.setInt32Signal(_G.gripperName..'_close', 1)
sim.wait(4)
-- Publish rod pickup
simROS2.publish(rodPickedUpByNy0Publisher, {data=true})
sim.wait(4)
-- Move robot to target location 1
local targetPos1 = {-math.pi/5, 0, 0, 0, 0, -math.pi/2}
moveToConfig(jointHandles, maxVel, maxAccel, maxJerk, targetPos1)
sim.wait(2)
-- Move robot to target location 2
local targetPos2 = {-math.pi/5, 0, 0, 0, 0, 0}
moveToConfig(jointHandles, maxVel, maxAccel, maxJerk, targetPos2)
sim.wait(2)
-- Open the gripper to release the object
sim.clearInt32Signal(_G.gripperName..'_close')
-- Publish rod dropped into receptacle
simROS2.publish(rodDroppedIntoReceptaclePublisher, {data=true})
moveToConfig(jointHandles, maxVel, maxAccel, maxJerk, _G.initConfig)
end
sim.wait(0.1) -- short delay to yield simulation time
end
end
function sysCall_cleanup()
simROS2.shutdownSubscription(rodReadyForPickupFromNy1Subscriber)
simROS2.shutdownPublisher(rodPickedUpByNy0Publisher)
end