当前位置:网站首页>[Central Task Scheduling System - Communication Development]
[Central Task Scheduling System - Communication Development]
2022-08-11 10:03:00 【2345VOR】
一、 方案设计目标
学习socket通信、掌握C++编程、熟悉ROS通信机制,完成中央任务调度系统与ROS系统之间数据的交互.
二、 技术指标
上位机开发工具指定为Visual Studio或者Qt;
在Windows上创建客户端,ROS上创建服务器端;
开发上位机人机交互界面,最终实现Windows端“哈喽,轻舟机器人!”“Hello,AI Word!”“1024 1024 1024”等内容与ROS端互传.
三、 主要研究内容
开发上位机,选择Qt,实现效果如图3-1所示:
图3-1
关于TCP通信
该方案使用TCP通信,TCP协议全称: 传输控制协议, 顾名思义, 就是要对数据的传输进行一定的控制.TCPThe beginning of communication can be briefly described as a three-way handshake,其过程如下:
1, TCP服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了 LISTEN(监听)状态
2, TCPThe client process sends a connection request message to the server,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态.
3, TCP服务器收到请求报文后, 如果同意连接, 则发出确认报文.
4, TCP客户端进程收到确认后还, 要向服务器给出确认.
5, 此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态.当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了.
TCPDisconnection can be summed up as four hand waves:
1, 客户端进程发出连接释放报文,并且停止发送数据.此时客户端进入FIN-WAIT-1(终止等待1)状态.
2, 服务器收到连接释放报文,发出确认报文,此时服务端就进入了CLOSE-WAIT(关闭等待)状态.
3, 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据)
4, 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认.
5, 客户端收到服务器的连接释放报文后,必须发出确认,当客户端撤销相应的TCB后,才进入CLOSED状态.
6, 服务器只要收到了客户端发出的确认,立即进入CLOSED状态.Both parties end the communication.
使用TCP通信将ROS作为服务端,Windows作为服务端,主要代码如下:
import socket
import threading
HOST = '192.168.31.22' # 默认本地IP
PORT = 9877
class RecvThread(threading.Thread):
def __init__(self, connection):
threading.Thread.__init__(self)
self.isEnd = 0
self.connection = connection
def run(self):
while True:
recv_msg = self.connection.recv(1024)
if recv_msg:
buf = recv_msg.decode("gbk")
print('[---Recv---]\n' + buf + '\n[---End---]')
else:
break
self.isEnd = 1
print('\n Disconnection!!!')
def main():
global HOST
global PORT
HOST = socket.gethostbyname(socket.gethostname())
print('Welcome to Jianghan University`Qingzhou robot server side!')
print('Please enter localIP, Carriage return vacancies default to :' + str(HOST))
ip = input('in:')
if ip:
HOST = str(ip)
print('请输入端口号,Carriage return vacancies default to :'+ str(PORT))
port = input('in:')
if port:
PORT = int(port)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
print('本地:' + str(sock.getsockname()))
sock.listen(5)
while True:
connection, address = sock.accept()
print('Connection success!')
print('对方:' + str(connection.getpeername()))
connection.send(b'welcome to server!')
connection.send("I am a canoe robot".encode("gbk"))
t = RecvThread(connection)
t.start()
while t.isEnd == 0:
buff = input()
connection.send(buff.encode("gbk"))
connection.close()
sock.close()
if __name__ == '__main__':
main()
实现效果图3-2如下:
图3-2
So far, all technical indicators have been completed.
四、 技术创新点
在Windows上连接ROSBaby turtles and control,Qt效果图如图4-1所示:
图4-1
The communication mode of the whole system is shown in the figure4-2所示:
图4-2
主要代码如下:
from posixpath import split
import rospy
from geometry_msgs.msg import Twist # 发布的消息类型
import socket
HOST = '192.168.31.22' # 默认本地IP
PORT = 9866
if __name__ == "__main__":
rospy.init_node("key_py")
pub = rospy.Publisher("/tcp_cmd", Twist, queue_size=1000)
rospy.Duration(3)
HOST = socket.gethostbyname(socket.gethostname())
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
rospy.loginfo('本地:' + str(sock.getsockname()))
sock.listen(5)
# 发布数据
while not rospy.is_shutdown():
connection, address = sock.accept()
rospy.loginfo('Connection success!')
rospy.loginfo('对方:' + str(connection.getpeername()))
while True:
recv_msg = connection.recv(1024)
if recv_msg:
# rospy.loginfo(recv_msg.decode('gbk'))
buff = recv_msg.decode('gbk')
data = buff.split(',',5)
data = list(map(float, data))
rospy.loginfo(data)
# 创建数据
msg = Twist()
msg.linear.x = data[0]
msg.linear.y = data[1]
msg.linear.z = data[2]
msg.angular.x = data[3]
msg.angular.y = data[4]
msg.angular.z = data[5]
pub.publish(msg)
else:
rospy.loginfo('\n Disconnection!!!')
connection.close()
break
实现效果如下图4-3、4-4所示:
图4-3
图4-4
五、 研究展望
自定义ROSRobot host computer skip reading control,Control the movement of the Ackerman trolley;
将上位机UI界面优化
边栏推荐
猜你喜欢
Unity shader test execution time
使用.NET简单实现一个Redis的高性能克隆版(七-完结)
[UE] 入坑
【中央任务调度系统—通信开发】
【Prometheus】Alertmanager告警全方位讲解
How to determine the neural network parameters, the number of neural network parameters calculation
你觉得程序员是一个需要天赋的职业吗?
Primavera Unifier 自定义报表制作及打印分享
零基础创作专业wordpress网站12-设置标签栏图标(favicon)
Oracle database use problems
随机推荐
卷积神经网络梯度消失,神经网络中梯度的概念
Six functions of enterprise exhibition hall production
unity shader 测试执行时间
自定义卷积核的分组转置卷积如何实现?
How to determine the neural network parameters, the number of neural network parameters calculation
What is the difference between the qspi interface and the ordinary four-wire SPI interface?
canvas图像阴影处理
使用.NET简单实现一个Redis的高性能克隆版(七-完结)
爬虫封装成api
database transaction
How to use QTableWidget
HStreamDB v0.9 发布:分区模型扩展,支持与外部系统集成
mindspore 执行模型转换为310的mindir文件显示无LRN算子
MySQL约束
Adobe LiveCycle Designer report designer
idea插件自动填充setter
Three handshakes and four waves
【应用SLAM技术建立二维栅格化地图】
unity初级面试分享
力扣打卡----打家劫舍