Skip to content

Commit 985fb27

Browse files
committed
Fix creating turtle2 error
1 parent 98b48f6 commit 985fb27

File tree

1 file changed

+58
-45
lines changed

1 file changed

+58
-45
lines changed

electron_demo/turtle_tf2/main.js

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)