Skip to content

应用示例

textmsg函数

  1. 使用textmsg()可以打印类型为字符串的信息至aubo_control日志中。其打印信息可在示教器的主页界面中看到。

    image-20240321153009674
  2. textmsg的LUA函数定义: textmsg(msg: string) -> nil

  3. 用法:
    (1)当变量类型为String(字符串)时:

    -- 获取机器人的名称
    name = getName()
    textmsg(name)

    (2)当变量类型为Boolean(布尔值) 时:

    -- 机器人是否已经停止下来
    is_steady = isSteady()
    textmsg(tostring(is_steady))

    (3)当变量类型为Number(数字) 时:

    -- 获取机器人的模式状态
    mode_type = getRobotModeType()
    textmsg("The type of robot mode is "..mode_type)

    (4)当变量类型为Table(表) 时:

    -- 获取当前的机械臂关节角度
    joint_positions = getJointPositions()
    textmsg(table.concat(joint_positions, ', '))

TCP/IP通信示例

实现TCP/IP通信的方法

这里有两种方法可以实现机器人和外部设备的socket通信:

  • 方法1是使用Lua的Socket库。

    Lua的Socket库是一种通用的网络编程库,允许在Lua脚本中创建Socket连接,进行数据传输和接收。

  • 方法2是使用由遨博提供的Socket类Lua接口。

    遨博提供了专门的Socket类脚本接口,允许机器人直接与外部设备进行通信。

遨博的Socket类Lua接口介绍

  1. socketOpen

    • 函数定义:

      lua
      socketOpen(address: string, port: number, socket_name: string) -> nil
    • 功能:建立TCP/IP以太网socket通信

    • 参数:

      • address:目标服务器的IP地址
      • port:目标服务器的端口号
      • socket_name:socket名称
    • 示例:

      lua
      socketOpen('192.168.10.46', '8000', "socket_0")
  2. socketSendLine

    • 函数定义:

      lua
      socketSendLine(str: string, socket_name: string) -> nil
    • 功能:向服务器发送带有换行字符的字符串,以ASCII编码将字符串通过socket发送

    • 参数:

      • str:要发送的字符串
      • socket_name:socket名称
    • 示例:

      lua
      socketSendLine("abcd", "socket_0")
  3. socketReadString

    • 函数定义:

      lua
      socketReadString(variable: string, socket_name: string, prefix: string, suffix: string, interpret_escape: boolean) -> number
    • 功能:从socket中读取所有数据,并将数据作为字符串返回

    • 参数:

      • variable:要读取的字符串
      • socket_name:socket 名称
      • prefix:指定了从socket中提取的子串(消息)的起始位置。从socket中到达 "prefix" 结束的数据将被忽略和移除
      • suffix:指定了从socket中提取的子串(消息)的结束位置。在 "suffix" 之后的任何剩余数据将被保留
      • interpret_escape:表示是否解释转义字符。如果设置为true,函数会解释字符串中的转义字符(例如'\r'、'\n'、'\t'等),如果设置为false,则不会解释转义字符,而是将其原样返回
    • 示例:

      lua
      socketReadString("camera", "socket_0", "", "", false)
  4. socketClose

    • 函数定义:

      lua
      socketClose(socket_name: string) -> nil
    • 功能:关闭与服务器的socket连接

    • 参数:

      • socket_name:socket 名称
    • 示例:

      lua

    socketClose("socket_0") ```

通过脚本实现TCP/IP通信的操作步骤

操作步骤如下:

  1. 确认外部设备与机器人处于同一局域网中,保证双方可以互相ping通(Windows系统建议关闭防火墙)。

  2. 以机器人为客户端,外部设备为服务端,方法1和方法2的脚本代码示例分别如下。

    • 方法1:使用Lua的Socket库来实现TCP通信
    lua
    local socket = require("socket.core")
    local tcp = socket.tcp()
    local host = '192.168.10.46' --服务端IP地址
    local port = '8000' --串口号
    
    local clicon = tcp:connect(host,port)
    if(clicon) then
        textmsg('connect '..host..' ok!')
    else
        textmsg('connect error')
    end
    
    take_photo = "get" --发送给服务端的字符串
    
    tcp:settimeout(2)
    
    str1 = nil --服务端发送的数据
    
    while (true) do  
        --如果服务端关闭则停止循环
        if status =="closed" then
            textmsg("server is closed!")
            break 
        end
    
        --发送给服务端字符串
        tcp:send(take_photo)
        sleep(1)
        
        --接收服务端发送的字符串,只有接收到good,停止循环
        s, status, str1 = tcp:receive()
        if str1 == "good" then
            textmsg("receive: "..str1)
            break
        end
    
    end
    
    tcp:close()

    这段代码的主要作用是机器人与指定的服务端建立TCP连接,然后发送字符串 "get" 给服务端,并且持续接收服务端发送的数据,直到接收到 "good" 字符串为止,最后关闭TCP连接。

    • 方法2:使用由遨博提供的Socket类接口来实现TCP通信
    lua
    ip = "192.168.10.46" --服务端IP地址
    port = 8000 --串口号
    client_name = "socket_0" --客户端名称
    rec_key = "camera" --接收服务端发送的字符串
    socketOpen(ip, port, client_name) ----与服务端建立通信
    socketSendLine("abcd", client_name) --发送给服务端字符串
    sleep(1)
    
    rec_str = ""
    --接收服务端发送的字符串后停止循环
    while(rec_str == nil or rec_str == "") 
    do
        socketReadString(rec_key, client_name, "", "", false) 
        sleep(0.1)
        rec_str = getString(rec_key, "")
        textmsg("**********")
        textmsg(rec_str)
        textmsg("**********")
        sleep(1)
        socketSendLine("dfgh", client_name)
    end
    
    socketClose(client_name)

    这段代码的主要作用机器人是与服务端建立Socket连接,发送一些字符串给服务端,然后循环地接收服务端发送的字符串,直到接收到非空的字符串为止,最后关闭与服务端的socket连接。

  3. 以TCP调试助手来模拟服务端,指定服务器的监听端口号为8000。

    image-20240401151447235
  4. 以机械臂作为客户端,修改方法1或方法2的示例代码中服务器的IP地址和端口号。

  5. 在示教器中新建一个脚本模板,运行方法1或方法2中的脚本示例。

    注意:运行工程前,请取消勾选”程序一直循环“。

    image-20240401152501845
  6. 运行结果如下:

    • 方法1:使用Lua的Socket库来实现TCP通信

      运行示教器工程后,TCP调试助手会一直接收到机器人发送的“get”字符串。

      image-20240401152824063

      在TCP调试助手中向机器人发送“good”字符串后,

      image-20240401153418282

      机器人停止循环发送“get”字符串,并且关闭socket连接。

      image-20240401153645540
    • 方法2:使用由遨博提供的Socket类接口来实现TCP通信

      运行示教器工程后,TCP调试助手会一直接收到机器人发送的“dfgh”字符串。

      image-20240401155918475

      在TCP调试助手中向机器人发送一个非空的字符串,例如“stop”后,

      image-20240401160036819

      机器人停止循环发送“dfgh”字符串,并且关闭socket连接。