智能小车(八)ros实现将智能小车数据通过TCP/IP发送到上位机网关

这篇具有很好参考价值的文章主要介绍了智能小车(八)ros实现将智能小车数据通过TCP/IP发送到上位机网关。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ros实现将智能小车数据通过TCP/IP发送到上位机网关
这里主要注意:
将浮点型数据*1000转换成int型数据然后分字节储存(另取一个字节作为符号位)。没有用struct.pack进行字节流打包,原因是不同平台,字节流的打包浮点型数据不一样,又要加上包头等校验信息,所以这里分别用单字节保存在列表中,然后sock.sendall(struct.pack(“B”*len(list_send),list_send))
学到的点
1、
在 Python 中,
是一个解包运算符(unpacking operator)。它可以应用于可迭代对象,如列表、元组等,并将可迭代对象中的元素解包为单独的参数。

在给定的代码中,*list_send 使用解包运算符 * 将列表 list_send 中的元素作为单独的参数传递给 struct.pack 函数。这意味着 struct.pack 函数将接收列表中的每个元素作为单独的参数。如果列表 list_send 包含三个元素 [1, 2, 3],那么 *list_send 将被解包为 1, 2, 3。

这种解包操作是为了确保 struct.pack 函数能够接收正确数量的参数,并将它们打包为字节流发送到 socket 连接。
B是无符号8位
len(list_send)是链表长度(列表中元素个数)
2、
这里sock.connect((TCP_IP, TCP_PORT))会报错异常终止程序运行我们用try except就非常好

while not connect:
    try:
        sock.connect((TCP_IP, TCP_PORT))
        print("TCP/IP连接成功")
    except:
        time_connect+=1
        print("TCP/IP连接失败次数:%d" % time_connect)
        time.sleep(10)

3、def send_data(car_subscriber): 写子函数时这个形参随便写调用传入的是什么就是什么类型
4、转16位高低8位分别存储

    int16_num=int(abs(raw_data.twist.linear.y)*1000)&0xFFFF
    list_raw[4]=int16_num&0xFF 
    list_raw[5]=(int16_num>>8)&0xFF 

5、创建套接字 固定IP和端口否则端口会自动分配文章来源地址https://www.toymoban.com/news/detail-816222.html

local_ip='192.168.0.11'
local_port=8090
TCP_IP = '192.168.1.81'
TCP_PORT = 8090

# 创建TCP/IP客户端套接字 AF_INET是指 IPv4 地址族 参数是套接字(socket)类型,用于指定 socket 的传输协议是基于流(stream)的,也就是 TCP/IP
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((local_ip,local_port))
# 获取实际分配的IP地址和端口号
actual_ip, actual_port = sock.getsockname()
# 打印实际分配的IP地址和端口号
print("Successfully bound to {}:{}".format(actual_ip, actual_port))
#!/usr/bin/env python
# encoding: utf-8
import binascii
from sqlite3 import connect
from threading import local
import time
import rospy
from std_msgs.msg import Float32
from sensor_msgs.msg import Imu, BatteryState
import struct
import socket
from geometry_msgs.msg import Twist
from time import sleep
#当前车头方向
x_yaw=0
# 设置TCP/IP服务器地址和端口号
local_ip='192.168.0.11'
local_port=8090
TCP_IP = '192.168.1.81'
TCP_PORT = 8090
""" TCP_IP = '192.168.0.2'
TCP_PORT = 8888  """
# 创建TCP/IP客户端套接字 AF_INET是指 IPv4 地址族 参数是套接字(socket)类型,用于指定 socket 的传输协议是基于流(stream)的,也就是 TCP/IP
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((local_ip,local_port))
# 获取实际分配的IP地址和端口号
actual_ip, actual_port = sock.getsockname()
# 打印实际分配的IP地址和端口号
print("Successfully bound to {}:{}".format(actual_ip, actual_port))
connect = False
time_connect=0
while not connect:
    try:
        sock.connect((TCP_IP, TCP_PORT))
        print("TCP/IP连接成功")
        connect=True
    except:
        time_connect+=1
        print("TCP/IP连接失败次数:%d" % time_connect)
        time.sleep(10)

