首页 > 其他分享 >越疆机器人与上位机的通讯

越疆机器人与上位机的通讯

时间:2024-11-01 18:15:32浏览次数:4  
标签:do float end socket -- 机器人 上位 越疆 local

        越疆机器人的开发终于整完了。整体来说这个算比较简单,但是由于本身越疆是通过他们自己的上位机进行控制与通讯,并不是单纯用lua解释器去运行,因此效率属实不算高。最近也是在搞UR的开发,这个真的是一言难尽,明天加班的时候再吐槽。

        首先确认一点,越疆机器人在运行代码的时候,是无法通过示教去控制机器人的。话不多说,老样子上代码:

function TcpInit() --创建套接字 
    local port = 8888
    local ip = "192.168.1.1" --机器人作为服务端的IP
    local SeverSocket = 0
    local err 
    err,SeverSocket = TCPCreate(true,ip,port)
    if (err ~= 0) then 
        print("tcp create socket error")
    end
    return SeverSocket
end

function TcpListen(socket) --利用已创建的套接字进行监听
    local err 
    err = TCPStart(socket,0)
    if (err ~= 0) then
      print("socket listen error")
    end
    return socket
end

function TcpRecv(socket) --利用已创建的套接字接收数据
    local err
    local Recvbuf 
    err,Recvbuf = TCPRead(socket,5)
    return Recvbuf,socket 
end

function Analyze(socket) --分析数据并解析
    local Recvbuf    --初始化
    local IntRecv = {}
    local TempInt = {}
    local RecJpos = {}
    local RecPpos = {}
    local Head = {} 
    Recvbuf,socket = TcpRecv(socket) --接收数据
    if (Recvbuf[1] == nil) then --断开重新监听
      print("recieve data from VI error and  error code is",err)
      TCPDestroy(socket)
      socket = TcpInit()
      err = TCPStart(socket, 0) 
      Recvbuf,socket = TcpRecv(socket) --接收流为Recvbuf
      end 
    for i = 0,51 do  
          IntRecv[i] = Recvbuf[i+1]    --用整型数组接收
    end 
    for i = 0,3 do
        Head[i] = IntRecv[i]           --帧头 自己定义
    end
    for i = 0,5 do
        for j = 0,3 do
            TempInt[j] = IntRecv[4 + i*4 + j]  --IEEE754的协议 四字节byte转换位32位float
        end
        RecJpos[i] = Hex_to_float(TempInt)     --用float数组存储收到的关节 6个float
        
        for j = 0,3 do
            TempInt[j] = IntRecv[28 + i * 4 + j] 
        end 
        RecPpos[i] = Hex_to_float(TempInt)     --用float数组存储收到的位置 6个float
     end
    SendData(socket)
end

function SendData(socket)                     --发送数据
    local send_buf = {}
    local err 
    for i = 1,52 do
        send_buf[i] = 0
    end
    local tempInt = {}
    send_buf[1] = 1                          --发送包的帧头
    send_buf[2] = 1
    send_buf[3] = 1
    send_buf[4] = 1
    local send_curJ = GetAngle().joint     --获取当前关节
    local send_curP = GetPose().pose       --获取当前位置
    for i = 0,5 do 
        local tempInt = Float_to_hex(send_curJ[i+1])  --float转换成byte
        local tempInt1 = Float_to_hex(send_curP[i+1])
        for j = 0,3 do 
            send_buf[4 + i * 4 + j + 1] = tempInt[j]
            send_buf[28 + i * 4 + j + 1] = tempInt1[j]
        end
    end
    err = TCPWrite(socket,send_buf)         --发送数据
end

function Hex_to_float(temparray) --input type = {a,b,c,d} as 4 number;output type = float 0.132134 as a double float
    if temparray[0] ~= nil then
      local i = temparray[0] * 16 ^ 6 + temparray[1] * 16 ^ 4 + temparray[2] * 16 ^ 2 + temparray[3]
      local s = ((i >> 31) == 0) and 1 or -1 
      local e = (i >> 23) & 0xFF 
      local m = (e == 0) and (i & 0x7FFFFF) << 1 or (i & 0x7FFFFF) | 0x800000 
      return s * (2 ^ (e - 127)) * (m / 8388608.0)
    else 
      i = 0
    end

end

function FloatToOx(float)  --float转换成二进制
    local FloatDot = 0.0
    local IntOx = {}
    local FinalOx = {}
    local Int
    local count = 0
    local E = 0
    local M = {}
    local sysmbel = 0
    
    for i = 0,31 do
        FinalOx[i] = 0
    end

    --S
    if (float >= 0) then
        FinalOx[0] = 0
        float = float * 1
    else 
        FinalOx[0] = 1
        float = float * -1
    end
    --E
    for i = 0,7 do
        IntOx[i] = 0
    end
    Int = float // 1
    FloatDot = float - Int
    while (Int > 0) do
        IntOx[count] = Int%2
        count = count + 1
        Int = Int // 2
    end
    count = count - 1 
   
    for i = 0,count do 
        M[i] = IntOx[count - i - 1]
    end
    
    --M 
    local DotCount = FloatDot
    for i = 0,22 do
        DotCount = DotCount * 2
        if DotCount < 1 and count < 0 then
            count = count - 1 
        end
    end
    for i = 0,22-count do 
        FloatDot = FloatDot * 2
        M[count+i] = FloatDot//1
        FloatDot = FloatDot - FloatDot//1
    end

    E = 127 + count 
    for i = 0,7 do
        if (E > 0) then
            FinalOx[8-i] = E%2
            E = E // 2
        end
    end
    for i = 9,31 do 
    FinalOx[i] = M[i-9]
    end
    return FinalOx
