在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python控制Socket通信知識(shí)補(bǔ)充

大象機(jī)器人科技 ? 來(lái)源:大象機(jī)器人科技 ? 作者:大象機(jī)器人科技 ? 2022-06-24 15:26 ? 次閱讀

python控制
Socket通信知識(shí)補(bǔ)充
Socket又稱"套接字",應(yīng)用程序通常通過(guò)"套接字"向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求,使主機(jī)間或者一臺(tái)計(jì)算機(jī)上的進(jìn)程間可以通訊。

建立Socket連接至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket ,另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket 。

每臺(tái)電腦對(duì)應(yīng)唯一ip地址,電腦上每一個(gè)進(jìn)程對(duì)應(yīng)一個(gè)端口(一個(gè)進(jìn)程可以綁定多個(gè)端口號(hào),但一個(gè)端口只能綁定一個(gè)進(jìn)程)。此外,0~1023為知名端口號(hào),一般不要去設(shè)置這些,1024~65535則可以自己去設(shè)置。比如9999。

先運(yùn)行服務(wù)端,再運(yùn)行客戶端

配置流程
廠家已經(jīng)把代碼封裝好了,機(jī)器人只要啟動(dòng),服務(wù)端默認(rèn)就打開(kāi)了的(也就是roboflow打開(kāi)就行,不需要上電操作),啟動(dòng)roboflow之后,服務(wù)器端就開(kāi)始運(yùn)行。

可以打開(kāi)roboflow,查看配置的ip以及端口是什么,剩下的操作都很簡(jiǎn)單,調(diào)用接口就行

實(shí)戰(zhàn)經(jīng)驗(yàn)
set_coords()在使用笛卡爾坐標(biāo)系的時(shí)候,在某些角度下有可能無(wú)法運(yùn)動(dòng),因?yàn)闄C(jī)器人可能解算不出來(lái)。我可以先用角度移動(dòng)到笛卡爾坐標(biāo)系能解算的范圍,再去使用
可能會(huì)遇到編碼問(wèn)題,因?yàn)閑lephant是python2.7寫的。我需要用encode與decode去編碼解碼,如下:
def get_angles(self):
'''獲取當(dāng)前六個(gè)關(guān)節(jié)角度(°)'''
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 -*-
# 大象機(jī)器人Socket控制工具包

import socket
import time

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

