当前位置:   article > 正文

大象机器人机械臂控制_大象机器人手眼标定

大象机器人手眼标定

官方GitHub


python控制

Socket通信知识补充

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket

每台电脑对应唯一ip地址,电脑上每一个进程对应一个端口(一个进程可以绑定多个端口号,但一个端口只能绑定一个进程)。此外,0~1023为知名端口号,一般不要去设置这些,1024~65535则可以自己去设置。比如9999。

先运行服务端,再运行客户端

配置流程

厂家已经把代码封装好了,机器人只要启动,服务端默认就打开了的(也就是roboflow打开就行,不需要上电操作),启动roboflow之后,服务器端就开始运行。

可以打开roboflow,查看配置的ip以及端口是什么,剩下的操作都很简单,调用接口就行

实战经验

  • set_coords()在使用笛卡尔坐标系的时候,在某些角度下有可能无法运动,因为机器人可能解算不出来。我可以先用角度移动到笛卡尔坐标系能解算的范围,再去使用
  • 可能会遇到编码问题,因为elephant是python2.7写的。我需要用encode与decode去编码解码,如下:
    1. def get_angles(self):
    2. '''获取当前六个关节角度(°)'''
    3. message = "get_angles()".encode()
    4. self.sock.sendall(message)
    5. angles_str = self.sock.recv(1024)
    6. # while not angles_str.startswith('get_angles'):
    7. # self.sock.sendall(message)
    8. # angles_str = self.sock.recv(1024)
    9. # str to list[float]
    10. angles = [float(p) for p in angles_str[12:-1].decode().split(',')]
    11. return angles

