이섹션에서는로봇포스트 프로세서를수정하여 3D 프린팅을위한이동명령을실행하기전에압출기속도를계산하는방법을보여줍니다. 또는압출기프로그램호출(압출기를구동하기위한기본명령)을사용하여로봇컨트롤러에서이러한작업을수행할수있습니다.
로봇포스트프로세서를개별화함으로써프로그램을로봇으로보내기전에 3D 프린팅을위한압출기의통합을더욱쉽게할수있습니다. 이러한작업을수행하려면로봇포스트프로세서에서프로그램이생성될때일부계산을수행하고맞춤형코드를출력해야합니다.
Note: ABB RAPID IRC5, KUKA KRC2 및 Comau 포스트와같은일부포스트프로세서는기본적으로이러한권장수정사항을구현합니다.
첫번째단계는압출기호출대신포스트프로세서의 RunCode 섹션내에서새로운압출기값(E 값)을읽는것입니다. 다음섹션은프로그램에대해생성된모든프로그램호출을처리합니다.
def RunCode(self, code, is_function_call = False):
if is_function_call:
if code.startswith("Extruder("):
# Intercept the extruder command.
# if the program call is Extruder(123.56)
# we extract the number as a string
# and convert it to a number
self.PRINT_E_NEW = float(code[9:-1])
# Skip the program call generation
return
else:
self.addline(code + "()")
else:
# Output program code
self.addline(code)
압출기값(길이 / E)은로봇포스트프로세서에서 PRINT_E_NEW 변수로저장됩니다.
각각의새로운선형이동명령으로 new_move라는함수호출을실행해야합니다. MoveL 명령을시작할때이호출을추가할수있습니다.
def MoveL(self, pose, joints, conf_RLF=None):
"""Add a linear movement"""
# Handle 3D printing Extruder integration
self.new_move(pose)
...
또한, 압출기증분을계산하려면포스트프로세서의헤더에다음변수를추가해야합니다.
# 3D Printing Extruder Setup Parameters:
PRINT_E_AO = 5 # Analog Output ID to command the extruder flow
PRINT_SPEED_2_SIGNAL = 0.10 # Ratio to convert the speed/flow to an analog output signal
PRINT_FLOW_MAX_SIGNAL = 24 # Maximum signal to provide to the Extruder
PRINT_ACCEL_MMSS = -1 # Acceleration, -1 assumes constant speed if we use rounding/blending
# Internal 3D Printing Parameters
PRINT_POSE_LAST = None # Last pose printed
PRINT_E_LAST = 0 # Last Extruder length
PRINT_E_NEW = None # New Extruder Length
PRINT_LAST_SIGNAL = None # Last extruder signal
마지막으로, 이동거리, 로봇속도및로봇가속에따라적절한압출기이송명령을생성하는새로운절차를정의해야합니다. 이는압출기공급이특정아날로그출력또는맞춤형프로그램호출에의해구동된다고가정합니다.
def MoveL 프로그램정의전에다음코드를추가해야합니다.
def calculate_time(self, distance, Vmax, Amax=-1):
"""Calculate the time to move a distance with Amax acceleration and Vmax speed"""
if Amax < 0:
# Assume constant speed (appropriate smoothing/rounding parameter must be set)
Ttot = distance/Vmax
else:
# Assume we accelerate and decelerate
tacc = Vmax/Amax;
Xacc = 0.5*Amax*tacc*tacc;
if distance <= 2*Xacc:
# Vmax is not reached
tacc = sqrt(distance/Amax)
Ttot = tacc*2
else:
# Vmax is reached
Xvmax = distance - 2*Xacc
Tvmax = Xvmax/Vmax
Ttot = 2*tacc + Tvmax
return Ttot
def new_move(self, new_pose):
"""Implement the action on the extruder for 3D printing, if applicable"""
if self.PRINT_E_NEW isNone or new_pose is None:
return
# Skip the first move and remember the pose
if self.PRINT_POSE_LAST isNone:
self.PRINT_POSE_LAST = new_pose
return
# Calculate the increase of material for the next movement
add_material = self.PRINT_E_NEW - self.PRINT_E_LAST
self.PRINT_E_LAST = self.PRINT_E_NEW
# Calculate the robot speed and Extruder signal
extruder_signal = 0
if add_material > 0:
distance_mm = norm(subs3(self.PRINT_POSE_LAST.Pos(), new_pose.Pos()))
# Calculate movement time in seconds
time_s = self.calculate_time(distance_mm, self.SPEED_MMS, self.PRINT_ACCEL_MMSS)
# Avoid division by 0
if time_s > 0:
# This may look redundant but it allows you to account for accelerations and we can apply small speed adjustments
speed_mms = distance_mm / time_s
# Calculate the extruder speed in RPM*Ratio (PRINT_SPEED_2_SIGNAL)
extruder_signal = speed_mms * self.PRINT_SPEED_2_SIGNAL
# Make sure the signal is within the accepted values
extruder_signal = max(0,min(self.PRINT_FLOW_MAX_SIGNAL, extruder_signal))
# Update the extruder speed when required
if self.PRINT_LAST_SIGNAL isNone or abs(extruder_signal - self.PRINT_LAST_SIGNAL) > 1e-6:
self.PRINT_LAST_SIGNAL = extruder_signal
# Use the built-in setDO function to set an analog output
self.setDO(self.PRINT_E_AO, "%.3f" % extruder_signal)
# Alternatively, provoke a program call and handle the integration with the robot controller
#self.addline('ExtruderSpeed(%.3f)' % extruder_signal)
# Remember the last pose
self.PRINT_POSE_LAST = new_pose