赞
踩
这个系列是记录我个人在学习过程中,遇到的一些问题,并记录了我成功的解决办法。
网站上,对于域控制器的使用介绍相对较少,这是基于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

sudo apt install ros-<your_ros_version>-can-msgs
这里我的版本时noetic
sudo apt-get install ros-noetic-can-msgs
- 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报文讲在回调函数中体现,这里只是一个接口。
- 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)
'运行
这是回调函数具体内容,分三步走
我们这里使用了域控上的can0,并且定义其类型为socketcan
Message函数的具体形参含义:
使用bus.send函数发送我们的can报文(can_data)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。