def get_angles(self):
'''獲取當(dāng)前六個(gè)關(guān)節(jié)角度(°)'''
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):
'''設(shè)定六個(gè)關(guān)節(jié)的角度(°)和速度'''
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):
'''設(shè)定單個(gè)關(guān)節(jié)(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):
'''獲取當(dāng)前末端位姿(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):
'''設(shè)定機(jī)械臂目標(biāo)位姿(mm)和運(yùn)動(dòng)速度(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):
'''設(shè)定x,y,z,rx,ry,rz某一方向的坐標(biāo)(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):
'''讓機(jī)械臂沿一軸(axis, x,y,z)方向(dirc, -1負(fù)方向,0停止,1正方向)以勻速(mm/min)運(yùn)動(dòng)'''
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):
'''讓機(jī)械臂沿一軸(axis, x,y,z,rx,ry,rz,j1~j6)運(yùn)動(dòng)停止'''
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):
'''讓機(jī)械臂某一關(guān)節(jié)(joint, 1~6)勻速( / )轉(zhuǎn)動(dòng)(dirc, -1負(fù)方向,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):
'''停止當(dāng)前任務(wù)'''
message = "task_stop()"
self.sock.sendall(message.encode())
back_msg = self.sock.recv(1024)
print(back_msg)

def wait(self, seconds):
'''設(shè)定機(jī)械臂等待時(shí)間(s)'''
message = "wait({})".format(seconds)
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def power_on(self):
'''給機(jī)械臂上電?'''
message = "power_on()"
self.sock.sendall(message)
time.sleep(20)
back_msg = self.sock.recv(1024)
print(back_msg)

def power_off(self):
'''給機(jī)械臂斷電?'''
message = "power_off()"
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

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

def state_check(self):
'''檢查機(jī)械臂狀態(tài)(1正常,0不正常)'''
message = b"state_check()"
self.sock.sendall(message)
state = self.sock.recv(1024)
return state

def check_running(self):
'''檢查機(jī)械臂是否運(yùn)行(1正在運(yùn)行,0不在運(yùn)行)'''
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):
'''設(shè)置機(jī)械臂在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):
'''設(shè)置機(jī)械臂負(fù)載(kg)'''
message = "set_payload({})".format(payload)
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def set_acceleration(self, acc):
'''設(shè)置機(jī)械臂(末端)加速度(整數(shù),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):
'''獲取機(jī)械臂(末端)加速度(mm/s^2)'''
message = "get_acceleration()"
self.sock.sendall(message)
acc = self.sock.recv(1024)
return acc

def wait_command_done(self):
'''等待命令執(zhí)行完畢'''
message = "wait_command_done()"
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def pause_program(self):
'''暫停進(jìn)程'''
message = "pause_program()"
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

def resume_program(self):
'''重啟已暫停的進(jìn)程'''
message = "resume_program()"
self.sock.sendall(message)
back_msg = self.sock.recv(1024)
print(back_msg)

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

def state_off(self):
'''機(jī)器人去使能(使不可控)'''
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):
""" 設(shè)定數(shù)字輸出端口電平,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)

簡(jiǎn)單測(cè)試

from elephant import elephant_command
import time
import random

erobot = elephant_command()
# 笛卡爾空間
cur_pose = erobot.get_coords()
print(cur_pose)
ROS控制
盡量多看官方的github代碼,里面有最詳細(xì)的資源github

要用rviz控制機(jī)械,肯定就需要安裝大象機(jī)器人的庫(kù)

大象機(jī)器人ros庫(kù)的安裝
先安裝依賴,命令行執(zhí)行下面語(yǔ)句:(此外ROS以及moveit都已經(jīng)安裝)

pip install pymycobot --upgrade
git 庫(kù)并且編譯(刪除src中的mycobot320這個(gè)庫(kù),這個(gè)文件用不到,并且有問(wèn)題)

cd ~/catkin_ws/src
git clone https://github.com/elephantrobotics/mycobot_ros.git
cd ..
catkin build
source /devel/setup.bash
最后一部環(huán)境變量也可以設(shè)置為永久環(huán)境變量的更改,參考之前的博客

實(shí)現(xiàn)與真實(shí)機(jī)械臂的通信需要修改端口波特率等,在py文件中。pro600默認(rèn)使用python3(每一代機(jī)器人的版本不同,我需要看py文件去確定)

pro600的ros控制
啟動(dòng)launch,打開(kāi)rviz。官方已經(jīng)給了配置以及模型文件了。拖動(dòng)劃塊可以移動(dòng)。

roslaunch mycobot_600 mycobot_600_slider.launch

poYBAGK1ZquAFYgLAAGacHD5hvY273.png


如果要實(shí)現(xiàn)實(shí)時(shí)控制機(jī)械臂,那么還需要啟動(dòng)python文件,新開(kāi)一個(gè)終端,用rosrun啟動(dòng)(可能會(huì)手動(dòng)把文件的權(quán)限設(shè)置為可執(zhí)行文件)

rosrun mycobot_600 slider_600.py
特別注意:不要拖動(dòng)過(guò)快以及造成碰撞??!不要拖動(dòng)過(guò)快以及造成碰撞??!不要拖動(dòng)過(guò)快以及造成碰撞!!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制
    +關(guān)注

    關(guān)注

    4

    文章

    1013

    瀏覽量

    122711
  • Socket
    +關(guān)注

    關(guān)注

    0

    文章

    212

    瀏覽量

    34782
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4802

    瀏覽量

    84890
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    socket 客戶端與服務(wù)器的實(shí)現(xiàn)

    1. 理解Socket 在計(jì)算機(jī)網(wǎng)絡(luò)中,socket是一種通信機(jī)制,允許兩個(gè)程序(一個(gè)客戶端和一個(gè)服務(wù)器)通過(guò)網(wǎng)絡(luò)進(jìn)行通信。在Python
    的頭像 發(fā)表于 11-12 14:30 ?373次閱讀

    socket 和 UDP 協(xié)議的對(duì)比

    在現(xiàn)代互聯(lián)網(wǎng)技術(shù)中,數(shù)據(jù)傳輸是核心功能之一。為了實(shí)現(xiàn)這一功能,我們依賴于各種通信協(xié)議和接口。Socket 和 UDP 是兩種廣泛使用的網(wǎng)絡(luò)通信技術(shù),它們?cè)趯?shí)現(xiàn)網(wǎng)絡(luò)通信方面各有特點(diǎn)和用途
    的頭像 發(fā)表于 11-12 14:28 ?364次閱讀

    socket 與 RESTful API 的使用

    在現(xiàn)代網(wǎng)絡(luò)應(yīng)用中,數(shù)據(jù)傳輸和通信是核心功能之一。為了實(shí)現(xiàn)這一功能,開(kāi)發(fā)者通常會(huì)使用兩種主流的技術(shù):Socket和RESTful API。 1. Socket的概念和特點(diǎn) 1.1 Socket
    的頭像 發(fā)表于 11-12 14:22 ?343次閱讀

    socket 在物聯(lián)網(wǎng)中的應(yīng)用

    不同的計(jì)算機(jī)程序在網(wǎng)絡(luò)中進(jìn)行通信。它基于TCP/IP協(xié)議,提供了一種可靠的、面向連接的通信方式。在物聯(lián)網(wǎng)中,Socket使得設(shè)備能夠發(fā)送和接收數(shù)據(jù),實(shí)現(xiàn)遠(yuǎn)程控制和監(jiān)控。 2.
    的頭像 發(fā)表于 11-12 14:19 ?524次閱讀

    socket 加密通信的實(shí)現(xiàn)方式

    在網(wǎng)絡(luò)通信中,數(shù)據(jù)的安全性至關(guān)重要。Socket 編程作為網(wǎng)絡(luò)通信的基礎(chǔ),實(shí)現(xiàn)加密通信是保護(hù)數(shù)據(jù)不被竊取或篡改的重要手段。 1. SSL/TLS 加密 SSL(Secure
    的頭像 發(fā)表于 11-12 14:18 ?514次閱讀

    socket 與 HTTP 協(xié)議的關(guān)系

    在計(jì)算機(jī)網(wǎng)絡(luò)中,Socket和HTTP協(xié)議是兩個(gè)非常重要的概念,它們?cè)跀?shù)據(jù)傳輸和網(wǎng)絡(luò)通信中扮演著關(guān)鍵的角色。 1. Socket的概念 Socket是一種
    的頭像 發(fā)表于 11-12 14:12 ?289次閱讀

    socket 發(fā)送和接收數(shù)據(jù)方法

    1. Socket 基本概念 在網(wǎng)絡(luò)編程中,socket 是一個(gè)通信端點(diǎn)。它允許程序發(fā)送和接收數(shù)據(jù)。根據(jù)通信協(xié)議的不同,socket 可以分
    的頭像 發(fā)表于 11-12 14:07 ?602次閱讀

    socket 網(wǎng)絡(luò)通信協(xié)議解析

    在現(xiàn)代計(jì)算機(jī)科學(xué)中,網(wǎng)絡(luò)通信是信息交換的核心。Socket(套接字)是網(wǎng)絡(luò)通信中一個(gè)至關(guān)重要的概念,它提供了一種抽象層,使得程序能夠發(fā)送和接收數(shù)據(jù)。 1. Socket的基本概念
    的頭像 發(fā)表于 11-12 14:04 ?815次閱讀

    socket 編程基礎(chǔ)入門

    Socket 編程基礎(chǔ)入門 在計(jì)算機(jī)網(wǎng)絡(luò)中,Socket 是一個(gè)抽象層,它將網(wǎng)絡(luò)通信的細(xì)節(jié)隱藏起來(lái),為開(kāi)發(fā)者提供了一個(gè)簡(jiǎn)單的接口來(lái)發(fā)送和接收數(shù)據(jù)。Socket 編程是網(wǎng)絡(luò)編程的基礎(chǔ),它
    的頭像 發(fā)表于 11-12 14:03 ?393次閱讀

    socket與WebSocket的區(qū)別與聯(lián)系

    ) : Socket是一種通信端點(diǎn),它在網(wǎng)絡(luò)編程中用于實(shí)現(xiàn)不同主機(jī)之間的通信。Socket可以是TCP套接字或UDP套接字,分別對(duì)應(yīng)于TCP(傳輸
    的頭像 發(fā)表于 11-04 09:19 ?515次閱讀

    C語(yǔ)言中的socket編程基礎(chǔ)

    Socket編程簡(jiǎn)介 Socket是一種通信機(jī)制,允許程序之間進(jìn)行通信。在C語(yǔ)言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過(guò)使用
    的頭像 發(fā)表于 11-01 16:51 ?396次閱讀

    如何在Python中使用socket

    1. 基本概念 在開(kāi)始使用socket之前,我們需要了解一些基本的網(wǎng)絡(luò)通信概念: IP地址 :用于標(biāo)識(shí)網(wǎng)絡(luò)上的設(shè)備。 端口 :用于標(biāo)識(shí)設(shè)備上的特定服務(wù)。 協(xié)議 :用于規(guī)定數(shù)據(jù)傳輸?shù)囊?guī)則,如TCP
    的頭像 發(fā)表于 11-01 16:10 ?259次閱讀

    什么是socket編程 socket與tcp/ip協(xié)議的關(guān)系

    基于TCP/IP協(xié)議族,這是一組用于網(wǎng)絡(luò)通信的協(xié)議,包括傳輸控制協(xié)議(TCP)和互聯(lián)網(wǎng)協(xié)議(IP)。 Socket與TCP/IP協(xié)議的關(guān)系 Socket是應(yīng)用程序與TCP/IP協(xié)議族之
    的頭像 發(fā)表于 11-01 16:01 ?423次閱讀

    socket的基本概念和原理

    Socket是一種通信協(xié)議,用于在網(wǎng)絡(luò)中實(shí)現(xiàn)進(jìn)程間的通信。它是一種抽象的編程接口,允許應(yīng)用程序通過(guò)網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)。 1. 什么是Socket?
    的頭像 發(fā)表于 08-16 10:51 ?1315次閱讀

    如何理解socket編程接口

    Socket編程接口是一種網(wǎng)絡(luò)編程的基本概念,它提供了一種在不同計(jì)算機(jī)之間進(jìn)行通信的方法。 Socket編程接口的基本概念 1.1 Socket的定義
    的頭像 發(fā)表于 08-16 10:48 ?475次閱讀
    主站蜘蛛池模板: 欧美综合在线视频| 亚洲成a人片77777kkk| 国产拍拍视频| 国产精品一区二区综合 | 欧美精品区| 天堂网在线最新版www| 国产欧美色图| 成人欧美一区二区三区小说| 开心激情婷婷| 求毛片网站| 六月婷婷在线| 国产高清在线视频| 韩国三级在线视频| 免费黄色小视频| 日韩在线三级| 天堂a| 日韩欧美亚洲综合久久影院d3 | 性生大片免费观看无遮挡| 欧美激情一欧美吧| 亚洲福利一区| 一级做a爱片久久毛片| 四虎精品成人免费观看| 性色影院| 亚洲成人自拍| 五月天丁香花婷婷| 亚洲国产欧美日韩一区二区三区| 四虎影视最新地址| 免费的黄色片| 俺去在线| 狠狠干狠狠搞| 91精品福利久久久| 欧美一区二区三区激情啪啪| 视频在线观看一区二区三区| 亚洲狠狠97婷婷综合久久久久| 日本三级三级三级免费看| 国产日韩精品一区二区在线观看| 天天做天天爱天天一爽一毛片| 国产精品久久久亚洲456| 国产aa| 欧美三级在线| 最新日本免费一区二区三区中文|