示例#1
0
        IEnumerator TargetMove(Vector3 targetPos, List <List <float> > midsTargetAngles)
        {
            var startAngle = robot.GetAngles();

            var deltas = new List <float>();

            deltas.Add(GetMagnitude(startAngle, midsTargetAngles[0]));

            for (var i = 1; i < midsTargetAngles.Count(); ++i)
            {
                deltas.Add(GetMagnitude(midsTargetAngles[i - 1], midsTargetAngles[i]));
            }

            var allDelta = deltas.Sum();
            var phasies  = deltas.Select(d => d / allDelta).ToList();
            var moveTime = allDelta / aveSpeed;

            var currentTime = 0.0f;
            int moveloop    = 0;


            print("moving");

            int index = 0;

            FKManager.Foreach(linkParams, midsTargetAngles[index], fk);

            float offset   = 0;
            float progress = 0;

            while (!IsCloseEnough(robot.CurrentEndPosition(), targetPos) && moveloop < maxMoveLoop && currentTime < moveTime)
            {
                if (progress >= 1)
                {
                    offset += phasies[index];
                    ++index;
                    startAngle = robot.GetAngles();
                    FKManager.Foreach(linkParams, midsTargetAngles[index], fk);
                }
                robot.SetAngle(AnglesDeltaByPhase(robot.GetAngles(), startAngle, midsTargetAngles[index], offset, phasies[index], out progress, currentTime, moveTime));


                moveloop++;
                currentTime += Time.deltaTime;
                yield return(null);
            }
        }
示例#2
0
        IEnumerator AngleMove(List <float> targetAngle)
        {
            int moveloop = 0;
            var moveTime = GetMagnitude(robot.GetAngles(), targetAngle) / aveSpeed;

            var currentTime = 0.0f;

            FKManager.Foreach(linkParams, targetAngle, fk);
            print("moving");

            var startAngle = robot.GetAngles();

            while (robot.GetAngles().Where(a => a != 0).Any() && moveloop < maxMoveLoop && currentTime < moveTime)
            {
                robot.SetAngle(AnglesDelta(robot.GetAngles(), startAngle, targetAngle, currentTime, moveTime));
                moveloop++;
                currentTime += Time.deltaTime;
                yield return(null);
            }
        }
示例#3
0
        IEnumerator TargetMove(Vector3 targetPos, List <float> targetAngle)
        {
            var startAngle = robot.GetAngles();
            var moveTime   = GetMagnitude(robot.GetAngles(), targetAngle) / aveSpeed;

            var currentTime = 0.0f;
            int moveloop    = 0;

            FKManager.Foreach(linkParams, targetAngle, fk);

            print("moving");

            while (!IsCloseEnough(robot.CurrentEndPosition(), targetPos) && moveloop < maxMoveLoop && currentTime < moveTime)
            {
                robot.SetAngle(AnglesDelta(robot.GetAngles(), startAngle, targetAngle, currentTime, moveTime));
                moveloop++;
                currentTime += Time.deltaTime;
                yield return(null);
            }
        }
示例#4
0
        // Update is called once per frame
        void FixedUpdate()
        {
            if (!isInControl)
            {
                if (!isIK)
                {
                    if (ikCoroutine != null)
                    {
                        StopCoroutine(ikCoroutine);
                        ikCoroutine = null;
                    }

                    //print($"angles { thetas[0] * Mathf.Rad2Deg}, { thetas[1] * Mathf.Rad2Deg}, { thetas[2] * Mathf.Rad2Deg}, { thetas[3] * Mathf.Rad2Deg}, { thetas[4] * Mathf.Rad2Deg}, { thetas[5] * Mathf.Rad2Deg}");

                    currentAngles = new List <float>()
                    {
                        angle1 *Mathf.Deg2Rad, angle2 *Mathf.Deg2Rad, angle3 *Mathf.Deg2Rad, angle4 *Mathf.Deg2Rad, angle5 *Mathf.Deg2Rad, angle6 *Mathf.Deg2Rad
                    };
                    SetAngles(currentAngles);

                    var readThetas = new List <float>();
                    foreach (var joint in joints)
                    {
                        readThetas.Add(joint.GetPosition());
                    }

                    HTMs   = hC.GetHTMs(readThetas);
                    EndHTM = HTMs[HTMs.Count() - 1];
                    fk.Foreach(HTMs);
                }
                else
                {
                    if (ikCoroutine == null)
                    {
                        ikCoroutine = StartCoroutine(IKAuto());
                    }
                    SetAngles(currentAngles);
                }
            }
        }
示例#5
0
 public static void Foreach(List <LinkParam> linkParams, List <float> angles, FKManager fk)
 {
     fk.Foreach(HomogeneourCoordinate.GetHTMs(linkParams, angles));
 }