0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python控制Socket通信知识补充

大象机器人科技 来源:大象机器人科技 作者:大象机器人科技 2022-06-24 15:26 次阅读

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

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

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

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

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

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

实战经验
set_coords()在使用笛卡尔坐标系的时候,在某些角度下有可能无法运动,因为机器人可能解算不出来。我可以先用角度移动到笛卡尔坐标系能解算的范围,再去使用
可能会遇到编码问题,因为elephant是python2.7写的。我需要用encode与decode去编码解码,如下:
def get_angles(self):
'''获取当前六个关节角度(°)'''
message = "get_angles()".encode()
self.sock.sendall(message)
angles_str = self.sock.recv(1024)
# while not angles_str.startswith('get_angles'):
# self.sock.sendall(message)
# angles_str = self.sock.recv(1024)
# str to list[float]
angles = [float(p) for p in angles_str[12:-1].decode().split(',')]
return angles
代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 大象机器人Socket控制工具包

import socket
import time

class elephant_command():
def __init__(self):
'''初始化,连接机械臂'''
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_address = ('192.168.2.8', 5001) # 机械臂服务器的IP地址和端口
print("start connect")
self.sock.connect(self.server_address)
print("connect success")

def get_angles(self):
'''获取当前六个关节角度(°)'''
message = "get_angles()"
self.sock.sendall(message)
angles_str = self.sock.recv(1024)
while not angles_str.startswith('get_angles'):
self.sock.sendall(message)
angles_str = self.sock.recv(1024)
# str to list[float]
angles = [float(p) for p in angles_str[12:-1].split(',')]
return angles

def set_angles(self, angles_array, speed):
'''设定六个关节的角度(°)和速度'''
ang_msg = "set_angles({},{})".format(','.join(['{:.3f}'.format(x) for x in angles_array]), speed)
self.sock.sendall(ang_msg)
back_msg = self.sock.recv(1024)
print(back_msg)

def set_angle(self, joint, angle, speed):
'''设定单个关节(joint,1~6)的角度(°)和速度(°/min)'''
ang_msg = "set_angle(J{},{},{})".format(joint, angle, speed)
self.sock.sendall(ang_msg)
back_msg = self.sock.recv(1024)
print(back_msg)

def get_coords(self):
'''获取当前末端位姿(mm)'''
message = "get_coords()".encode()
self.sock.sendall(message)
coords_str = self.sock.recv(1024)
while not coords_str.startswith(b'get_coords'):
self.sock.sendall(message)
coords_str = self.sock.recv(1024)
# str to list[float]
coords = [float(p) for p in coords_str[12:-1].split(b',')]
return coords

def set_coords(self, coords_array, speed):
'''设定机械臂目标位姿(mm)和运动速度(mm/min)'''
coords_msg = "set_coords({},{})".format(','.join(['{:.3f}'.format(x) for x in coords_array]), speed)
# print(coords_msg)
self.sock.sendall(coords_msg.encode())
back_msg = self.sock.recv(1024)
print(back_msg)

def set_coord(self, axis, coord, speed):
'''设定x,y,z,rx,ry,rz某一方向的坐标(mm)和速度(mm/min)'''
coord_msg = "set_coord({},{:.3f},{})".format(axis, coord, speed)
self.sock.sendall(coord_msg)
back_msg = self.sock.recv(1024)
print(back_msg)

def jog_coord(self, axis, dirc, speed):
'''让机械臂沿一轴(axis, x,y,z)方向(dirc, -1负方向,0停止,1正方向)以匀速(mm/min)运动'''
coord_msg = "jog_coord({},{},{})".format(axis, dirc, speed)
self.sock.sendall(coord_msg.encode())
back_msg = self.sock.recv(1024)
print(back_msg)

def jog_stop(self, axis):
'''让机械臂沿一轴(axis, x,y,z,rx,ry,rz,j1~j6)运动停止'''
coord_msg = "jog_stop({})".format(axis)
self.sock.sendall(coord_msg.encode())
back_msg = self.sock.recv(1024)
print(back_msg)

def jog_angle(self, joint, dirc, speed):
'''让机械臂某一关节(joint, 1~6)匀速( / )转动(dirc, -1负方向,0停止,1正方向)'''
coord_msg = "jog_angle(J{},{},{})".format(joint, dirc, speed)
self.sock.sendall(coord_msg.encode())
back_msg = self.sock.recv(1024)
print(back_msg)

def task_stop(self):
'''停止当前任务'''
message = "task_stop()"
self.sock.sendall(message.encode())
back_msg = self.sock.recv(1024)
print(back_msg)

