女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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
特別注意:不要拖動過快以及造成碰撞!!不要拖動過快以及造成碰撞!!不要拖動過快以及造成碰撞?。?br />
審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制
    +關注

    關注

    5

    文章

    1022

    瀏覽量

    123539
  • Socket
    +關注

    關注

    1

    文章

    212

    瀏覽量

    35547
  • python
    +關注

    關注

    56

    文章

    4825

    瀏覽量

    86170
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    socket 客戶端與服務器的實現

    1. 理解Socket 在計算機網絡中,socket是一種通信機制,允許兩個程序(一個客戶端和一個服務器)通過網絡進行通信。在Python
    的頭像 發表于 11-12 14:30 ?726次閱讀

    socket 和 UDP 協議的對比

    在現代互聯網技術中,數據傳輸是核心功能之一。為了實現這一功能,我們依賴于各種通信協議和接口。Socket 和 UDP 是兩種廣泛使用的網絡通信技術,它們在實現網絡通信方面各有特點和用途
    的頭像 發表于 11-12 14:28 ?790次閱讀

    socket 與 RESTful API 的使用

    在現代網絡應用中,數據傳輸和通信是核心功能之一。為了實現這一功能,開發者通常會使用兩種主流的技術:Socket和RESTful API。 1. Socket的概念和特點 1.1 Socket
    的頭像 發表于 11-12 14:22 ?779次閱讀

    socket 在物聯網中的應用

    不同的計算機程序在網絡中進行通信。它基于TCP/IP協議,提供了一種可靠的、面向連接的通信方式。在物聯網中,Socket使得設備能夠發送和接收數據,實現遠程控制和監控。 2.
    的頭像 發表于 11-12 14:19 ?995次閱讀

    socket 加密通信的實現方式

    在網絡通信中,數據的安全性至關重要。Socket 編程作為網絡通信的基礎,實現加密通信是保護數據不被竊取或篡改的重要手段。 1. SSL/TLS 加密 SSL(Secure
    的頭像 發表于 11-12 14:18 ?1233次閱讀

    socket 與 HTTP 協議的關系

    在計算機網絡中,Socket和HTTP協議是兩個非常重要的概念,它們在數據傳輸和網絡通信中扮演著關鍵的角色。 1. Socket的概念 Socket是一種
    的頭像 發表于 11-12 14:12 ?664次閱讀

    socket 發送和接收數據方法

    1. Socket 基本概念 在網絡編程中,socket 是一個通信端點。它允許程序發送和接收數據。根據通信協議的不同,socket 可以分
    的頭像 發表于 11-12 14:07 ?1727次閱讀

    socket 網絡通信協議解析

    在現代計算機科學中,網絡通信是信息交換的核心。Socket(套接字)是網絡通信中一個至關重要的概念,它提供了一種抽象層,使得程序能夠發送和接收數據。 1. Socket的基本概念
    的頭像 發表于 11-12 14:04 ?2542次閱讀

    socket 編程基礎入門

    Socket 編程基礎入門 在計算機網絡中,Socket 是一個抽象層,它將網絡通信的細節隱藏起來,為開發者提供了一個簡單的接口來發送和接收數據。Socket 編程是網絡編程的基礎,它
    的頭像 發表于 11-12 14:03 ?866次閱讀

    socket與WebSocket的區別與聯系

    ) : Socket是一種通信端點,它在網絡編程中用于實現不同主機之間的通信。Socket可以是TCP套接字或UDP套接字,分別對應于TCP(傳輸
    的頭像 發表于 11-04 09:19 ?1092次閱讀

    C語言中的socket編程基礎

    Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程是網絡編程的基礎。通過使用
    的頭像 發表于 11-01 16:51 ?1024次閱讀

    如何在Python中使用socket

    1. 基本概念 在開始使用socket之前,我們需要了解一些基本的網絡通信概念: IP地址 :用于標識網絡上的設備。 端口 :用于標識設備上的特定服務。 協議 :用于規定數據傳輸的規則,如TCP
    的頭像 發表于 11-01 16:10 ?604次閱讀

    什么是socket編程 socket與tcp/ip協議的關系

    基于TCP/IP協議族,這是一組用于網絡通信的協議,包括傳輸控制協議(TCP)和互聯網協議(IP)。 Socket與TCP/IP協議的關系 Socket是應用程序與TCP/IP協議族之
    的頭像 發表于 11-01 16:01 ?1034次閱讀

    socket的基本概念和原理

    Socket是一種通信協議,用于在網絡中實現進程間的通信。它是一種抽象的編程接口,允許應用程序通過網絡發送和接收數據。 1. 什么是Socket
    的頭像 發表于 08-16 10:51 ?3147次閱讀

    如何理解socket編程接口

    Socket編程接口是一種網絡編程的基本概念,它提供了一種在不同計算機之間進行通信的方法。 Socket編程接口的基本概念 1.1 Socket的定義
    的頭像 發表于 08-16 10:48 ?809次閱讀