当前位置:网站首页>【中央任务调度系统—通信开发】
【中央任务调度系统—通信开发】
2022-08-11 09:55: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协议全称: 传输控制协议, 顾名思义, 就是要对数据的传输进行一定的控制。TCP通信的开始过程可以简述为三次握手,其过程如下:
1, TCP服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了 LISTEN(监听)状态
2, TCP客户端进程向服务器发出连接请求报文,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。
3, TCP服务器收到请求报文后, 如果同意连接, 则发出确认报文。
4, TCP客户端进程收到确认后还, 要向服务器给出确认。
5, 此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
TCP断开连接可以概述为四次挥手:
1, 客户端进程发出连接释放报文,并且停止发送数据。此时客户端进入FIN-WAIT-1(终止等待1)状态。
2, 服务器收到连接释放报文,发出确认报文,此时服务端就进入了CLOSE-WAIT(关闭等待)状态。
3, 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据)
4, 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5, 客户端收到服务器的连接释放报文后,必须发出确认,当客户端撤销相应的TCB后,才进入CLOSED状态。
6, 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。双方就结束通信。
使用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('欢迎使用江汉大学`轻舟机器人服务器端!')
print('请输入本地IP, 回车空缺默认为:' + str(HOST))
ip = input('in:')
if ip:
HOST = str(ip)
print('请输入端口号,回车空缺默认为:'+ 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("我是轻舟机器人".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
至此已完成所有技术指标。
四、 技术创新点
在Windows上连接ROS小海龟并控制,Qt效果图如图4-1所示:
图4-1
整个系统通信方式如图4-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
五、 研究展望
自定义ROS机器人上位机跳读控制,控制阿克曼小车运动;
将上位机UI界面优化
边栏推荐
- 谁能解答?从mysql的binlog读取数据到kafka,但是数据类型有Insert,updata,
- Network Models (DeepLab, DeepLabv3)
- Unity shader test execution time
- HDRP shader gets pixel depth value and normal information
- MongoDB 非关系型数据库
- Halcon算子解释
- 5分钟快速为OpenHarmony提交PR(Web)
- Deploying Robot Vision Models Using Raspberry Pi and OAK Camera
- Array, string, date notes [Blue Bridge Cup]
- MongoDB 对索引的创建查询修改删除 附代码
猜你喜欢
随机推荐
Network model (U - net, U - net++, U - net++ +)
Deploying Robot Vision Models Using Raspberry Pi and OAK Camera
MySQL约束
PowerMock for Systematic Explanation of Unit Testing
神经痛分类图片大全,神经病理性疼痛分类
SQL statement
关于ts中的指针问题call,bind, apply
What is the difference between the qspi interface and the ordinary four-wire SPI interface?
网络流行简笔画图片大全,关于网络的简笔画图片
5分钟快速为OpenHarmony提交PR(Web)
使用stream实现两个list集合的合并(对象属性的合并)
力扣打卡----打家劫舍
同态加密简介HE
神经网络需要的数学知识,神经网络的数学基础
Adobe LiveCycle Designer 报表设计器
【无标题】(完美解决)uni-app 小程序下拉刷新后刷新图标无法正常恢复的问题
Typescript基本类型---上篇
HDRP shader 获取阴影(Custom Pass)
分割学习(loss and Evaluation)
2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号









