import { test, expect } from '@playwright/test'; import { resolve } from 'node:path'; import { writeFile } from 'node:fs/promises'; import type {} from '../physics/agent'; test('v2 物理:连续两次搬运,不重载或移动支撑面', async ({ page }, info) => { await page.goto('/physics/agent.html'); await page.waitForFunction(() => Boolean(window.lekiwiAgent)); await page.evaluate( (url) => window.lekiwiAgent.boot(url), `/@fs${resolve('build/lekiwi/lekiwi-v1.zip')}`, ); const results = await page.evaluate(() => window.lekiwiAgent.languagePhysical([ [0.257, 0.75, 0.128], [0.25, 0.5, 0.128], ]), ); await writeFile(info.outputPath('continuous-physical.json'), JSON.stringify(results, null, 2)); for (const r of results) { console.log('language physical', { status: r.status, error: r.error, goal: r.goal, sample: r.sample, transported: r.transported, }); expect(r.status, r.error).toBe('succeeded'); expect(r.succeeded).toBe(true); expect(r.sample.onGoalSupport).toBe(true); expect(r.maxJointSpeed).toBeLessThanOrEqual(2); } await page.evaluate(() => window.lekiwiAgent.dispose()); }); test('v2 真实故障:夹爪锁开不会宣称成功', async ({ page }, info) => { await page.goto('/physics/agent.html'); await page.waitForFunction(() => Boolean(window.lekiwiAgent)); await page.evaluate( (url) => window.lekiwiAgent.boot(url), `/@fs${resolve('build/lekiwi/lekiwi-v1.zip')}`, ); const results = await page.evaluate(() => window.lekiwiAgent.languagePhysical([[0.257, 0.75, 0.128]], 'empty'), ); await writeFile(info.outputPath('empty-grasp.json'), JSON.stringify(results, null, 2)); expect(results[0].status).toBe('failed'); expect(results[0].error).toBe('empty_grasp'); expect(results[0].transported).toBe(0); expect(results[0].succeeded).toBe(false); await page.evaluate(() => window.lekiwiAgent.dispose()); }); test('v2 标定:连续台面边界与停靠姿态 scratch IK', async ({ page }, info) => { await page.goto('/physics/agent.html'); await page.waitForFunction(() => Boolean(window.lekiwiAgent)); await page.evaluate( (url) => window.lekiwiAgent.boot(url), `/@fs${resolve('build/lekiwi/lekiwi-v1.zip')}`, ); const result = await page.evaluate(() => window.lekiwiAgent.calibrateLanguage()); await writeFile(info.outputPath('calibration.json'), JSON.stringify(result, null, 2)); expect(result.unchanged).toBe(true); for (const check of result.checks) expect(check.residual, JSON.stringify(check.target)).toBeLessThan(0.004); await page.evaluate(() => window.lekiwiAgent.dispose()); });