2
3

ロボットアームのゲームです。

Last updated at Posted at 2024-09-06

GPT-2: ロボットエンジニアリング。3軸ロボットアームシミュレーションのゲームです。ロボットの制御は、ロボットがロボットを動かすための制御機構ですが、その制御をロボットに命令するのではなく、制御するロボットを制御するために、コンピュータがプログラムを実行します。 プログラムはプログラムの実行結果をコンピュータに送信し、プログラムが実行された結果がコンピュータのプログラムに送られます。プログラムを実行するロボットはロボット制御プログラム(プログラム制御)をプログラム実行プログラムとして実行しています。 このプログラムでは、プログラミングの知識がなくても、簡単にロボットを動かせますし、「ロボットプログラミング」というと、難しいイメージがありますが、「プログラミングを学ぼう」と思えば、誰でも簡単に学べるので、初心者でも安心ですね。

スクリーンショット 2024-09-06 220116.png

image.png

マウスの左右と上下でアーム操作です。

コードをメモ帳などのテキストエディタに貼り付け、ファイルを「index.html」の拡張子で.htmlのファイルとして保存します。その後、保存したファイルをブラウザで開けば、コードが実行されます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3軸ロボットアームシミュレーション</title>
    <style>
        body { margin: 0; }
        canvas { display: block; }
    </style>
</head>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
    <script>
        // シーン、カメラ、レンダラーの設定
        const scene = new THREE.Scene();
        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        const renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        // ロボットアームの部品を作成する関数
        const createArmPart = (length, color) => {
            const geometry = new THREE.CylinderGeometry(0.1, 0.1, length, 32);
            const material = new THREE.MeshBasicMaterial({ color: color });
            const cylinder = new THREE.Mesh(geometry, material);
            return cylinder;
        };

        // ロボットアームのベースを作成し、シーンに追加
        const base = createArmPart(0.5, 0x00ff00);
        scene.add(base);

        // アームの各部品を作成し、親子関係を設定
        const arm1 = createArmPart(1, 0x00ff00);
        arm1.position.y = 0.5;
        base.add(arm1);

        const arm2 = createArmPart(1, 0x00ff00);
        arm2.position.y = 1;
        arm1.add(arm2);

        // アームの先端に球を取り付け
        const endEffector = new THREE.Mesh(
            new THREE.SphereGeometry(0.1, 32, 32),
            new THREE.MeshBasicMaterial({ color: 0xff0000 })
        );
        endEffector.position.y = 1;
        arm2.add(endEffector);

        // カメラの位置を設定
        camera.position.z = 3;

        // マウスの位置を追跡するための変数
        const mouse = new THREE.Vector2();
        window.addEventListener('mousemove', (event) => {
            mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
            mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
        });

        // 簡易的な逆運動学計算を行う関数
        const calculateIK = (target) => {
            // アームの長さ
            const armLength1 = 1;
            const armLength2 = 1;

            const dx = target.x;
            const dy = target.y;

            const d = Math.sqrt(dx * dx + dy * dy);
            if (d > armLength1 + armLength2) {
                // ターゲットが届かない場合
                return;
            }

            const angle2 = Math.acos((d * d - armLength1 * armLength1 - armLength2 * armLength2) / (2 * armLength1 * armLength2));
            const angle1 = Math.atan2(dy, dx) - Math.atan2(armLength2 * Math.sin(angle2), armLength1 + armLength2 * Math.cos(angle2));

            return { angle1, angle2 };
        };

        // アニメーションループ
        const animate = () => {
            requestAnimationFrame(animate);

            // マウス位置に基づいてIK計算を行う
            const target = new THREE.Vector2(mouse.x * 2, mouse.y * 2); // アームの長さに合わせてスケールを調整
            const { angle1, angle2 } = calculateIK(target);

            // アームの関節角度を更新
            if (angle1 !== undefined && angle2 !== undefined) {
                arm1.rotation.z = angle1;
                arm2.rotation.z = angle2;
            }

            // シーンをレンダリング
            renderer.render(scene, camera);
        };

        animate();
    </script>
</body>
</html>

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3