@@ -36,17 +36,20 @@ class grbl_node(Node):
3636
3737 def __init__ (self ):
3838 super ().__init__ (grbl_node_name )
39+ self .get_logger ().info ('Initializing Publishers & Subscribers' )
3940 self .pub_pos_ = self .create_publisher (Pose , grbl_node_name + '/position' , 10 )
4041 self .pub_status_ = self .create_publisher (String , grbl_node_name + '/status' , 10 )
4142 self .sub_cmd_ = self .create_subscription (
4243 String , grbl_node_name + '/send_gcode' , self .gcodeCallback , 10 )
44+ self .sub_stream_ = self .create_subscription (
45+ String , grbl_node_name + '/send_gcode_file' , self .streamCallback , 10 )
4346 self .sub_pose_ = self .create_subscription (
4447 Pose , grbl_node_name + '/set_pose' , self .poseCallback , 10 )
4548 self .sub_stop_ = self .create_subscription (
4649 String , grbl_node_name + '/stop' , self .stopCallback , 10 )
4750 self .sub_stop_ # prevent unused variable warning
4851
49- # declare parameters
52+ self . get_logger (). info ( 'Declaring ROS parameters' )
5053 self .declare_parameter ('port' , '/dev/ttyUSB0' )
5154 self .declare_parameter ('baudrate' , 115200 )
5255 self .declare_parameter ('acceleration' , 1000 )
@@ -61,6 +64,7 @@ def __init__(self):
6164 self .declare_parameter ('y_steps_mm' , 100 )
6265 self .declare_parameter ('z_steps_mm' , 100 )
6366
67+ self .get_logger ().info ('Setting ROS parameters' )
6468 port = self .get_parameter ('port' )
6569 baud = self .get_parameter ('baudrate' )
6670 acc = self .get_parameter ('acceleration' ) # axis acceleration (mm/s^2)
@@ -75,7 +79,9 @@ def __init__(self):
7579 steps_y = self .get_parameter ('y_steps_mm' ) # axis steps per mm
7680 steps_z = self .get_parameter ('z_steps_mm' ) # axis steps per mm
7781
82+ self .get_logger ().info ('Initializing GRBL Device' )
7883 self .grbl_obj = grbl ()
84+ self .get_logger ().info ('Starting up GRBL Device...' )
7985 self .grbl_obj .startup (port .get_parameter_value ().string_value ,
8086 baud .get_parameter_value ().integer_value ,
8187 acc .get_parameter_value ().integer_value ,
@@ -89,9 +95,21 @@ def __init__(self):
8995 steps_x .get_parameter_value ().integer_value ,
9096 steps_y .get_parameter_value ().integer_value ,
9197 steps_z .get_parameter_value ().integer_value )
92- self .wake ()
93- self .refreshStatus ()
94- self .refreshPosition ()
98+ if (self .grbl_obj .s ):
99+ self .wake ()
100+ self .refreshStatus ()
101+ self .refreshPosition ()
102+ self .get_logger ().info ('GRBL device ready' )
103+
104+ else :
105+ self .get_logger ().warn ('Could not detect GRBL device '
106+ 'on serial port ' + self .grbl_obj .port )
107+ self .get_logger ().warn ('Are you sure the GRBL device '
108+ 'is connected and powered on?' )
109+ # TODO(evanflynn): set this to a different color so it stands out?
110+ self .get_logger ().info ('Node running in `debug` mode' )
111+ self .get_logger ().info ('GRBL device operation may not function as expected' )
112+ self .grbl_obj .mode = self .grbl_obj .MODE .DEBUG
95113
96114 def wake (self ):
97115 self .grbl_obj .s .write (b'\r \n \r \n ' )
@@ -100,13 +118,19 @@ def wake(self):
100118
101119 def refreshStatus (self ):
102120 status = self .grbl_obj .getStatus ()
103- for stat in status :
104- self .get_logger ().info (stat )
105- if ('error' in stat ):
106- # TODO(evanflynn): temp code to clear alarm error, should be user decision
107- self .get_logger ().warn (self .grbl_obj .clearAlarm ())
121+ if (self .grbl_obj .mode == self .grbl_obj .MODE .NORMAL ):
122+ for stat in status :
123+ self .get_logger ().info (stat )
124+ if ('error' in stat ):
125+ # TODO(evanflynn): temp code to clear alarm error, should be user decision
126+ self .get_logger ().warn (self .grbl_obj .clearAlarm ())
127+ ros_status = String ()
128+ ros_status .data = stat
129+ self .pub_status_ .publish (ros_status )
130+ else :
131+ self .get_logger ().info (status )
108132 ros_status = String ()
109- ros_status .data = stat
133+ ros_status .data = status
110134 self .pub_status_ .publish (ros_status )
111135
112136 def refreshPosition (self ):
@@ -137,11 +161,22 @@ def stopCallback(self, msg):
137161 elif msg .data == 'f' :
138162 self .grbl_obj .enableSteppers ()
139163
164+ def streamCallback (self , msg ):
165+ self .get_logger ().info ('Sending GCODE file: ' )
166+ self .get_logger ().info (' ' + msg .data )
167+ # stream gcode file to grbl device
168+ status = self .grbl_obj .stream (msg .data )
169+ # TODO(evanflynn): have stream method return something useful
170+ self .get_logger ().info (status )
171+ self .get_logger ().info ('GCODE file complete!' )
172+ self .refreshStatus ()
173+ self .refreshPosition ()
174+
140175
141176def main ():
142177 rclpy .init ()
143- interface = grbl ()
144- rclpy .spin (interface )
178+ node = grbl_node ()
179+ rclpy .spin (node )
145180
146181
147182if __name__ == '__main__' :
0 commit comments