2022-12-04 23:11:05 +01:00
|
|
|
using UnityEngine;
|
2018-11-10 20:44:41 +01:00
|
|
|
|
|
|
|
|
public class Leg : MonoBehaviour {
|
|
|
|
|
public Transform Hip1;
|
|
|
|
|
public Transform Hip2;
|
|
|
|
|
public Transform Knie;
|
|
|
|
|
|
2022-12-04 23:11:05 +01:00
|
|
|
// rotation angles for different servos
|
2018-11-10 20:44:41 +01:00
|
|
|
public double a1 = 0;
|
|
|
|
|
public double a2 = 0;
|
|
|
|
|
public double a3 = 0;
|
|
|
|
|
|
|
|
|
|
public Vector3 point = new Vector3(10, 10, 0);
|
|
|
|
|
public Quaternion rotation = new Quaternion(0, 0, 0, 0);
|
|
|
|
|
|
2022-12-04 23:11:05 +01:00
|
|
|
public Vector3 transformationBeforeRotation = new Vector3(0, 0, 0);
|
|
|
|
|
public Vector3 transformationAfterRotation = new Vector3(0, 0, 0);
|
2018-11-11 18:11:13 +01:00
|
|
|
|
2022-12-04 23:11:05 +01:00
|
|
|
public bool invertForLeftLeg = false;
|
2018-11-10 20:44:41 +01:00
|
|
|
|
2022-12-04 23:11:05 +01:00
|
|
|
// translation to change origin to middle of body
|
2018-11-10 23:54:58 +01:00
|
|
|
public double translateX = 0;
|
2018-11-10 20:44:41 +01:00
|
|
|
public double translateY = 0;
|
|
|
|
|
public double translateZ = 0;
|
|
|
|
|
|
|
|
|
|
public GameObject pointShouldBe;
|
2018-11-14 22:22:38 +01:00
|
|
|
//public Vector3 pos = new Vector3(0, 0, 0);
|
2018-11-10 20:44:41 +01:00
|
|
|
|
2018-11-12 23:57:23 +01:00
|
|
|
public int startServo = -1;
|
|
|
|
|
|
2018-11-10 20:44:41 +01:00
|
|
|
private Foot foot = new Foot();
|
|
|
|
|
|
|
|
|
|
// Use this for initialization
|
|
|
|
|
void Start () {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update is called once per frame
|
2018-11-10 23:54:58 +01:00
|
|
|
public void FixedUpdate()
|
2018-11-10 20:44:41 +01:00
|
|
|
{
|
|
|
|
|
foot.X = point.x;
|
2018-11-10 23:23:03 +01:00
|
|
|
foot.Y = point.y;
|
|
|
|
|
foot.Z = point.z;
|
2018-11-10 20:44:41 +01:00
|
|
|
|
|
|
|
|
foot.rotationX = rotation.x;
|
2018-11-10 23:23:03 +01:00
|
|
|
foot.rotationY = rotation.y;
|
|
|
|
|
foot.rotationZ = rotation.z;
|
2018-11-10 20:44:41 +01:00
|
|
|
|
|
|
|
|
foot.translateX = translateX;
|
|
|
|
|
foot.translateY = translateY;
|
|
|
|
|
foot.translateZ = translateZ;
|
|
|
|
|
|
2018-11-11 22:26:43 +01:00
|
|
|
// transform before rotation.
|
2022-12-04 23:11:05 +01:00
|
|
|
foot.transformation = transformationBeforeRotation;
|
2018-11-11 18:11:13 +01:00
|
|
|
|
2018-11-11 22:26:43 +01:00
|
|
|
// transform after rotation.
|
2022-12-04 23:11:05 +01:00
|
|
|
foot.transformation2 = transformationAfterRotation;
|
2018-11-11 22:26:43 +01:00
|
|
|
|
2022-12-04 23:11:05 +01:00
|
|
|
foot.invert = invertForLeftLeg;
|
2018-11-10 20:44:41 +01:00
|
|
|
|
|
|
|
|
foot.setleg();
|
|
|
|
|
|
2022-12-04 23:11:05 +01:00
|
|
|
if (!invertForLeftLeg)
|
2018-11-10 20:44:41 +01:00
|
|
|
{
|
|
|
|
|
a1 = foot.O1 - 90;
|
|
|
|
|
a2 = 90 - foot.O2;
|
|
|
|
|
a3 = foot.O3 - 90;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
a1 = (foot.O1 - 90)*-1;
|
|
|
|
|
a2 = 90 - foot.O2;
|
|
|
|
|
a3 = foot.O3 - 90;
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-04 23:11:05 +01:00
|
|
|
if (!invertForLeftLeg && startServo != -1)
|
2018-11-12 23:57:23 +01:00
|
|
|
{
|
2022-12-04 23:11:05 +01:00
|
|
|
// Serial.Instance.send(startServo,
|
|
|
|
|
// (int)Remap((float)a1, -90, 90, 2500, 500),
|
|
|
|
|
// (int)Remap((float)a2, -90, 90, 2500, 500), // 0 is middel
|
|
|
|
|
// (int)Remap((float)a3, 90, -90, 2500, 500)); // 0 is middel
|
|
|
|
|
if(false)
|
2018-11-12 23:57:23 +01:00
|
|
|
Serial.Instance.send(startServo,
|
2022-12-04 23:11:05 +01:00
|
|
|
(int)Remap((float)a1, -90, 90, 0, 180),
|
|
|
|
|
(int)Remap((float)a2, 90, -90, 0, 180), // 0 is middel
|
|
|
|
|
(int)Remap((float)a3, -90, 90, 0, 180)); // 0 is middel
|
2018-11-12 23:57:23 +01:00
|
|
|
}
|
2022-12-04 23:11:05 +01:00
|
|
|
else if (invertForLeftLeg && startServo != -1)
|
2018-11-12 23:57:23 +01:00
|
|
|
{
|
|
|
|
|
double a1 = foot.O1 - 90;
|
|
|
|
|
double a2 = 90 - foot.O2;
|
|
|
|
|
double a3 = foot.O3 - 90;
|
|
|
|
|
|
2022-12-04 23:11:05 +01:00
|
|
|
// Serial.Instance.send(startServo,
|
|
|
|
|
// (int)Remap((float)a1, -90, 90, 500, 2500),
|
|
|
|
|
// (int)Remap((float)a2, -90, 90, 500, 2500), // 0 is middel
|
|
|
|
|
// (int)Remap((float)a3, 90, -90, 500, 2500)); // 0 is middel
|
|
|
|
|
if (false)
|
|
|
|
|
Serial.Instance.send(startServo,
|
|
|
|
|
(int)Remap((float)a1, 90, -90, 0, 180),
|
|
|
|
|
(int)Remap((float)a2, -90, 90, 0, 180), // 0 is middel
|
|
|
|
|
(int)Remap((float)a3, 90, -90, 0, 180)); // 0 is middel
|
2018-11-12 23:57:23 +01:00
|
|
|
}
|
|
|
|
|
|
2018-11-10 20:44:41 +01:00
|
|
|
Hip1.transform.localRotation = Quaternion.Euler(0, (float)a1, 0);
|
|
|
|
|
Hip2.transform.localRotation = Quaternion.Euler((float)a2, 0, 0);
|
|
|
|
|
Knie.transform.localRotation = Quaternion.Euler((float)a3, 0, 0);
|
|
|
|
|
|
2018-11-10 23:23:03 +01:00
|
|
|
pointShouldBe.transform.localPosition = foot.pos;
|
2018-11-10 20:44:41 +01:00
|
|
|
}
|
2018-11-12 23:57:23 +01:00
|
|
|
|
2018-11-19 22:21:47 +01:00
|
|
|
public Vector3 getLocalPos()
|
|
|
|
|
{
|
|
|
|
|
return point;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-14 22:22:38 +01:00
|
|
|
public Vector3 getWorldPos()
|
|
|
|
|
{
|
|
|
|
|
return point + new Vector3((float)translateX, (float)translateY, (float)translateZ);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setWorldPos(Vector3 pos)
|
|
|
|
|
{
|
|
|
|
|
this.point = pos - new Vector3((float)translateX, (float)translateY, (float)translateZ);
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-12 23:57:23 +01:00
|
|
|
public static float Remap(float value, float from1, float to1, float from2, float to2)
|
|
|
|
|
{
|
|
|
|
|
return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
|
|
|
|
|
}
|
2018-11-10 20:44:41 +01:00
|
|
|
}
|