def wait(self, seconds):
'''设定机械臂等待时间(s)'''
message = "wait({})".format(seconds)
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def power_on(self):
'''给机械臂上电?'''
message = "power_on()"
self.sock.sendall(message)
time.sleep(20)
back_msg = self.sock.recv(1024)
print(back_msg)

def power_off(self):
'''给机械臂断电?'''
message = "power_off()"
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def get_speed(self):
'''获取机械臂(末端)速度(mm/s)'''
message = "get_speed()"
self.sock.sendall(message)
speed = self.sock.recv(1024)
return speed

def state_check(self):
'''检查机械臂状态(1正常,0不正常)'''
message = b"state_check()"
self.sock.sendall(message)
state = self.sock.recv(1024)
return state

def check_running(self):
'''检查机械臂是否运行(1正在运行,0不在运行)'''
message = b"check_running()"
self.sock.sendall(message)
running_state = self.sock.recv(1024)
if running_state == 'check_running:1':
return True
else:
return False

def set_torque_limit(self, axis, torque):
'''设置机械臂在x,y,z某一方向上的力矩限制(N)'''
torque_limit = "set_torque_limit({},{})".format(axis, torque)
self.sock.sendall(torque_limit)
back_msg = self.sock.recv(1024)
print(back_msg)

def set_payload(self, payload):
'''设置机械臂负载(kg)'''
message = "set_payload({})".format(payload)
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def set_acceleration(self, acc):
'''设置机械臂(末端)加速度(整数,mm/s^2)'''
message = "set_acceleration({})".format(acc)
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def get_acceleration(self):
'''获取机械臂(末端)加速度(mm/s^2)'''
message = "get_acceleration()"
self.sock.sendall(message)
acc = self.sock.recv(1024)
return acc

def wait_command_done(self):
'''等待命令执行完毕'''
message = "wait_command_done()"
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def pause_program(self):
'''暂停进程'''
message = "pause_program()"
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def resume_program(self):
'''重启已暂停的进程'''
message = "resume_program()"
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def state_on(self):
'''机器人使能(使可控)'''
message = "state_on()"
self.sock.sendall(message)
time.sleep(5)
back_msg = self.sock.recv(1024)
print(back_msg)

def state_off(self):
'''机器人去使能(使不可控)'''
message = "state_off()"
self.sock.sendall(message)
time.sleep(5)
back_msg = self.sock.recv(1024)
print(back_msg)

def set_digital_out(self, pin_number, signal):
""" 设定数字输出端口电平,pin_number:0~15, signal:0低1高"""
digital_signal = 'set_digital_out({},{})'.format(pin_number, signal)
self.sock.sendall(digital_signal.encode())
back_msg = self.sock.recv(1024)
print(back_msg)

简单测试

from elephant import elephant_command
import time
import random

erobot = elephant_command()
# 笛卡尔空间
cur_pose = erobot.get_coords()
print(cur_pose)
ROS控制
尽量多看官方的github代码,里面有最详细的资源github

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

大象机器人ros库的安装
先安装依赖,命令行执行下面语句:(此外ROS以及moveit都已经安装)

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

cd ~/catkin_ws/src
git clone https://github.com/elephantrobotics/mycobot_ros.git
cd ..
catkin build
source /devel/setup.bash
最后一部环境变量也可以设置为永久环境变量的更改,参考之前的博客

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

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

roslaunch mycobot_600 mycobot_600_slider.launch

poYBAGK1ZquAFYgLAAGacHD5hvY273.png


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

