土拨虎-TUBOT-协作机器人专业媒体
订阅号二维码
TUBOT综合媒体
手机版
访问手机版
开启左侧

Halcon联合机械臂实现视觉定位抓取(五)

[复制链接]
Alex 发表于 2020-9-29 22:22:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
本帖最后由 Alex 于 2020-10-13 18:36 编辑

前言
   在前几节做好基础工作后,就可以开始设计整体的功能框架。首先,你要了解整个项目的工作流程,按照流程顺序制定需要的功能模块。然后,按照功能模块进行编程和测试。
详细过程
5.设计界面并整合代码
   在本项目中,一共包括三个功能模块:相机模块、通讯模块、机械臂模块。因此我们可以按照这三个功能模块设计程序界面,定好整体的设计框架,这样会使我们的编程思路变得很清晰,也有利于后续程序的修改。程序界面设计如下:
图片25.png
   在第三节和第四节我们得到了Halcon识别和Socket通讯的C#代码,如图所示。在winform的主程序中,我们可以直接调用这两个类中定义的函数。下面我会按照三个模块来详细讲解编程的思路和一些核心的代码。
图片26.png
(1) 相机模块
       在相机模块要满足四个个功能,打开相机,测试相机,相机定位,关闭相机。在这里主要例举相机定位的代码。
       ① 相机定位
        这部分就是从Halcon中导出的核心代码,注释参考第三节。
  1. private void btn_Locate_Click(object sender, EventArgs e)
  2.         {
  3.             ho_Image.Dispose();
  4.             HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
  5.             HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
  6.            
  7.             if (HDevWindowStack.IsOpen())
  8.             {
  9.                 HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());            
  10.             }
  11.             if (HDevWindowStack.IsOpen())
  12.             {
  13.                 HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height, hv_Width);
  14.             }
  15.             //Calibration 01: Code generated by Calibration 01(标定)
  16.             HOperatorSet.ReadCamPar("E:/Halcon/socket2.cal", out hv_CameraParameters);
  17.             HOperatorSet.ReadTuple("E:/Halcon/HomMat2D0904_TCP", out hv_HomMat2D);
  18.             // stop(); only in hdevelop
  19.             //Image Acquisition 01: Do something
  20.             //代码直接从Halcon类中调用
  21.         }
复制代码
(2) 通讯模块
     通讯模块需要满足个功能:连接服务器、客户端输出信息、发送信息、断开服务器,在这里主要例举连接服务器的代码。
      ① 连接服务器
  1. // 客户端实例
  2. Client client;
  3. private void btn_Connect_Click(object sender, EventArgs e)
  4.         {
  5.             if (client == null) client = new Client(ClientPrint, txt_IP.Text, txt_Port.Text);
  6.             if (!client.connected) client.start();
  7.             if (client != null) this.Text = "客户端 " + client.localIpPort;
  8.         }
复制代码
(3) 机械臂模块
       在这一部分,不同机器人的通信协议不同,功能代码也会有所不同,由于大族机器人的通信协议主要是发送一定格式的字符串,因此对机器人发送命令只需要通过上位机客户端发送字符串给机器人服务端,机器人就会返回一个确定信号后就开始响应,下图列出了主要的几个通讯接口。
