@@ -596,65 +596,78 @@ ipcMain.on('spawn-turtle-request', async (event, data) => {
596596
597597 if ( turtleTf2Nodes . listener ) {
598598 try {
599- // Get the spawn service client from the listener node
600- const spawnerNode = turtleTf2Nodes . listener ;
601- const spawner = spawnerNode . createClient ( 'turtlesim/srv/Spawn' , 'spawn' ) ;
602-
603- if ( spawner . isServiceServerAvailable ( ) ) {
604- // rclnodejs service calls expect individual arguments, not an object
605- // For turtlesim Spawn service: x, y, theta, name
606- const xPos = x || 4.0 ;
607- const yPos = y || 2.0 ;
608- const angle = theta || 0.0 ;
609- const turtleName = name || 'turtle2' ;
610-
611- console . log (
612- `Attempting to spawn ${ turtleName } at (${ xPos } , ${ yPos } , ${ angle } )`
613- ) ;
614-
615- // Pass arguments individually instead of as an object
616- const response = await spawner . sendRequest (
617- xPos ,
618- yPos ,
619- angle ,
620- turtleName
621- ) ;
622- console . log ( 'Spawn response:' , response ) ;
623-
624- if ( response ) {
625- const spawnedName = response . name || response || turtleName ;
626- console . log ( `Successfully spawned ${ spawnedName } ` ) ;
599+ console . log (
600+ `Spawn request received: ${ name || 'turtle2' } at (${ x || 4 } , ${ y || 2 } , ${ theta || 0 } )`
601+ ) ;
627602
628- if ( mainWindow ) {
629- mainWindow . webContents . send ( 'turtle-spawned' , {
630- name : spawnedName ,
631- x : xPos ,
632- y : yPos ,
633- theta : angle ,
634- } ) ;
635- }
603+ // Use the existing spawner from the listener node or create one
604+ const listenerNode = turtleTf2Nodes . listener ;
605+ let spawner = listenerNode . _spawner ;
606+
607+ if ( ! spawner ) {
608+ console . log ( 'Creating new spawn service client...' ) ;
609+ spawner = listenerNode . createClient ( 'turtlesim/srv/Spawn' , 'spawn' ) ;
610+ listenerNode . _spawner = spawner ; // Cache it
611+
612+ // Wait for service to be ready
613+ let retries = 0 ;
614+ while ( ! spawner . isServiceServerAvailable ( ) && retries < 10 ) {
615+ console . log ( `Waiting for spawn service... (attempt ${ retries + 1 } )` ) ;
616+ await new Promise ( ( resolve ) => setTimeout ( resolve , 200 ) ) ;
617+ retries ++ ;
636618 }
637- } else {
638- console . error (
639- 'Turtlesim spawn service not available. Make sure turtlesim_node is running.'
640- ) ;
619+ }
620+
621+ if ( ! spawner . isServiceServerAvailable ( ) ) {
622+ throw new Error ( 'Turtlesim spawn service not available after waiting' ) ;
623+ }
624+
625+ // Use the simplest possible request format
626+ const xPos = x || 4.0 ;
627+ const yPos = y || 2.0 ;
628+ const angle = theta || 0.0 ;
629+ const turtleName = name || 'turtle2' ;
630+
631+ console . log ( `Spawning ${ turtleName } at (${ xPos } , ${ yPos } , ${ angle } )` ) ;
632+
633+ // Try the most basic service call format
634+ const response = await spawner . sendRequest ( {
635+ x : xPos ,
636+ y : yPos ,
637+ theta : angle ,
638+ name : turtleName ,
639+ } ) ;
640+
641+ console . log ( 'Spawn response:' , response ) ;
642+
643+ if ( response ) {
644+ const spawnedName = response . name || response || turtleName ;
645+ console . log ( `Successfully spawned ${ spawnedName } ` ) ;
646+
641647 if ( mainWindow ) {
642- mainWindow . webContents . send ( 'spawn-error' , {
643- message :
644- 'Turtlesim service not available. Please start turtlesim_node first.' ,
648+ mainWindow . webContents . send ( 'turtle-spawned' , {
649+ name : spawnedName ,
650+ x : xPos ,
651+ y : yPos ,
652+ theta : angle ,
645653 } ) ;
646654 }
647655 }
648656 } catch ( error ) {
649- console . error ( `Failed to spawn ${ name } :` , error ) ;
657+ console . error ( `Failed to spawn ${ name || 'turtle2' } :` , error ) ;
650658 if ( mainWindow ) {
651659 mainWindow . webContents . send ( 'spawn-error' , {
652- message : `Failed to spawn ${ name } : ${ error . message } ` ,
660+ message : `Failed to spawn ${ name || 'turtle2' } : ${ error . message } ` ,
653661 } ) ;
654662 }
655663 }
656664 } else {
657665 console . error ( 'Listener node not initialized' ) ;
666+ if ( mainWindow ) {
667+ mainWindow . webContents . send ( 'spawn-error' , {
668+ message : 'ROS2 listener node not ready' ,
669+ } ) ;
670+ }
658671 }
659672} ) ;
660673
0 commit comments