代码

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # 大象机器人Socket控制工具包
  4. import socket
  5. import time
  6. class elephant_command():
  7. def __init__(self):
  8. '''初始化,连接机械臂'''
  9. self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. self.server_address = ('192.168.2.8', 5001) # 机械臂服务器的IP地址和端口
  11. print("start connect")
  12. self.sock.connect(self.server_address)
  13. print("connect success")
  14. def get_angles(self):
  15. '''获取当前六个关节角度(°)'''
  16. message = "get_angles()"
  17. self.sock.sendall(message)
  18. angles_str = self.sock.recv(1024)
  19. while not angles_str.startswith('get_angles'):
  20. self.sock.sendall(message)
  21. angles_str = self.sock.recv(1024)
  22. # str to list[float]
  23. angles = [float(p) for p in angles_str[12:-1].split(',')]
  24. return angles
  25. def set_angles(self, angles_array, speed):
  26. '''设定六个关节的角度(°)和速度'''
  27. ang_msg = "set_angles({},{})".format(','.join(['{:.3f}'.format(x) for x in angles_array]), speed)
  28. self.sock.sendall(ang_msg)
  29. back_msg = self.sock.recv(1024)
  30. print(back_msg)
  31. def set_angle(self, joint, angle, speed):
  32. '''设定单个关节(joint,1~6)的角度(°)和速度(°/min)'''
  33. ang_msg = "set_angle(J{},{},{})".format(joint, angle, speed)
  34. self.sock.sendall(ang_msg)
  35. back_msg = self.sock.recv(1024)
  36. print(back_msg)
  37. def get_coords(self):
  38. '''获取当前末端位姿(mm)'''
  39. message = "get_coords()".encode()
  40. self.sock.sendall(message)
  41. coords_str = self.sock.recv(1024)
  42. while not coords_str.startswith(b'get_coords'):
  43. self.sock.sendall(message)
  44. coords_str = self.sock.recv(1024)
  45. # str to list[float]
  46. coords = [float(p) for p in coords_str[12:-1].split(b',')]
  47. return coords
  48. def set_coords(self, coords_array, speed):
  49. '''设定机械臂目标位姿(mm)和运动速度(mm/min)'''
  50. coords_msg = "set_coords({},{})".format(','.join(['{:.3f}'.format(x) for x in coords_array]), speed)
  51. # print(coords_msg)
  52. self.sock.sendall(coords_msg.encode())
  53. back_msg = self.sock.recv(1024)
  54. print(back_msg)
  55. def set_coord(self, axis, coord, speed):
  56. '''设定x,y,z,rx,ry,rz某一方向的坐标(mm)和速度(mm/min)'''
  57. coord_msg = "set_coord({},{:.3f},{})".format(axis, coord, speed)
  58. self.sock.sendall(coord_msg)
  59. back_msg = self.sock.recv(1024)
  60. print(back_msg)
  61. def jog_coord(self, axis, dirc, speed):
  62. '''让机械臂沿一轴(axis, x,y,z)方向(dirc, -1负方向,0停止,1正方向)以匀速(mm/min)运动'''
  63. coord_msg = "jog_coord({},{},{})".format(axis, dirc, speed)
  64. self.sock.sendall(coord_msg.encode())
  65. back_msg = self.sock.recv(1024)
  66. print(back_msg)
  67. def jog_stop(self, axis):
  68. '''让机械臂沿一轴(axis, x,y,z,rx,ry,rz,j1~j6)运动停止'''
  69. coord_msg = "jog_stop({})".format(axis)
  70. self.sock.sendall(coord_msg.encode())
  71. back_msg = self.sock.recv(1024)
  72. print(back_msg)
  73. def jog_angle(self, joint, dirc, speed):
  74. '''让机械臂某一关节(joint, 1~6)匀速( / )转动(dirc, -1负方向,0停止,1正方向)'''
  75. coord_msg = "jog_angle(J{},{},{})".format(joint, dirc, speed)
  76. self.sock.sendall(coord_msg.encode())
  77. back_msg = self.sock.recv(1024)
  78. print(back_msg)
  79. def task_stop(self):
  80. '''停止当前任务'''
  81. message = "task_stop()"
  82. self.sock.sendall(message.encode())
  83. back_msg = self.sock.recv(1024)
  84. print(back_msg)
  85. def wait(self, seconds):
  86. '''设定机械臂等待时间(s)'''
  87. message = "wait({})".format(seconds)
  88. self.sock.sendall(message)
  89. back_msg = self.sock.recv(1024)
  90. print(back_msg)
  91. def power_on(self):
  92. '''给机械臂上电?'''
  93. message = "power_on()"
  94. self.sock.sendall(message)
  95. time.sleep(20)
  96. back_msg = self.sock.recv(1024)
  97. print(back_msg)
  98. def power_off(self):
  99. '''给机械臂断电?'''
  100. message = "power_off()"
  101. self.sock.sendall(message)
  102. back_msg = self.sock.recv(1024)
  103. print(back_msg)
  104. def get_speed(self):
  105. '''获取机械臂(末端)速度(mm/s)'''
  106. message = "get_speed()"
  107. self.sock.sendall(message)
  108. speed = self.sock.recv(1024)
  109. return speed
  110. def state_check(self):
  111. '''检查机械臂状态(1正常,0不正常)'''
  112. message = b"state_check()"
  113. self.sock.sendall(message)
  114. state = self.sock.recv(1024)
  115. return state
  116. def check_running(self):
  117. '''检查机械臂是否运行(1正在运行,0不在运行)'''
  118. message = b"check_running()"
  119. self.sock.sendall(message)
  120. running_state = self.sock.recv(1024)
  121. if running_state == 'check_running:1':
  122. return True
  123. else:
  124. return False
  125. def set_torque_limit(self, axis, torque):
  126. '''设置机械臂在x,y,z某一方向上的力矩限制(N)'''
  127. torque_limit = "set_torque_limit({},{})".format(axis, torque)
  128. self.sock.sendall(torque_limit)
  129. back_msg = self.sock.recv(1024)
  130. print(back_msg)
  131. def set_payload(self, payload):
  132. '''设置机械臂负载(kg)'''
  133. message = "set_payload({})".format(payload)
  134. self.sock.sendall(message)
  135. back_msg = self.sock.recv(1024)
  136. print(back_msg)
  137. def set_acceleration(self, acc):
  138. '''设置机械臂(末端)加速度(整数,mm/s^2)'''
  139. message = "set_acceleration({})".format(acc)
  140. self.sock.sendall(message)
  141. back_msg = self.sock.recv(1024)
  142. print(back_msg)
  143. def get_acceleration(self):
  144. '''获取机械臂(末端)加速度(mm/s^2)'''
  145. message = "get_acceleration()"
  146. self.sock.sendall(message)
  147. acc = self.sock.recv(1024)
  148. return acc
  149. def wait_command_done(self):
  150. '''等待命令执行完毕'''
  151. message = "wait_command_done()"
  152. self.sock.sendall(message)
  153. back_msg = self.sock.recv(1024)
  154. print(back_msg)
  155. def pause_program(self):
  156. '''暂停进程'''
  157. message = "pause_program()"
  158. self.sock.sendall(message)
  159. back_msg = self.sock.recv(1024)
  160. print(back_msg)
  161. def resume_program(self):
  162. '''重启已暂停的进程'''
  163. message = "resume_program()"
  164. self.sock.sendall(message)
  165. back_msg = self.sock.recv(1024)
  166. print(back_msg)
  167. def state_on(self):
  168. '''机器人使能(使可控)'''
  169. message = "state_on()"
  170. self.sock.sendall(message)
  171. time.sleep(5)
  172. back_msg = self.sock.recv(1024)
  173. print(back_msg)
  174. def state_off(self):
  175. '''机器人去使能(使不可控)'''
  176. message = "state_off()"
  177. self.sock.sendall(message)
  178. time.sleep(5)
  179. back_msg = self.sock.recv(1024)
  180. print(back_msg)
  181. def set_digital_out(self, pin_number, signal):
  182. """ 设定数字输出端口电平,pin_number:0~15, signal:0低1高"""
  183. digital_signal = 'set_digital_out({},{})'.format(pin_number, signal)
  184. self.sock.sendall(digital_signal.encode())
  185. back_msg = self.sock.recv(1024)
  186. print(back_msg)

