您好!欢迎光临工博士商城

ABB传动服务商

产品:75    

咨询热线:13761095232

QQ QQ
您当前的位置:首页 » 新闻中心 » 上位机实时控制机器人运动之EGM|ABB工业机器人|ABB机器人保养|
产品分类
新闻中心
上位机实时控制机器人运动之EGM|ABB工业机器人|ABB机器人保养|
发布时间:2022-06-06        浏览次数:1342        返回列表
 Externally Guided Motion (689-1 EGM)为ABB机器人方便客户外部直接引导/获取机器人位置等信息而设置的高级接口。

EGM提供了3种不同的特性:

EGM Position Stream:

                 RAPID任务中机械单元的当前和计划位置发送至外部系统。

                速度能达到250Hz(4ms一个点)

EGM Position Guidance:

                相关机器人不会沿RAPID中的编程路径移动,而是沿某件外部装置所生成的路径移动。(即可以变相实现外部路径直接规划)

                机器人可以接受xyzabc笛卡尔坐标,也可以接受a1-a6关节坐标

                能达到4ms

EGM Path Correction:

                用某件外部装置提供的测量值来修改/校正所编写的机器人路径。

                速度为48ms的倍数

EGM 相关选项介绍见 ABB机器人EGM外部引导选项介绍

EGM与PC之间可以通过UDP建立高速通讯,具体实现方式参见 ABB机器人炸裂黑科技

ABB机器人炸裂黑科技 一文介绍了使用指令EGMStreamStart,机器人高速向PC发送位置的方法,若要通过PC进行实时控制,即使用EGM Position Guidance实现闭环控制(PC实时接受机器人位置反馈值并发送新位置给机器人,速度*快可达4ms),如何实现?

可以通过EGMActPose指令开启设置,具体解释如下:

  EGMActPose egmID1\Tool:=MyTool,corr_frame_offs,EGM_FRAME_WORLD,corr_frame_offs,EGM_FRAME_WORLD\x:=egm_minmax_lin1\y:=egm_minmax_lin1\z:=egm_minmax_lin1\rx:=egm_minmax_rot1\ry:=egm_minmax_rot1\rz:=egm_minmax_rot1\LpFilter:=20\MaxSpeedDeviation:=60;

        ! 修正数据基于World坐标系,

        !  关节速度为60°/s 

        ! 设定xyz及姿态的停止收敛域

通过EGMRunPose来开启机器人运动,使用该语句时,机器人会先输出当前机器人位置并接受PC返回的UDP数据,即使用该指令后,无需再使用EGMStreamStart指令进行数据发送。

 EGMRunPose egmID1,EGM_STOP_HOLD\x\y\z\CondTime:=1\RampInTime:=0.05;

     ! 仅接受xyz数据

      ! 若要接受姿态数据,也可加入\rx\ry\rz

      ! 达到位置收敛域后还需要稳定1s

 

C#端,UDP接收到机器人数据后,若要实现视频中效果,则可以将MouseDown位置记录,并将之后Mouse移动的位置与MouseDown的位置做减法并实时赋值给机器人做EGM运动,

void CreateSensorMessage(EgmSensor.Builder sensor)

        {

            // create a header

            EgmHeader.Builder hdr = new EgmHeader.Builder();

            hdr.SetSeqno(_seqNumber++)

                .SetTm((uint)DateTime.Now.Ticks)

                .SetMtype(EgmHeader.Types.MessageType.MSGTYPE_CORRECTION);

 

            sensor.SetHeader(hdr);

 

            // create some sensor data

            EgmPlanned.Builder planned = new EgmPlanned.Builder();

            EgmPose.Builder pos = new EgmPose.Builder();

            EgmQuaternion.Builder pq = new EgmQuaternion.Builder();

            EgmCartesian.Builder pc = new EgmCartesian.Builder();

 

            //364.6839,2.01102E-28,368.9905

            if (Form1.bCatch == true)

            {

            // 若窗体MouseDown后,则发送当前Mouse与MouseDown位置的差值给机器人

                pc.SetX(robot_x + 0.5*(Form1.NewPoint.Y-Form1.DownPoint.Y))

                    .SetY(robot_y + 0.5*(Form1.NewPoint.X-Form1.DownPoint.X))

                    .SetZ(368);

            }

            else

            {

            // 若没有MouseDown,则直接返回机器人的位置

                pc.SetX(robot_x1)

                       .SetY(robot_y1)

                       .SetZ(368);

            }

            pq.SetU0(1.0)

                .SetU1(0.0)

                .SetU2(0.0)

                .SetU3(0.0);

          // 发送姿态数据

            pos.SetPos(pc)

                .SetOrient(pq);

 

            planned.SetCartesian(pos);  // bind pos object to planned

            sensor.SetPlanned(planned); // bind planned to sensor object

 

            return;

        }

 

以下为主程序,其中CreateSensorMessage为上位实现方法。

        public void SensorThread()

        {

            // create an udp client and listen on any address and the port _ipPortNumber

            _udpServer = new UdpClient(_ipPortNumber);

            var remoteEP = new IPEndPoint(IPAddress.Any, _ipPortNumber);

            while (_exitThread == false)

            {

                // 从机器人获取数据 

                var data = _udpServer.Receive(ref remoteEP);

                if (data != null)

                {

                    // de-serialize inbound message from robot

                    EgmRobot robot = EgmRobot.CreateBuilder().MergeFrom(data).Build();

                    // display inbound message

                    DisplayInboundMessage(robot);

 

                    // create a new outbound sensor message

                    EgmSensor.Builder sensor = EgmSensor.CreateBuilder();

                    CreateSensorMessage(sensor);

 

                     using (MemoryStream memoryStream = new MemoryStream())

                        {

                            EgmSensor sensorMessage = sensor.Build();

                            sensorMessage.WriteTo(memoryStream);

                            Console.WriteLine(sensorMessage.ToString());

                            //send the udp message to the robot

                            int bytesSent = _udpServer.Send(memoryStream.ToArray(),

                                                           (int)memoryStream.Length, remoteEP);

                            if (bytesSent < 0)

                            {

                                Console.WriteLine("Error send to robot");

                            }

                        }

                    

                }

            }

        }

PC作为服务端先启动,然后启动机器人即可。
3F31FFD2-B025-4c1d-A47A-1BE163608768

了解更多ABB机器人




 

联系热线:13761095232   联系人:申妹华 联系地址:上海市宝山区富联一路98弄6号

技术和报价服务:星期一至星期六8:00-22:00 ABB传动服务商