前言
这个系列是记录我个人在学习过程中,遇到的一些问题,并记录了我成功的解决办法。
网站上,对于域控制器的使用介绍相对较少,这是基于arm64架构的Ubuntu系统,有些部分会略有区别,所以故此记录。
我使用的域控是Ubuntu20.04系统
总体代码
#! /usr/bin/env python
import rospy
import can
from can_msgs.msg import Frame
def can_pubulisher_to_can(data):
# create can bus
bus = can.interface.Bus(channel='can0', bustype='socketcan')
# ros msg to can msg
can_data = can.Message(arbitration_id=0x123, data = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08])
# can msg to bus
bus.send(can_data)
def can_publisher():
rospy.init_node('can_publisher', anonymous=True)
pub = rospy.Publisher('can_bus_test', Frame, queue_size=0)
rate = rospy.Rate(1000)
while not rospy.is_shutdown():
can_frame = Frame()
pub.publish(can_frame)
rate.sleep()
sub = rospy.Subscriber('can_bus_test', Frame, can_pubulisher_to_can)
# rospy.spin()
if __name__ == "__main__":
try:
# lian jie cheng gong
rospy.logwarn("SEND SUCCESS")
can_publisher()
except rospy.ROSInternalException:
pass
pass
ps:初次使用时需要导入Frame类
sudo apt install ros-<your_ros_version>-can-msgs
这里我的版本时noetic
sudo apt-get install ros-noetic-can-msgs
代码解释
1.发布话题
def can_publisher():
rospy.init_node('can_publisher', anonymous=True)
pub = rospy.Publisher('can_bus_test', Frame, queue_size=0)
rate = rospy.Rate(1000)
while not rospy.is_shutdown():
can_frame = Frame()
pub.publish(can_frame)
rate.sleep()
sub = rospy.Subscriber('can_bus_test', Frame, can_pubulisher_to_can)
# rospy.spin()
这是总体的发布函数,主要目的是创建节点,定义话题名称,方便我们后续利用回调函数讲话题订阅到can总线上。
话题内容是空的,can报文讲在回调函数中体现,这里只是一个接口。
ps:此处订阅时不加入spin(),是因为其作用本身是死循环而不让程序结束,从而时单独的订阅节点可以一直处于接受消息的状态。此处订阅本身处于not rospy.is_shutdown状态,故不需要。
2. 订阅话题到can总线上
def can_pubulisher_to_can(data):
# create can bus
bus = can.interface.Bus(channel='can0', bustype='socketcan')
# ros msg to can msg
can_data = can.Message(arbitration_id=0x123, data = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08])
# can msg to bus
bus.send(can_data)
这是回调函数具体内容,分三步走
2.1 创建一个can总线
我们这里使用了域控上的can0,并且定义其类型为socketcan
2.2 传入我们的can报文使用Message函数传入
Message函数的具体形参含义:
2.3 将can报文发送到can总线上(can bus)
使用bus.send函数发送我们的can报文(can_data)