end

function OxToInt(ox)  --二进制转换为十进制
    local IntArray = {}
    for i = 0,3 do
        IntArray[i] = ox[(i*8)]*2^7+ ox[(i*8+1)]*2^6+ ox[(i*8+2)]*2^5+ ox[(i*8+3)]*2^4+ ox[(i*8+4)]*2^3+ ox[(i*8+5)]*2^2+ ox[(i*8+6)]*2+ ox[(i*8+7)] 
    end
    return IntArray
end

function Float_to_hex(float)  --float转换为十六进制
    local TempOx = {}
    local TempArray = {}
    TempOx = FloatToOx(float)
    TempArray = OxToInt(TempOx)
    return TempArray
end

标签:do,float,end,socket,--,机器人,上位,越疆,local
From: https://blog.csdn.net/xx_233/article/details/143436995

相关文章

  • 【机器人学导论】简明学习笔记2.1——空间描述和变换(1/2)
    主要参考学习资料:《机器人学导论(第4版)》JohnJ.Craig著台大机器人学之运动学——林沛群(本文插图来自该课程课件)本章前置知识:矢量和矩阵的四则运算-单位矩阵-转置矩阵-逆矩阵-正交矩阵码字不易,求点赞收藏(´•ω•̥`)有问题欢迎评论区讨论~目录空间描述和变换描......
  • ABB喷涂机器人维护保养
    正确规范的ABB喷涂机器人保养能够最大限度保证机器人正常运行,保证经济效率并提高产量。因此,预防性喷涂机器人保养是一项不可或缺的工作。ABB喷涂机器人正常运行每3年或10000小时后,则需要做一次全面预防性保养,ABB机器人保养,规范操作与日常维护可以降低ABB喷涂机器人故障频......
  • 机器人技术革新:人工智能的强力驱动
    内容概要在当今世界,机器人技术与人工智能的结合正如星星与大海,彼此辉映。随着科技的不断进步,人工智能不仅仅是为机器人赋予了“聪明的大脑”,更是推动了整个行业的快速发展。回顾机器人技术的发展历程,我们会发现,从简单的机械臂到如今高效的自主机器人,这一过程充满了创新与挑战......
  • 《热点聚焦:人工智能在机器人技术中的突破性进展》
    内容概要在当今的科技舞台上,人工智能与机器人技术的结合如同一场华丽的交响乐,每一个音符都在奏响未来的旋律。我们不难发现,智能控制正在为机器人赋予更高的智慧和灵活性,犹如一位高明的指挥家,将所有乐器协调地发挥到极致。随着运动学领域最新进展的涌现,机器人不仅能够精确执行......
  • 笔试真题——机器人拧魔方模拟
    说明:根据遗留的记忆写出来了此篇文章,可能与原文解释有部分出入,但总体思路一致。题目说明:YYYYRRRRWWWWOOOOGGGGBBBBUUL'第一行为输入为对应F,R,B,L,U,D面的元素颜色第二行输入为翻转的标识符标识符有:F、F'、R、R'、B、B'、L、L'、U、U'、D、D'。分别为对应明的顺时针......
  • 一个AI模型统治所有机器人
    原文链接:RoboticControlModule:OneAIModelforAnyRobot-IEEESpectrumAnewmodelcanoperatevirtuallyanyrobotdesign,includingarms,quadrupeds,anddrones一个新模型几乎可以操作任何机器人设计,包括机械臂、四足机器人和无人机 UCBerkeley/CarnegieM......
  • autMan奥特曼机器人-对接Docker版本NTQQ详细教程
    准备1、准备一台服务器,amd64/arm64都可以,配置最好还是2核保底吧。2、准备一个VNC软件。1Remote:点此下载3、准备手机登陆机器人QQ号,扫码NTQQ相关NTQQ一键脚本(适用于小白支持autMan/无界)复制以下代码,在服务器发送即可。按照提示步骤输入正确参数,如果出现输错可以自行去......
  • HTML&CSS:3D旋转动画机器人摄像头
    效果演示创建了一个3D机器人摄像头效果。HTML<divclass="modelViewPort"><divclass="eva"><divclass="head"><divclass="eyeChamber"><divclass="eye">......
  • 安川YASKAWA工业机器人板卡维修策略
    一、安川YASKAWA工业机器人板卡识别故障症状首先,需要准确识别电路板故障的症状。这通常包括安川YASKAWA机器人操作不稳定、错误代码频繁出现、某些功能失效或整体性能下降等。通过仔细观察和诊断,可以确定问题是否源自电路板。在工业机器人领域,广州子锐机器人技术有限公司的服务......
  • 【机器人学导论】简明学习笔记1——概述
    主要参考学习资料:《机器人学导论(第4版)》JohnJ.Craig著台大机器人学之运动学——林沛群前置课程:博主目前只对线性代数和理论力学方面有一定基础,学习过程中遇到额外必要的前置知识我会做补充或者开辟新的知识笔记专栏笔记特点:简明扼要,对学习资料进行消化调整辅助理解码......