侧边栏壁纸
  • 累计撰写 131 篇文章
  • 累计创建 16 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录
ROS   

Linux 下使用 CAN 总线与 ROS_CANopen

SocketCAN

SocketCAN 是 Linux 内核提供的一套 CAN 接口的实现,它允许开发者通过标准的 Socket 编程接口来访问CAN总线。因为 SocketCAN 概念使用网络设备模型,允许多个应用程序同时访问一个CAN设备。此外,单个应用程序能够并行访问多个CAN网络。

总结主要作用如下:

  • 提供CAN接口:SocketCAN为Linux系统提供了一组CAN接口,可以直接与CAN总线进行通信。这些接口允许应用程序通过发送和接收CAN帧来进行数据交换,以实现与CAN总线上其他节点的通信。
  • 简化CAN编程:通过使用SocketCAN,开发者可以使用熟悉的Socket编程接口来进行CAN通信。这使得CAN应用程序的开发更加简便和灵活。开发者可以使用常见的Socket函数(如socket()、bind()、sendto()、recvfrom())来创建CAN套接字、绑定到特定的CAN接口,发送和接收CAN帧数据。
  • 支持多种CAN硬件:SocketCAN提供了对多种CAN硬件的支持,包括CAN控制器和适配器。它可以与各种CAN芯片和模块配合使用,使得开发者可以在不同的硬件平台上使用统一的编程接口进行CAN通信。
  • 集成到Linux内核:SocketCAN是Linux内核的一部分,它已经被集成到主流的Linux发行版中。这意味着开发者无需安装额外的驱动程序或软件包,可以直接在支持SocketCAN的Linux系统上进行CAN开发。

SocketCAN驱动使用

SocketCAN 驱动首先通过初始化Socket(与TCP/IP通信非常相似)来设置对CAN接口的访问,然后将该Socket绑定到接口。绑定后,套接字可以像 UDP 套接字一样通过readwrite等方式使用。

打开SocketCAN接口

  • 查看 CAN ID ifconfig –a
  • 先关闭 CAN, 防止之前未关闭而导致错误。
    sudo ifconfig can0 down
    
  • 设置 CAN 波特率
    sudo ip link set can0 type can bitrate 1000000
    
  • 使能 CAN0
      sudo ifconfig can0 up
    

SocketCAN接口回环测试

  • 安装 can-utils,来实现发送数据:
    sudo apt-get install can-utils
  • 可以使用环回模式来测试 CAN 口是否正常工作。先启用环回模式。
    sudo ip link set can0 down
    sudo ip link set can0 type can loopback on
    sudo ip link set can0 type can bitrate 1000000
    sudo ifconfig can0 up
    
  • 打开接收终端,并输入 candump can0
  • 打开发送终端,并输入 cansend can0 001#1122334455667788
  • 如果成功,在接收终端将输出:
    can0  001   [8]  11 22 33 44 55 66 77 88
    can0  001   [8]  11 22 33 44 55 66 77 88
    
  • 关闭环回模式
    sudo ip link set can0 down
    sudo ip link set can0 type can loopback off
    sudo ip link set can0 type can bitrate 1000000
    sudo ifconfig can0 up
    

硬件支持

以下是一些常见的CAN接口适配器,可用于连接Linux电脑与CAN总线:

  • USB-CAN适配器:这些适配器通过USB接口与计算机连接,并提供CAN总线接口。它们通常是基于USB-CAN芯片的,可以通过USB驱动程序与Linux系统进行通信。
    • 优点:易于使用和连接,可移动性强,成本较低。
    • 缺点:通信速率受限于USB接口的带宽,连接稳定性弱。
    • 例如:CANable
  • PCI/PCIe-CAN适配器:这些适配器是通过PCI或PCI Express插槽与计算机连接的CAN接口卡。它们提供了高性能的CAN总线连接,并可以与Linux系统进行集成。
    • 优点:提供高性能的CAN总线连接,适合需要更高通信速率和稳定性的应用
    • 缺点:不方便移动或外部设备使用,价格较高
    • 例如:PCAN-PCI Express
  • Ethernet-CAN适配器:这些适配器使用以太网接口连接到计算机,并通过以太网通信与CAN总线连接。它们可以通过TCP/IP协议与Linux系统进行通信。
    • 优点:支持远程访问和控制,适用于远程监控和控制应用,实现分布式和远程连接。
    • 缺点:通信延迟可能较大,不适用于实时性要求高的应用。
    • 例如:Kvaser Ethercan HS
  • Raspberry Pi CAN适配器:适用于树莓派开发板的CAN适配器,可以将树莓派与CAN总线连接起来。它们通常是基于SPI或GPIO接口的CAN芯片,可以通过Linux的CAN驱动程序进行通信。
    • 优点:与树莓派开发板直接集成,具有良好的兼容性,适用于嵌入式系统和物联网应用。
    • 缺点:受限于树莓派的硬件资源和处理能力,不适用于高速和高负载的CAN通信
    • 例如:2 Channel CAN BUS FD Shield for Raspberry Pi