rosrun mycobot_600 slider_600.py
特别注意:不要拖动过快以及造成碰撞!!不要拖动过快以及造成碰撞!!不要拖动过快以及造成碰撞!!

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制
    +关注

    关注

    4

    文章

    997

    浏览量

    122142
  • Socket
    +关注

    关注

    0

    文章

    179

    浏览量

    34443
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83466
收藏 人收藏

    评论

    相关推荐

    鸿蒙原生应用开发-网络管理Socket连接(一)

    一、简介 Socket连接主要是通过Socket进行数据传输,支持TCP/UDP/TLS协议。 二、基本概念 Socket:套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端
    发表于 04-01 14:20

    鸿蒙开发实战:【网络管理-Socket连接】

    Socket在网络通信方面的应用,展示了Socket在两端设备的连接验证、聊天通信方面的应用。
    的头像 发表于 03-19 22:04 230次阅读
    鸿蒙开发实战:【网络管理-<b class='flag-5'>Socket</b>连接】

    HarmonyOS 网络管理开发 —Socket 连接

    简介 Socket 连接主要是通过 Socket 进行数据传输,支持 TCP/UDP/TLS 协议。 基本概念 ​ ● Socket:套接字,就是对网络中不同主机上的应用进程之间进行双向通信
    的头像 发表于 02-18 09:20 519次阅读

    什么是Socket连接?Socket的工作原理 它与TCP连接有什么关系?

    和服务器之间的数据交换。 Socket连接的工作原理是基于TCP/IP协议。TCP(传输控制协议)是一种面向连接的、可靠的传输协议,用于在网络中的两个应用程序之间建立可靠的通信。而Socket
    的头像 发表于 01-22 16:10 402次阅读

    物联网LWIP之socket编程

    一,基础概念在我看来Socket就相当于API,就是函数接口,我们使用Socket就可以在不清楚底层原理的基础上进行通信,即Socket会帮助我们处理好网络的Ip地址等。下图就清晰地展
    的头像 发表于 01-18 08:00 558次阅读
    物联网LWIP之<b class='flag-5'>socket</b>编程

    常见的socket三种类型

    常见的socket三种类型  Socket是计算机网络中常用的通信机制,在网络编程中起到了非常重要的作用。Socket可以分为三种类型:流套接字(Stream
    的头像 发表于 12-08 11:18 1721次阅读

    socket、端口、进程的关系

    socket的引入是为了解决不同计算机间进程间通信的问题。 端口是TCP/IP协议中的概念,描述的是TCP协议上的对应的应用,可以理解为基于TCP的系统服务,或者说系统进程!如下图,FTP就需要占用
    的头像 发表于 11-10 15:02 272次阅读
    <b class='flag-5'>socket</b>、端口、进程的关系

    Socket 网络编程框架介绍

    Socket 网络编程框架 Socket(套接字)是一个网络编程概念,描述了一个通信端点(Endpoint),用于建立网络连接(Connection)并传输数据。 Linux Kernel 提供
    的头像 发表于 11-09 14:19 340次阅读
    <b class='flag-5'>Socket</b> 网络编程框架介绍

    Python 十个加快编程效率的技巧

    ; import socket ; print ( os ) print ( socket ) 输出 'os' from '/usr/lib/python3.5/os.py' > 'sock
    的头像 发表于 11-03 15:22 159次阅读

    如何使用Python和PinPong库控制Arduino

    与传感器和其他物理设备集成的应用程序。如果您已经掌握了Python的基础知识,那么您可以通过使用Python控制Arduino来入门。本文目的主要是向您展示如何使用PinPong库通
    的头像 发表于 10-13 10:59 446次阅读
    如何使用<b class='flag-5'>Python</b>和PinPong库<b class='flag-5'>控制</b>Arduino

    Python3与Arduino通信

    电子发烧友网站提供《Python3与Arduino通信.zip》资料免费下载
    发表于 06-26 14:39 0次下载
    <b class='flag-5'>Python</b>3与Arduino<b class='flag-5'>通信</b>

    虹科方案 | 工业树莓派的Socket通信之旅:探索智能工业应用的无限可能

    科IIoT虹科工业树莓派的Socket通信之旅探索智能工业应用的无限可能HongKeTechnology虹/科/方/案01什么是Socket通信So
    的头像 发表于 06-12 10:39 383次阅读
    虹科方案 | 工业树莓派的<b class='flag-5'>Socket</b><b class='flag-5'>通信</b>之旅:探索智能工业应用的无限可能

    工业树莓派的Socket通信之旅:探索智能工业应用的无限可能

    Socket通信是一种网络通信协议,用于在计算机之间进行数据传输。它提供了一种可靠的、双向的、面向连接的通信方式。通过Socket,计算机之
    的头像 发表于 06-08 10:10 564次阅读
    工业树莓派的<b class='flag-5'>Socket</b><b class='flag-5'>通信</b>之旅:探索智能工业应用的无限可能

    虹科工业树莓派的Socket通信之旅:探索智能工业应用的无限可能

    Socket通信是一种网络通信协议,在网络编程中应用广泛。本文为大家介绍虹科工业树莓派结合Socket通信实现的多样功能,欢迎阅读了解。
    的头像 发表于 06-06 17:41 348次阅读
    虹科工业树莓派的<b class='flag-5'>Socket</b><b class='flag-5'>通信</b>之旅:探索智能工业应用的无限可能

    什么是Socket连接?与TCP连接有什么关系?

    什么是Socket连接?它与TCP连接有什么关系? 计算机网络是我们日常生活中不可或缺的一部分,而Socket连接则是网络通信中必不可少的一种机制。Socket是应用层与TCP/IP协
    的头像 发表于 05-23 11:43 410次阅读