# 订阅小车速度、IMU角速度、电压和电量
class RosTcpIPPublisher:
    def __init__(self):
        
        self.twist =Twist()
        self.twist.linear.x=0.0
        self.twist.linear.y=0.0
        self.twist.linear.z=0.0
        self.twist.angular.x = 0.0
        self.twist.angular.y = 0.0
        self.twist.angular.z =0.0
        self.battery = 0.0
        rospy.Subscriber('/vel_raw', Twist, self.vel_callback)
       
        rospy.Subscriber('voltage', Float32, self.battery_callback)

    def vel_callback(self, msg):
        self.twist.linear.x = msg.linear.x
        self.twist.linear.y = msg.linear.y
        self.twist.linear.z = msg.linear.z
        self.twist.angular.x = msg.angular.x
        self.twist.angular.y = msg.angular.y
        self.twist.angular.z = msg.angular.z


    def battery_callback(self, msg):
        self.battery = msg.data

# 打包数据并发送到TCP/IP服务器
def send_data(car_subscriber):
    

    while not rospy.is_shutdown():
        list_data=trans_data(car_subscriber)
        list_send=clc_data(list_data)
        # 发送数据到TCP/IP服务器
        sock.sendall(struct.pack("B"*len(list_send),*list_send))
        sleep(1)
def trans_data(raw_data):
    list_raw=[0]*19
    if raw_data.twist.linear.x>0:
        list_raw[0]=1
    else:
        list_raw[0]=0
    if raw_data.twist.linear.y>0:
        list_raw[3]=1
    else:
        list_raw[3]=0
    if raw_data.twist.linear.z>0:
        list_raw[6]=1
    else:
        list_raw[6]=0
    if raw_data.twist.angular.x>0:
        list_raw[9]=1
    else:
        list_raw[9]=0
    if raw_data.twist.angular.y>0:
        list_raw[12]=1
    else:
        list_raw[12]=0
    if raw_data.twist.angular.z>0:
        list_raw[15]=1
    else:
        list_raw[15]=0
    
    int16_num=int(abs(raw_data.twist.linear.x)*1000)&0xFFFF
    list_raw[1]=int16_num&0xFF 
    list_raw[2]=(int16_num>>8)&0xFF 
    int16_num=int(abs(raw_data.twist.linear.y)*1000)&0xFFFF
    list_raw[4]=int16_num&0xFF 
    list_raw[5]=(int16_num>>8)&0xFF 
    int16_num=int(abs(raw_data.twist.linear.z)*1000)&0xFFFF
    list_raw[7]=int16_num&0xFF 
    list_raw[8]=(int16_num>>8)&0xFF 
    int16_num=int(abs(raw_data.twist.angular.x)*1000)&0xFFFF
    list_raw[10]=int16_num&0xFF 
    list_raw[11]=(int16_num>>8)&0xFF 
    int16_num=int(abs(raw_data.twist.angular.y)*1000)&0xFFFF
    list_raw[13]=int16_num&0xFF 
    list_raw[14]=(int16_num>>8)&0xFF 
    int16_num=int(abs(raw_data.twist.angular.z)*1000)&0xFFFF
    list_raw[16]=int16_num&0xFF 
    list_raw[17]=(int16_num>>8)&0xFF 
    list_raw[18]=int(raw_data.battery*10)&0xFF
    return list_raw
def clc_data(list_data):
    count=0     
    #i=0
    total_sum=0
    current=list_data
    list_send=[0]*0x26
    list_send[0]=0xCC
    list_send[1]=0xEE
    #总长
    list_send[2]=0x26
    list_send[3]=0x00
    #8Byte
    for i in range(8):
        list_send[i+4]=0x00
    #节点类型
    list_send[12]=0x88
    list_send[13]=0x13
    #指令
    list_send[14]=0x01
    #功能字
    #车辆编号
    list_send[15]=0x01
    count=len(list_data) 
    for i in range(count):
     list_send[i+16]=list_data[i]
    #数据长度
    len_L=20
    len_H=00
    list_send[35]=len_L
    list_send[36]=len_H
    for i in range(37):
        total_sum+=list_send[i]

    total_sum=total_sum%256
    list_send[37]=total_sum
    return list_send
if __name__ == '__main__':
    rospy.init_node('ros_tcpip_publish',anonymous=False)
    try:
        car_subscriber = RosTcpIPPublisher()
        sleep(2)
        send_data(car_subscriber)
        rospy.spin()
        sock.close()
    except Exception as e:
        rospy.loginfo("ROS_TCP/IP_ERROR!!!")
        print("发生异常",str(e))

