python无人驾驶_无人驾驶技术——ROS进阶之python实现串口通信

文章目录

环境

Ubuntu16.04

ROS Kinetic

PC与开发板1串口通信示例

#usr/bin/python3

# -*- coding: utf-8 -*-

import rospy

from std_msgs.msg import String

import serial

import time

def gbk_2_number(strsrc):

result = []

for i in range(0,len(strsrc),2):

tmp = strsrc[i:i+2]

result.append(tmp)

#print(tmp, result)

tmp1 = ''

for i in range(len(result)):

if result[i]== '2e':

tmp1 += '.'

else:

tmp1 += str(int(result[i]) - 30)

#print('tmp: ',tmp1)

return tmp1

pub = rospy.Publisher('test_talker', String, queue_size = 10)

rospy.init_node('talker', anonymous=True)

rate = rospy.Rate(10)

ser = serial.Serial('/dev/ttyUSB0', 57600, timeout=0.5)

# 选择串口,并设置波特率

while not rospy.is_shutdown():

if ser.is_open:

print("port open success")

# hex(16进制)转换为bytes(2进制),应注意Python3.7与Python2.7此处转换的不同

send_data = bytes.fromhex('65 0d 05 00 FF FF FF FF') # 发送数据转换为b'\xff\x01\x00U\x00\x00V'

ser.write(send_data) # 发送命令

time.sleep(0.1) # 延时,否则len_return_data将返回0,此处易忽视!!!

len_return_data = ser.inWaiting()

if len_return_data:

#print("enter receive data: ")

return_data = ser.read(len_return_data) # 读取缓冲数据

print('16hex rx: ',return_data.hex())

rospy.loginfo(hello_str)

pub.publish(hello_str)

# bytes(2进制)转换为hex(16进制),应注意Python3.7与Python2.7此处转换的不同,并转为字符串后截取所需数据字段,再转为10进制

str_return_data = str(return_data.hex())

#十六进制字符转换为汉字(str_return_data)

rece_Chinese = bytes.fromhex(str_return_data).decode('gbk')

print('rx: ', rece_Chinese)

start_l = str_return_data.find('22')

end_r = str_return_data.rfind('22')

number_x = str_return_data[start_l+2:end_r]

number_result = gbk_2_number(number_x)

print('number_result: ',number_result)

feedback_data = int(str_return_data[-6:-2], 16)

#print(feedback_data)

else:

print("port open failed")

PC与开发板2串口通信示例

#!/usr/bin/env python

#coding=utf-8

import rospy

import serial

from geometry_msgs.msg import Twist

import time

def main():

ser = serial.Serial('/dev/ttyUSB1', 256000, timeout=0.5)

rospy.loginfo("Received a OBD message!")

if ser.is_open:

while(True):

print("port open success")

send_data = 'AT+DS049,DS041,DS048,DS098,DS123'

ser.write(send_data) # 发送命令

time.sleep(0.1) # 延时,否则len_return_data将返回0,此处易忽视!!!

len_return_data = ser.inWaiting()

if len_return_data:

#print("enter receive data: ")

readline = ser.readline()

print('len readline: ',len(readline))

print(readline)

if len(readline) == 11:

send_data = 'AT+ISO15765-4STD_500K'

ser.write(send_data) # 发送命令

time.sleep(0.1) # 延时,否则len_return_data将返回0,此处易忽视!!

if len(readline)==55:

print(readline)

rospy.loginfo("readline:[%s]"%readline)

str_return_data = str(readline.encode('hex')) #str(return_data.encode('hex'))

#print('rx: ',str_return_data)

feedback_data = int(str_return_data[-6:-2], 16)

#print(feedback_data)

else:

print("no data received!")

time.sleep(3)

else:

print("port open failed")

if __name__=="__main__":

main()

测试USB接口

1、连接设备并检查串口连接状态

dmesg | grep ttyUSB*

2、通过cutecom串口助手检查串口设备是否能进行通讯,若因权限问题无法连接,运行以下命令给与用户权限

sudo chmod 666 /dev/ttyUSB*

编译运行

chmod u+x ROS_Serial.py //将python文件改为执行文件

回到ROS的根工作目录

catkin_make //编译

roscore //这个开启一次即可

另起一个终端:

source devel/setup.dash //配置工作空间,用于刷新环境,必不可少,将当前的工作空间配置了

rosrun test ROS_Serial.py

接收到的结果显示:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9fbHhs,size_16,color_FFFFFF,t_70

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
串口通信ROS中是非常常见和重要的功能。下面是一些关于ROS串口通信进阶知识: 1. 安装serial包:首先,你需要安装ROS的serial包。在终端中运行以下命令来安装:`sudo apt-get install ros-<your_ros_version>-serial` 2. 创建ROS节点:使用ROS中的串口通信,你需要创建一个ROS节点来处理串口数据。你可以使用C++或者Python编写节点。 3. 打开串口:在ROS节点中,你需要打开串口并进行配置。你可以使用serial包提供的函数来打开和配置串口。例如,在C++中,你可以使用`serial::Serial::open()`函数来打开串口,并使用`serial::Serial::setBaudrate()`函数来设置波特率。 4. 发送和接收数据:一旦打开了串口,你就可以通过串口发送和接收数据了。你可以使用serial包提供的函数来发送和接收字节流。例如,在C++中,你可以使用`serial::Serial::write()`函数来发送数据,并使用`serial::Serial::read()`函数来接收数据。 5. ROS消息和串口数据转换:通常,你可能还需要将串口数据转换为ROS消息,以便在ROS系统中进行处理。你可以根据你的需求创建自定义的ROS消息类型,并编写转换代码将串口数据转换为ROS消息。例如,在Python中,你可以使用`rospy.Publisher`来发布ROS消息。 6. ROS参数配置:为了方便地配置串口参数,你可以使用ROS参数服务器。你可以使用`rosparam`命令或者在launch文件中设置参数。这样,你就可以在运行节点时动态地配置串口参数。 这些是ROS串口通信的一些进阶知识。希望对你有帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值