• 【Coppeliasim】 通过TCP与coppeliasim通信


    仿真客户端,  代码中启动了tcp服务器。

    1. sim=require'sim'
    2. socket=require'socket'
    3. -- 以下函数将数据写入套接字(仅为简单起见只处理单个数据包):
    4. writeSocketData=function(client,data)
    5. local header=string.char(59,57,math.mod(#data,256),math.floor(#data/256),0,0)
    6. -- 数据包头是(在这种情况下):headerID(59,57),数据大小(WORD),剩余包数(WORD)但在这里未使用
    7. client:send(header..data)
    8. end
    9. -- 以下函数从套接字读取数据(仅为简单起见只处理单个数据包):
    10. readSocketData=function(client)
    11. -- 数据包头是:headerID(59,57),数据大小(WORD),剩余包数(WORD)但在这里未使用
    12. local header=client:receive(6)
    13. if (header==nil) then
    14. return(nil) -- 错误
    15. end
    16. if (header:byte(1)==59)and(header:byte(2)==57) then
    17. local l=header:byte(3)+header:byte(4)*256
    18. return(client:receive(l))
    19. else
    20. return(nil) -- 错误
    21. end
    22. end
    23. -- 感知系统调用
    24. function sysCall_sensing()
    25. local p=sim.getObjectPosition(robot)
    26. sim.addDrawingObjectItem(drawingCont,p)
    27. end
    28. -- 清理系统调用
    29. function sysCall_cleanup()
    30. if client then
    31. client:close()
    32. end
    33. end
    34. -- 线程系统调用
    35. function sysCall_thread()
    36. -- 初始化:
    37. robot=sim.getObject('.')
    38. drawingCont=sim.addDrawingObject(sim.drawing_linestrip+sim.drawing_cyclic,2,0,-1,400,{1,1,0},nil,nil,{1,1,0})
    39. sim.setStepping(true) -- 我们希望手动切换以同步(并且不浪费处理时间!)
    40. -- 获取一些句柄:
    41. local leftMotor=sim.getObject("./LeftMotor") -- 左电机的句柄
    42. local rightMotor=sim.getObject("./RightMotor") -- 右电机的句柄
    43. local noseSensor=sim.getObject("./SensingNose") -- 接近传感器的句柄
    44. -- 在可能未被使用的端口上启动服务器(尽量使用相似的代码):
    45. local portNb=sim.getInt32Param(sim.intparam_server_port_next)
    46. local portStart=sim.getInt32Param(sim.intparam_server_port_start)
    47. local portRange=sim.getInt32Param(sim.intparam_server_port_range)
    48. local newPortNb=portNb+1
    49. if (newPortNb>=portStart+portRange) then
    50. newPortNb=portStart
    51. end
    52. sim.setInt32Param(sim.intparam_server_port_next,newPortNb)
    53. local result=sim.launchExecutable('bubbleRobServer',portNb,0) -- 将最后一个参数设置为1以查看启动服务器的控制台
    54. if (result==-1) then
    55. -- 无法启动可执行文件!
    56. sim.addLog(sim.verbosity_scripterrors,"'bubbleRobServer' 无法启动。模拟将无法正常运行")
    57. else
    58. sim.wait(1,false)
    59. -- 可执行文件可以启动。现在构建一个套接字并连接到服务器:
    60. client=socket.tcp()
    61. local result=client:connect('127.0.0.1',portNb)
    62. if (result==1) then
    63. -- 我们可以连接到服务器
    64. while (true) do
    65. -- 发送接近传感器和模拟时间到bubbleRob服务器应用程序:
    66. -- 准备要发送的数据:
    67. local dataOut={0,sim.getSimulationTime()}
    68. local result,dist=sim.readProximitySensor(noseSensor)
    69. if (result>0) then
    70. dataOut[1]=dist
    71. end
    72. -- 将数据打包成字符串:
    73. dataOut=sim.packFloatTable(dataOut)
    74. -- 发送数据:
    75. writeSocketData(client,dataOut)
    76. -- 从服务器读取回复:
    77. local returnData=readSocketData(client)
    78. if (returnData==nil) then
    79. break -- 读取错误
    80. end
    81. -- 解包接收到的数据:
    82. returnData=sim.unpackFloatTable(returnData)
    83. -- 将值应用为电机速度:
    84. sim.setJointTargetVelocity(leftMotor,returnData[1])
    85. sim.setJointTargetVelocity(rightMotor,returnData[2])
    86. -- 如果模拟时间未改变,请不要在这个循环中浪费时间!这也与主脚本同步
    87. sim.step() -- 这个协程将在下一个模拟步骤中恢复
    88. end
    89. end
    90. end
    91. end

  • 相关阅读:
    《中国棍网球》:体育项目·棍网球
    【Python】编码
    MySQL binlog归档日志和redo log事务日志详解
    从0到1搭建ES集群
    Rust 从入门到精通10-所有权
    JdbcTemplate概述和测试
    1.3.1 认识 Packet Tracer 软件
    NP管理器 NPManager v3.0.49 安卓APK逆向反编译工具
    一台服务器,一个新世界
    Error: impossible constraint in ‘asm‘
  • 原文地址:https://blog.csdn.net/cxyhjl/article/details/134462158