Example #1
0
        static List <Mesh> PoseMeshes(MechanicalGroup group, IList <Plane> planes, Mesh tool)
        {
            planes = planes.ToList();
            var count = planes.Count - 1;

            planes.RemoveAt(count);
            planes.Add(planes[count - 1]);

            var outMeshes = group.DefaultMeshes.Select(m => m.DuplicateMesh()).Append(tool.DuplicateMesh()).ToList();

            for (int i = 0; i < group.DefaultPlanes.Count; i++)
            {
                var s = Transform.PlaneToPlane(group.DefaultPlanes[i], planes[i]);
                outMeshes[i].Transform(s);
            }

            return(outMeshes);
        }
Example #2
0
        private static RobotSystem Create(XElement element, Plane basePlane)
        {
            var type         = element.Name.LocalName;
            var name         = element.Attribute(XName.Get("name")).Value;
            var manufacturer = (Manufacturers)Enum.Parse(typeof(Manufacturers), element.Attribute(XName.Get("manufacturer")).Value);
            var mechanisms   = new List <Mechanism>();

            var mechanicalGroups = new List <MechanicalGroup>();

            foreach (var mechanicalGroup in element.Elements(XName.Get("Mechanisms")))
            {
                mechanicalGroups.Add(MechanicalGroup.Create(mechanicalGroup));
            }

            IO       io        = null;
            XElement ioElement = element.Element(XName.Get("IO"));

            if (ioElement != null)
            {
                string[] doNames = null, diNames = null, aoNames = null, aiNames = null;

                var doElement = ioElement.Element(XName.Get("DO"));
                var diElement = ioElement.Element(XName.Get("DI"));
                var aoElement = ioElement.Element(XName.Get("AO"));
                var aiElement = ioElement.Element(XName.Get("AI"));

                if (doElement != null)
                {
                    doNames = doElement.Attribute(XName.Get("names")).Value.Split(',');
                }
                if (diElement != null)
                {
                    diNames = diElement.Attribute(XName.Get("names")).Value.Split(',');
                }
                if (aoElement != null)
                {
                    aoNames = aoElement.Attribute(XName.Get("names")).Value.Split(',');
                }
                if (aiElement != null)
                {
                    aiNames = aiElement.Attribute(XName.Get("names")).Value.Split(',');
                }

                io = new IO()
                {
                    DO = doNames, DI = diNames, AO = aoNames, AI = aiNames
                };
            }

            Mesh environment = null;

            if (type == "RobotCell")
            {
                switch (manufacturer)
                {
                case (Manufacturers.ABB):
                    return(new RobotCellAbb(name, mechanicalGroups, io, basePlane, environment));

                case (Manufacturers.KUKA):
                    return(new RobotCellKuka(name, mechanicalGroups, io, basePlane, environment));

                case (Manufacturers.UR):
                    return(new RobotCellUR(name, mechanicalGroups[0].Robot, io, basePlane, environment));

                case (Manufacturers.FANUC):
                    return(new RobotCellFanuc(name, mechanicalGroups, io, basePlane, environment));

                case (Manufacturers.Staubli):
                    return(new RobotCellStaubli(name, mechanicalGroups, io, basePlane, environment));
                }
            }

            return(null);
        }
Example #3
0
            internal MechanicalGroupKinematics(MechanicalGroup group, Target target, double[] prevJoints, Plane?coupledPlane, bool displayMeshes, Plane?basePlane)
            {
                var jointCount = group.Joints.Count;

                Joints = new double[jointCount];
                var         planes = new List <Plane>();
                List <Mesh> meshes = (displayMeshes) ? new List <Mesh>() : null;
                var         errors = new List <string>();

                Plane?robotBase = basePlane;

                target = target.ShallowClone();
                Mechanism coupledMech = null;

                if (target.Frame.CoupledMechanism != -1 && target.Frame.CoupledMechanicalGroup == group.Index)
                {
                    coupledMech = group.Externals[target.Frame.CoupledMechanism];
                }


                // Externals
                foreach (var external in group.Externals)
                {
                    var externalPrevJoints = prevJoints?.Subset(external.Joints.Select(x => x.Number).ToArray());
                    var externalKinematics = external.Kinematics(target, externalPrevJoints, displayMeshes, basePlane);

                    for (int i = 0; i < external.Joints.Length; i++)
                    {
                        Joints[external.Joints[i].Number] = externalKinematics.Joints[i];
                    }

                    planes.AddRange(externalKinematics.Planes);
                    if (displayMeshes)
                    {
                        meshes.AddRange(externalKinematics.Meshes);
                    }
                    errors.AddRange(externalKinematics.Errors);

                    if (external == coupledMech)
                    {
                        coupledPlane = externalKinematics.Planes[externalKinematics.Planes.Length - 1];
                    }

                    if (external.MovesRobot)
                    {
                        Plane plane         = (robotBase != null) ? robotBase.Value : Plane.WorldXY;
                        Plane externalPlane = externalKinematics.Planes[externalKinematics.Planes.Length - 1];

                        plane.Transform(externalPlane.ToTransform());
                        robotBase = plane;
                    }
                }

                // Coupling
                if (coupledPlane != null)
                {
                    var coupledFrame = target.Frame.ShallowClone();
                    var plane        = coupledFrame.Plane;
                    plane.Transform(Transform.PlaneToPlane(Plane.WorldXY, (Plane)coupledPlane));
                    coupledFrame.Plane = plane;
                    target.Frame       = coupledFrame;
                }

                // Robot
                var robot = group.Robot;

                if (robot != null)
                {
                    var robotPrevJoints = prevJoints?.Subset(robot.Joints.Select(x => x.Number).ToArray());
                    var robotKinematics = robot.Kinematics(target, robotPrevJoints, displayMeshes, robotBase);

                    for (int j = 0; j < robot.Joints.Length; j++)
                    {
                        Joints[robot.Joints[j].Number] = robotKinematics.Joints[j];
                    }

                    planes.AddRange(robotKinematics.Planes);
                    if (displayMeshes)
                    {
                        meshes.AddRange(robotKinematics.Meshes);
                    }
                    Configuration = robotKinematics.Configuration;
                    if (robotKinematics.Errors.Count > 0)
                    {
                        errors.AddRange(robotKinematics.Errors);
                    }
                }

                // Tool
                Plane toolPlane = target.Tool.Tcp;

                toolPlane.Transform(planes[planes.Count - 1].ToTransform());
                planes.Add(toolPlane);


                if (displayMeshes)
                {
                    if (target.Tool.Mesh != null)
                    {
                        Mesh toolMesh = target.Tool.Mesh.DuplicateMesh();
                        toolMesh.Transform(Transform.PlaneToPlane(target.Tool.Tcp, planes[planes.Count - 1]));
                        meshes.Add(toolMesh);
                    }
                    else
                    {
                        meshes.Add(null);
                    }
                }

                Planes = planes.ToArray();
                if (displayMeshes)
                {
                    Meshes = meshes.ToArray();
                }

                if (errors.Count > 0)
                {
                    Errors.AddRange(errors);
                }
            }