到了这里,关于智能小车(八)ros实现将智能小车数据通过TCP/IP发送到上位机网关的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于ROS和YOLO的SLAM智能小车仿真系统设计

    基于ROS和YOLO的SLAM智能小车仿真系统设计

    Ubuntu 20.4 ros-noetic gazebo yolov4 nvidia525+cuda10.1+cudnn_7.6.5 将darknet文件夹移动到darknet_ros文件夹下 链接: https://download.csdn.net/download/qq_42281475/87502982. 将下载的yolo_network_config替换roscar_gazebo_yolov4/src/darknet_ros/darknet_ros/目录下的文件 链接: https://download.csdn.net/download/qq_42281475/87502991

    2024年02月10日
    浏览(7)
  • QT上位机开发(利用tcp/ip访问plc)

    QT上位机开发(利用tcp/ip访问plc)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制,但是复杂的plc,还可以控制电机、变频器,在工业生产中非常重要。一般plc的价格,也是根据有多少的io口来确定的

    2024年01月17日
    浏览(5)
  • 上位机软件wincc通过工业网关采集plc数据实现组态监控

    上位机软件wincc通过工业网关采集plc数据实现组态监控

    WinCC是一个组态软件,可以用于数据采集与监控、自动化控制、工业物联网等领域。WinCC可以帮助用户实现工厂自动化和过程自动化的解决方案,提供可视化的监控界面和数据采集分析功能,支持多种协议和设备,如Siemens、Modbus、OPC等。 如何使用WinCC采集PLC数据?工业网关可

    2024年02月15日
    浏览(16)
  • Internet通过TCP/IP协议可以实现多个网络的无缝连接

    Internet通过TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网协议)协议实现多个网络的无缝连接 。 TCP/IP是Internet的基础通信协议套件,它定义了数据如何在不同网络之间传输和路由,使得全球范围内的不同计算机和网络可以互相通信。TCP/IP协议套件包括多个

    2024年02月07日
    浏览(16)
  • 基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发

    基于QT做上位机开发,实现FPGA通过cyusb3014芯片完成数据的收发

    #任务要求: 要求用qt编写上位机程序,实现FPGA通过cyusb3014芯片完成数据的收发。下面是采用通过cypress并安装usb官方驱动的环境搭建,后续继续更新程序的编写。 一、安装nodejs ①下载地址:https://nodejs.org/en/ ①.1: 安装时,除了选择安装路径根据需要选择外,其他都可以默认

    2024年02月06日
    浏览(13)
  • 实现S7-200smart通过MODBUS TCP/IP与matlab通讯

    实现S7-200smart通过MODBUS TCP/IP与matlab通讯

    目录 S7-200smart通过MODBUS TCP/IP与matlab通讯 两台PLC之间建立Modbus TPC/IP通讯 MODBUS TCP Client梯形图各个参数的功能: MODBUS TCP Server梯形图各个参数的功能: 两台S7-200smart之间通过Modbus TCP连接: MATLAB端建立Modbus TCP客户端: 通过函数建立Modbus TCP客户端 通过Matlab-Industment Control工具箱进

    2024年02月03日
    浏览(64)
  • 【QT实现TCP数据发送和接收】

    单客户端服务器实现代码: 在.pro文件添加 在头文件中添加 在源文件中添加

    2024年02月11日
    浏览(10)
  • 【雕爷学编程】Arduino智能家居之通过Ethernet Shield与IFTTT Webhooks进行通信发送数据

    【雕爷学编程】Arduino智能家居之通过Ethernet Shield与IFTTT Webhooks进行通信发送数据

    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来

    2024年02月03日
    浏览(13)
  • ROS小车研究笔记3/11/2023:多点导航及其源码实现

    ROS小车研究笔记3/11/2023:多点导航及其源码实现

    多点导航操作 打开导航launch文件 roslaunch turn_on_wheeltec_robot navigation.launch rviz 在rviz里,选择publish point在地图上点击标记目标点。在标记多个目标点后小车会按标记顺序依次在各个目标点中往返 多点导航对于话题MarkerArray。需要在rviz中使markerArray订阅小车发布的path_point话题 多

    2024年02月03日
    浏览(54)
  • ubutu下ros2实现小车仿真建模与目标检测

    ubutu下ros2实现小车仿真建模与目标检测

    1.安装ros2 这里使用小鱼的一键安装,根据自己的喜好安装,博主用的是ros2的foxy版本 2.下载代码(这里使用的是古月居的代码) https://book.guyuehome.com/ 可以结合古月居的B站视频来自己一步一步操作,里面有讲解基础理论与一些环境的配置 https://www.bilibili.com/video/BV16B4y1Q7jQ?p=1

    2024年02月04日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包