ROS_CANopen

ros_canopen 包是一个用于在ROS中与CANopen协议兼容的设备进行通信的软件包。它提供了一组功能工具,用于实现CANopen设备的配置、控制和监视

在ROS中,以下是与CAN和CANopen相关的常见软件包及其功能:

  • can_msgs:这个软件包定义了ROS消息类型,用于在ROS系统中传输CAN消息。它提供了表示CAN帧的消息类型,包括帧ID、数据和其他CAN消息的属性。
  • socketcan_interface:这个软件包提供了ROS对SocketCAN接口的封装,允许ROS节点直接与SocketCAN接口进行通信。它提供了ROS节点操作CAN总线的接口函数和工具函数。
  • socketcan_bridge:这个软件包实现了ROS和SocketCAN之间的桥接,允许ROS系统与通过SocketCAN接口连接的CAN总线进行通信。它提供了将CAN消息转换为ROS消息的功能,以及将ROS消息转发到CAN总线的功能
  • canopen_master:这个软件包实现了一个CANopen主站节点,用于管理整个CANopen网络。它提供了与CANopen从站节点进行通信、配置和监控的接口,并支持各种CANopen协议功能。
  • canopen_chain_node:这个软件包提供了用于管理CANopen网络中节点的功能。它可以自动扫描和识别CANopen设备,并提供了与这些设备进行通信和配置的接口。
  • canopen_motor_node:这个软件包实现了一个ROS节点,用于控制CANopen电机节点。它提供了电机控制的接口,包括速度控制、位置控制等,并与其他ROS节点进行通信
  • canopen_402:这个软件包提供了用于控制CANopen 402设备(例如电机、驱动器)的功能。它实现了CANopen协议的402规范,包括控制和监视电机状态、设定电机参数等。

Can_msgs

ROS内置消息类型can_msgs/Frame:

Header header
uint32 id		# 填写CAN帧的标识符(ID),可以是11位(标准帧)或29位(扩展帧)。
bool is_rtr		# 表示CAN帧是否为远程帧(Remote Frame)
bool is_extended	# 表示CAN帧是否为扩展帧
bool is_error		# 表示CAN帧是否为错误帧
uint8 dlc		# 填写数据长度代码(DLC),取值范围为0到8
uint8[8] data		# 填写一个长度为8的整数数组

例如,在C++代码中填写:

can_msgs::Frame can_frame; 

can_frame.id = 0x601;	 
can_frame.is_extended = true;	
can_frame.is_rtr = false;
can_frame.is_error = false;		
can_frame.dlc = 2; 	

can_frame.data[0] = 0x2b;
can_frame.data[1] = 0x00;

xxxx.publish(can_frame);

Socketcan_interface

用于在ROS系统中与SocketCAN接口进行通信的基础包。它提供了ROS节点和功能,以便读取和写入CAN帧,与CAN总线进行通信。

它依赖于 can_msgs 包,因为它使用can_msgs/Frame消息类型来表示CAN帧数据。

Socketcan_bridge

这是最为常用的包,将SocketCAN接口ROS话题进行桥接的功能包。

它依赖于 can_msgssocketcan_interface 包,因为它使用 can_msgs/Frame 消息类型来传输CAN帧数据,并使用 socketcan_interface 来与 SocketCAN 接口进行通信。

提供了三个节点:socketcan_bridge_nodesocketcan_to_topic_nodetopic_to_socketcan_node。来接收来自同一CAN设备的帧和发送到同一CAN设备的帧。

参考:socketcan_bridge

canopen_master

用于实现CANopen协议的主站(Master)功能。它提供了与CANopen设备进行通信、配置和控制的能力。

