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)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以通过以下方式查看 ROS 中 CAN 总线的波特率: 1. 在终端中打开 rosmsg 命令行工具。 2. 输入以下命令: ``` rosmsg show can_msgs/Frame ``` 这将显示 ROS 中可用的 CAN 消息类型。 3. 找到 "header" 部分中的 "can_dlc" 字段。这是用于指定 CAN 数据长度的字节数。它通常会输出一个典型的值,例如 8。 4. 找到 "is_extended" 字段。这是一个布尔类型的值,指示帧是否为标准或扩展帧。如果为 true,则表示该帧为扩展帧。 5. 找到 "is_remote" 字段,该字段指示帧是否为远程帧。如果为 true,则表示该帧为远程帧。 6. 找到 "id" 字段。这是一个无符号整数值,表示 CAN 帧的标识符。在典型的 CAN 网络中,这个值通常用来表示消息的优先级和发送器的身份。 7. 打开 CAN 总线通信硬件的技术规格书。确认设备的最大通信速率。 8. 打开 ROS 中用于设置 CAN 总线波特率的配置文件 ros_canopen.yaml。该文件包含了用于描述 CAN 总线的不同速率的参数。 9. 使用编辑器打开此文件并查找参数 "can_bus_speed". 该参数可用于设置您的 CAN 网络的波特率。 10. 如果您的 ROS 系统正在使用的 CAN 总线速率与设备的通信速度不同,则必须通过运行适当的驱动程序或修改配置文件来进行更改。 注意:上述步骤中的演示可能因 ROS 版本、CAN 总线硬件和相应的驱动程序而有所不同。请参阅设备和驱动程序的说明以获得更详细的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值