当前位置:   article > 正文

ros+python,发送can报文到can总线上_python实现can报文发送到can tcp网关

python实现can报文发送到can tcp网关

前言

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

网站上,对于域控制器的使用介绍相对较少,这是基于arm64架构的Ubuntu系统,有些部分会略有区别,所以故此记录。

我使用的域控是Ubuntu20.04系统

总体代码

  1. #! /usr/bin/env python
  2. import rospy
  3. import can
  4. from can_msgs.msg import Frame
  5. def can_pubulisher_to_can(data):
  6. # create can bus
  7. bus = can.interface.Bus(channel='can0', bustype='socketcan')
  8. # ros msg to can msg
  9. can_data = can.Message(arbitration_id=0x123, data = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08])
  10. # can msg to bus
  11. bus.send(can_data)
  12. def can_publisher():
  13. rospy.init_node('can_publisher', anonymous=True)
  14. pub = rospy.Publisher('can_bus_test', Frame, queue_size=0)
  15. rate = rospy.Rate(1000)
  16. while not rospy.is_shutdown():
  17. can_frame = Frame()
  18. pub.publish(can_frame)
  19. rate.sleep()
  20. sub = rospy.Subscriber('can_bus_test', Frame, can_pubulisher_to_can)
  21. # rospy.spin()
  22. if __name__ == "__main__":
  23. try:
  24. # lian jie cheng gong
  25. rospy.logwarn("SEND SUCCESS")
  26. can_publisher()
  27. except rospy.ROSInternalException:
  28. pass
  29. pass

ps:初次使用时需要导入Frame类

sudo apt install ros-<your_ros_version>-can-msgs

这里我的版本时noetic

sudo apt-get install ros-noetic-can-msgs

代码解释

1.发布话题

  1. def can_publisher():
  2. rospy.init_node('can_publisher', anonymous=True)
  3. pub = rospy.Publisher('can_bus_test', Frame, queue_size=0)
  4. rate = rospy.Rate(1000)
  5. while not rospy.is_shutdown():
  6. can_frame = Frame()
  7. pub.publish(can_frame)
  8. rate.sleep()
  9. sub = rospy.Subscriber('can_bus_test', Frame, can_pubulisher_to_can)
  10. # rospy.spin()
'
运行

这是总体的发布函数,主要目的是创建节点,定义话题名称,方便我们后续利用回调函数讲话题订阅到can总线上。

话题内容是空的,can报文讲在回调函数中体现,这里只是一个接口。

ps:此处订阅时不加入spin(),是因为其作用本身是死循环而不让程序结束,从而时单独的订阅节点可以一直处于接受消息的状态。此处订阅本身处于not rospy.is_shutdown状态,故不需要。

2. 订阅话题到can总线上

  1. def can_pubulisher_to_can(data):
  2. # create can bus
  3. bus = can.interface.Bus(channel='can0', bustype='socketcan')
  4. # ros msg to can msg
  5. can_data = can.Message(arbitration_id=0x123, data = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08])
  6. # can msg to bus
  7. 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)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/1015392
推荐阅读
相关标签
  

闽ICP备14008679号