Example #4
0
            internal MechanicalGroupKinematics(MechanicalGroup group, Target target, double[] prevJoints, Plane? coupledPlane, bool displayMeshes, Plane? basePlane)
            {
                var jointCount = group.Joints.Count;
                Joints = new double[jointCount];
                var planes = new List<Plane>();
                List<Mesh> meshes = (displayMeshes) ? new List<Mesh>() : null;
                var errors = new List<string>();

                Plane? robotBase = basePlane;

                target = target.ShallowClone();
                Mechanism coupledMech = null;

                if (target.Frame.CoupledMechanism != -1 && target.Frame.CoupledMechanicalGroup == group.Index)
                {
                    coupledMech = group.Externals[target.Frame.CoupledMechanism];
                }


                // Externals
                foreach (var external in group.Externals)
                {
                    var externalPrevJoints = prevJoints == null ? null : prevJoints.Subset(external.Joints.Select(x => x.Number).ToArray());
                    var externalKinematics = external.Kinematics(target, externalPrevJoints, displayMeshes, basePlane);

                    for (int i = 0; i < external.Joints.Length; i++)
                        Joints[external.Joints[i].Number] = externalKinematics.Joints[i];

                    planes.AddRange(externalKinematics.Planes);
                    if (displayMeshes) meshes.AddRange(externalKinematics.Meshes);
                    errors.AddRange(externalKinematics.Errors);

                    if (external == coupledMech)
                        coupledPlane = externalKinematics.Planes[externalKinematics.Planes.Length - 1];

                    if (external.MovesRobot)
                        robotBase = externalKinematics.Planes[externalKinematics.Planes.Length - 1];
                }

                // Coupling
                if (coupledPlane != null)
                {
                    var coupledFrame = target.Frame.ShallowClone();
                    var plane = coupledFrame.Plane;
                    plane.Transform(Transform.PlaneToPlane(Plane.WorldXY, (Plane)coupledPlane));
                    coupledFrame.Plane = plane;
                    target.Frame = coupledFrame;
                }

                // Robot
                var robot = group.Robot;

                if (robot != null)
                {
                    var robotPrevJoints = prevJoints == null ? null : prevJoints.Subset(robot.Joints.Select(x => x.Number).ToArray());
                    var robotKinematics = robot.Kinematics(target, robotPrevJoints, displayMeshes, robotBase);

                    for (int j = 0; j < robot.Joints.Length; j++)
                        Joints[robot.Joints[j].Number] = robotKinematics.Joints[j];

                    planes.AddRange(robotKinematics.Planes);
                    if (displayMeshes) meshes.AddRange(robotKinematics.Meshes);
                    Configuration = robotKinematics.Configuration;
                    if (robotKinematics.Errors.Count > 0)
                    {
                        errors.AddRange(robotKinematics.Errors);
                    }
                }

                // Tool
                    Plane toolPlane = target.Tool.Tcp;
                    toolPlane.Transform(planes[planes.Count - 1].ToTransform());
                    planes.Add(toolPlane);


                if (displayMeshes)
                {
                    if (target.Tool.Mesh != null)
                    {
                        Mesh toolMesh = target.Tool.Mesh.DuplicateMesh();
                        toolMesh.Transform(Transform.PlaneToPlane(target.Tool.Tcp, planes[planes.Count - 1]));
                        meshes.Add(toolMesh);
                    }
                    else
                        meshes.Add(null);
                }

                Planes = planes.ToArray();
                if (displayMeshes) Meshes = meshes.ToArray();

                if (errors.Count > 0)
                {
                    Errors.AddRange(errors);
                }
            }