ros+python,发送can报文到can总线上

前言

这个系列是记录我个人在学习过程中,遇到的一些问题,并记录了我成功的解决办法。

网站上,对于域控制器的使用介绍相对较少,这是基于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)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值