Ros_canopen是ros支持can通信的package
链接:
http://wiki.ros.org/ros_canopen?distro=indigo
Ros_canopen包结构如下
SocketCAN是一组开源的CAN驱动程序和网络堆栈,由Volkswagen Research提供给Linux内核。以前称为低级别CAN框架(LLCF)
就是一个数据类型
CiA402是基于CANOPEN的电机控制驱动代码和通信层的接口。这个程序包包含了CiA 402 DSP协议的实现。它只是通过对象进行通信(canopen_master,不需要直接的CAN通信)。
该包支持所有标准的驱动模式,以下是通过状态机控制的不同的控制模式
通过状态机的切换,可以调节不同的控制模式。
以上说的其实是通过can对于机械臂的控制的模式的选择,以上模式并不一定适用于所有的机械臂控制器或者马达。
我的理解是canopen_402就是一个模式管理的状态机包,用来配置can的工作模式。
该package包含与socketcan_interface的接口,与canopen_master的接口。可以认为是一个独立的节点。该包的功能是管理一个具有单个或者多个节点的can bus总线。
配置可以分为不同的部分。首先设置总线,所有节点共享这些设置。然后必须配置它们的CANopen和ROS接口。所有参数都必须加载到节点的私有名称空间中。
CANopen Bus layer 总线设置包含can接口(socketcan_interface)以及共享总线的设置(canopen_master)
Node layer所有的节点都会在list在节点参数表中
我理解的是,此节点会对can做基础的配置工作。
该包是CANopen DS 301 协议的master实现,它提供相关的库与canopen设备进行连接,并且通过高优先级访问其他设备的数据对象。
该功能实现可以支持大部分的canopen的接口与服务。
SDO,client/server 接口读写
PDO,publisher/subscriber 接口读写
我理解的这部分就是直接对接can总线设备的模块。
该包为canopen 402提供ros_controller接口。它基于canopen_chain_node并集成了它的所有接口。
该节点包含一个controller_manager实例,可用于派生与controller_interface兼容的控制器。根据电机设备不同,支持不同的接口。
每个节点的驱动的位置、速度、力会被记录在hardware_interface::JointStateHandle 数据类型内,实际的值由转换函数决定。
Joint limits是从URDF文件或者其他途径读取,然后通过joint_limits_interface控制完成
https://github.com/ros-controls/ros_control/wiki/joint_limits_interface.
为了让canopen_motor_node工作,每个节点都有一个联合参数,该参数默认为CANopen节点名,并在ros_control接口中用作联合名
这个模块的包提供从socketcan到ros tospic的发布can 帧信息的功能。内部使用ros_canopen的socketcan_interface,可以支持处理基本帧与扩展帧两种形式。
功能的实现靠socketcan bridge node, socketcan to topic node 和topic to socketcan node三个节点实现。
socketcan bridge node 从SocketCAN 设备接收frames并将之publishes到topic上,同时监听can的信息并将之送给SocketCAN;发送与接收的信息格式在can_msgs文件夹。
socketcan_to_topic_node也是从SocketCAN 设备接收frames并将之publishes到topic上,但是没有监听功能。
topic_to_socketcan_node 接收topic信息发送给SocketCAN设备。
该包提供一个通用的can接口类型,并提供一个基于SocketCAN的驱动应用的实现。
StateInterface: Listener interface for the state of the driver,监测驱动的状态
CommInterface: Listener interface for receiving messages and send functionality,检测收发功能
DriverInterface: inherits from both and adds management interfaces,继承并添加管理接口
我理解,这个包是涉及硬件信息的,也就是该包是一个硬件接口。
注:ros canopen模块弄起来太费劲,所以最后我放弃了,可以尝试lbpcan驱动,不过libpcan的硬件比较贵,国外需要3000,国内仿造的也要700-800的样子,还有一种方式就是采用最常见的can模块,但是driver需要自己编写,与canopen有点相同,如果只是采用can的简单读写功能的话,我认为自己编写反而比用ros canopen更容易一些;