图片27.png
      ① 机械臂单次抓取
       在第三节Halcon代码中根据螺丝角度进行了划分,主要的目的是为了避免机械臂出现奇异点,同时也能优化抓取和放置的运动轨迹。连续抓取只需要添加一个循环,循环次数为首次识别连通域的个数,具体代码如下:
  1. Thread th;
  2. private void btn_Pick_Click(object sender, EventArgs e)
  3.         {
  4.             //开启后台线程
  5.             th = new Thread(Pickmove);           
  6.             if (client != null && client.connected)
  7.               {  
  8.                     th.IsBackground = true;
  9.                     th.Start();
  10.               }
  11.               else
  12.               {
  13.                   txtBox_Status.SelectionColor = Color.Red;
  14.                   ShowMessage("服务器断开,请连接");
  15.                   txtBox_Status.ScrollToCaret();
  16.               }
  17.         }
  18. string Qz1;
  19.         void Pickmove()
  20.         {
  21.             //初始化夹爪
  22. client.Send("SetSerialDO,0,0,;");
  23.             Thread.Sleep(500);
  24.             //运动带过渡点
  25. client.Send("MoveJ,0,37.461,4.036,129.228,0.176,-33.204,5.022,;");
  26.             Thread.Sleep(500);
  27.             while (true)
  28.             {
  29.                 client.Send("ReadMoveState,0,;");
  30.                 Thread.Sleep(500);
  31.                 if (Data == "ReadMoveState,OK,MoveState,;")
  32.                     break;
  33.              }
  34.              //判断有无螺丝
  35.               if ((int)(new HTuple(hv_Area.TupleGreater(10000))) != 0)
  36.                 {
  37.                     double Qx = hv_Qx, Qy = hv_Qy, Rz = hv_Rz;
  38.                     string X, Y, RZ;
  39.                     //取小数点后三位
  40.                     X = Qx.ToString("0.000"); Y = Qy.ToString("0.000"); RZ = Rz.ToString("0.000");
  41.                     //跟据螺丝角度确定放置点,防止出现奇异点
  42. if ((int)(new HTuple(hv_Phi_to_deg.TupleLess(0))) != 0){Qz1 = "-163.000";}
  43.                     else if ((int)(new HTuple(hv_Phi_to_deg.TupleGreaterEqual(0))) != 0) { Qz1 = "17.000"; }
  44.                     client.Send("SetSerialDO,0,0,;");               client.Send("MoveL,0," + X + "," + Y + ",45,-83.01,-83.076," + RZ + ",;");
  45.                     Thread.Sleep(500);
  46.                     while (true)
  47.                     {
  48.                         client.Send("ReadMoveState,0,;");
  49.                         Thread.Sleep(500);
  50.                         if (Data == "ReadMoveState,OK,MoveState,;")
  51.                         {
  52.                             Thread.Sleep(800);
  53.                             client.Send("SetSerialDO,0,1,;");
  54.                             break;
  55.                         }      
  56.                     }
  57.                     
  58.     client.Send("MoveJ,0,37.461,4.036,129.228,0.176,-33.204,5.022,;");
  59.                     Thread.Sleep(200);               
  60.                     while (true)
  61.                     {
  62.                         client.Send("ReadMoveState,0,;");
  63.                         Thread.Sleep(200);
  64.                         if (Data == "ReadMoveState,OK,MoveState,;")
  65.                             break;
  66.                     }
  67.                     Thread.Sleep(200);
  68. client.Send("MoveL,0,-978.130,192.229,30.408,-106.593,-84.492," + Qz1 + ",;");
  69.                     while (true)
  70.                     {
  71.                         client.Send("ReadMoveState,0,;");
  72.                         Thread.Sleep(200);
  73.                         if (Data == "ReadMoveState,OK,MoveState,;")
  74.                             break;
  75.                     }
  76.                     Thread.Sleep(1000);
  77.                     client.Send("SetSerialDO,0,0,;");
  78. client.Send("MoveL,0,-978.130,192.229,-60.408,-106.593,-84.492," + Qz1 + ",;");
  79.                     while (true)
  80.                     {
  81.                         client.Send("ReadMoveState,0,;");
  82.                         Thread.Sleep(200);
  83.                         if (Data == "ReadMoveState,OK,MoveState,;")
  84.                             break;
  85.                     }
  86.                     client.Send("MoveJ,0,37.461,4.036,129.228,0.176,-33.204,5.022,;");
  87.                     while (true)
  88.                     {
  89.                         client.Send("ReadMoveState,0,;");
  90.                         Thread.Sleep(200);
  91.                         if (Data == "ReadMoveState,OK,MoveState,;")
  92.                             break;
  93.                     }                     
  94.                  hv_Area = 0;
  95.             }               
  96.         }
复制代码
     ② 机械臂使能
      机械臂使能,回原点等功能只需要向机器人服务端发送字符串即可,这里只举一个例子说明,但是注意考虑服务器是否连接的问题。
  1. private void btn_Enable_Click(object sender, EventArgs e)
  2.         {
  3.             th = new Thread(checkElectrify);
  4.             if (client != null && client.connected)
  5.              {
  6.                  client.Send("Electrify,;");  
  7.                 th.IsBackground=true;
  8.                 th.Start();                 
  9.             }     
  10.              else
  11.               {
  12.                   txtBox_Status.SelectionColor = Color.Red;
  13.                   ShowMessage("服务器断开,请连接");
  14.                   txtBox_Status.ScrollToCaret();
  15.               }
  16.         }
  17.         void checkElectrify()
  18.         {
  19.             while (Data != "Electrify,OK,;")
  20.                 {
  21.                     Thread.Sleep(1000);
  22.                     if (Data == "Electrify,OK,;")
  23.                         break;
  24.                   }
  25.              client.Send("GrpPowerOn,0,;");
  26.         }
复制代码
在写完上述代码并测试成功后,效果如图所示:
图片28.png
图片29.png
图片30.png
    以上这些就是这个项目的核心代码,当然肯定也有进一步优化的地方,欢迎指正,同时也欢迎交流学习。个人QQ:2840496970




回复

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门图文
排行榜
作者专栏

关注移动端媒体

官方微信

今日头条

官方联系QQ:

1378800608

苏州媒体运营中心

武汉媒体运营中心

Email:1378800608@qq.com

Copyright   ©2015-2016  土拨虎-协作机器人专业媒体-TUBOTPowered by©TUBOT技术支持:土拨虎    ( 鄂ICP备19011827号-1 )