在CANopen网络中,主站(Master)负责管理和控制多个从站(Slave)设备。主站负责与从站进行通信,发送指令并接收从站的反馈数据,实现对从站设备的配置、控制和监视。

提供了以下主要功能:

  • CANopen通信:发送CANopen的SDO(Service Data Object)和PDO(Process Data Object)消息,以实现设备的配置和数据交换。
  • 设备配置和管理:扫描CANopen网络,检测并识别连接的从站设备,配置主站节点,可以设置从站的参数、配置设备对象字典、分配节点ID等。
  • 状态监控和诊断:监视CANopen网络中的设备状态和诊断信息。
  • ROS集成:使用ROS消息来表示CANopen设备的数据和状态信息,并提供ROS服务和话题,方便在ROS系统中与CANopen设备进行交互和控制。

假设我们有一个CAN网络,其中包含一个主站(Master)和两个从站(Slave)设备,从站设备是电机驱动器。主站需要配置从站的运行模式、读取电机的状态和数据,并发送控制指令来控制电机的速度。

  • 首先,主站需要扫描网络并识别从站设备。它可以通过发送特定的CAN消息(如SDO请求)来获取从站设备的制造商信息、设备ID等。
  • 识别了从站设备,主站可以使用对象字典来配置和读取从站的参数。例如,主站可以通过向从站发送SDO消息来设置电机的运行模式,将控制字(Control Word)写入对象字典中的相应索引。主站可以设置运行模式为速度控制模式位置控制模式等。
  • 主站可以周期性地读取从站设备的状态和数据。它可以通过发送SDO读取请求消息来获取从站对象字典中的状态字(Status Word)和电机的当前速度位置等参数。
  • 最后,主站可以发送控制指令来控制电机的速度。它可以将期望的速度值写入对象字典中的相应索引,然后通过发送SDO消息将控制指令发送给从站设备。

一个简单的python例子:

from canopen_master import Master

# 创建Master对象
master = Master()

# 连接到CAN总线
if not master.connect("can0", bitrate=1000000):
	rospy.logerr("Failed to connect to CAN bus")
	exit()

# 扫描网络并识别从站设备
master.scan_network()

# 获取设备列表
devices = master.get_device_list()

# 打印识别到的设备信息
for device in devices:
	rospy.loginfo("Device ID: %d, Vendor ID: %d, Product ID: %d" % (device.node_id, device.vendor_id, device.product_id))

# 断开与CAN总线的连接
master.disconnect()

canopen_chain_node

用于在CANopen网络中管理多个从站设备。它充当一个中间件,负责与从站设备进行通信并提供ROS接口,使用户可以方便地与CANopen设备进行交互。

举个例子来说明使用canopen_chain_node的过程:

  • 假设我们有一个CANopen网络,其中包含两个电机驱动器作为从站设备
  • 配置从站设备:在ROS参数服务器中配置两个从站设备的信息,包括设备ID、通信参数等。假设第一个从站设备的ID为1,第二个从站设备的ID为2。
  • 启动canopen_chain_node:使用ROS启动文件或命令行启动canopen_chain_node节点,节点会自动扫描并与两个从站设备建立连接
  • 使用ROS接口与从站设备交互:可以使用ROS接口与从站设备进行交互。例如,通过发布一个速度指令的ROS消息到/motor_1/cmd_vel话题,可以控制第一个电机驱动器的速度。通过订阅/motor_1/state话题,可以获取第一个电机驱动器的状态信息,如位置、速度等。

canopen_motor_node

用于控制CANopen网络中的电机驱动器设备。它提供了一个高级接口,简化了与电机驱动器的通信和控制过程

可以方便地配置和控制电机驱动器,包括设置速度、位置、加速度等参数,发送运动指令以及监控电机状态等。

canopen_402

提供了与CANopen协议兼容的驱动器设备进行通信和控制的功能。它专门用于与符合CiA 402标准的驱动器进行交互。

使用canopen_402,您可以方便地配置和控制符合CiA 402标准的电机驱动器,包括设置驱动器的模式、速度、位置、加速度等参数,发送运动指令以及获取驱动器的状态信息。

Reference:

  1. SocketCAN
  2. ros_canopen
  3. ROS采用SocketCAN进行通信
  4. Linux 中的 CAN 总线
0

评论区