简单测试

  1. from elephant import elephant_command
  2. import time
  3. import random
  4. erobot = elephant_command()
  5. # 笛卡尔空间
  6. cur_pose = erobot.get_coords()
  7. print(cur_pose)


ROS控制

 尽量多看官方的github代码,里面有最详细的资源github

要用rviz控制机械,肯定就需要安装大象机器人的库

大象机器人ros库的安装

先安装依赖,命令行执行下面语句:(此外ROS以及moveit都已经安装)

pip install pymycobot --upgrade

git 库并且编译(删除src中的mycobot320这个库,这个文件用不到,并且有问题)

  1. cd ~/catkin_ws/src
  2. git clone https://github.com/elephantrobotics/mycobot_ros.git
  3. cd ..
  4. catkin build
  5. source /devel/setup.bash

最后一部环境变量也可以设置为永久环境变量的更改,参考之前的博客

实现与真实机械臂的通信需要修改端口波特率等,在py文件中。pro600默认使用python3(每一代机器人的版本不同,我需要看py文件去确定)

pro600的ros控制

启动launch,打开rviz。官方已经给了配置以及模型文件了。拖动划块可以移动。

roslaunch mycobot_600 mycobot_600_slider.launch

 如果要实现实时控制机械臂,那么还需要启动python文件,新开一个终端,用rosrun启动(可能会手动把文件的权限设置为可执行文件)

rosrun mycobot_600 slider_600.py

特别注意:不要拖动过快以及造成碰撞!!不要拖动过快以及造成碰撞!!不要拖动过快以及造成碰撞!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/425087
推荐阅读
相关标签
  

闽ICP备14008679号