ABB机器人:上位机实时控制机器人运动之EGM
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指令开启设置,具体解释如下:
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作为服务端先启动,然后启动机器人即可。
! 修正数据基于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作为服务端先启动,然后启动机器人即可。
更多信息请咨询:ABB机器人
- 下一篇:上位机如何直接移动ABB机器人?
- 上一篇:ABB机器人:机器人焊接夹具挑选