ROS CAN总线设备接入(二)can总线数据提取和以ros topic形式发布

本文档介绍了如何在ROS环境中,基于libpcan库实现CAN总线的初始化,从CAN总线上提取有效数据,并将这些数据以ROS topic的形式发布。首先,文章详细说明了如何对libpcan库的函数进行映射,接着展示了如何设置波特率和工作模式。然后,重点讲解了read_loop()函数,该函数用于持续读取CAN数据并发布到ROS topic,适用于需要不断接收CAN消息的场景。
摘要由CSDN通过智能技术生成

【简介】基于前ROS CAN总线设备接入(一),我们成功实现了对于libpcan库的使用,本次将实现对于can总线的初始化以及对于can总线上有效数据提取,并将其以topic形式发布到ros节点中。

【正文】

1,要完成数据读取,需要对以下函数进行映射。

//one-to-one mapping using dlsym function,if return null,mapping would be failed
    funCAN_Init         =(funCAN_Init_TYPE)         dlsym(libm_handle,"CAN_Init");
    funLINUX_CAN_Open   =(funLINUX_CAN_Open_TYPE)   dlsym(libm_handle,"LINUX_CAN_Open");
    funCAN_Close        =(funCAN_Close_TYPE)        dlsym(libm_handle,"CAN_Close");
    funCAN_VersionInfo  =(funCAN_VersionInfo_TYPE)  dlsym(libm_handle,"CAN_VersionInfo");
    funLINUX_CAN_Read   =(funLINUX_CAN_Read_TYPE)   dlsym(libm_handle,"LINUX_CAN_Read");
    funCAN_Status       =(funCAN_Status_TYPE)       dlsym(libm_handle,"CAN_Status");
    funnGetLastError    =(funnGetLastError_TYPE)    dlsym(libm_handle,"nGetLastError");
映射的方法在设备接入(一)教程中有详细介绍。程序中用了多处dlerror()进行dlfcn函数调用中的错误处理,该函数每次调用会清除之前错误队列,返回当前函数调用出现的错误。

2,pcan使用时可以先打开,再进行波特率、标准模式或扩展模式的设置等操作。

    char txt[VERSIONSTRING_LEN];            //store information of can version,存储信息
    unsigned short wBTR0BTR1 = CAN_BAUD_1M; //set the communicate baud rate of can bus,波特率
    int nExtended = CAN_INIT_TYPE_ST;       //set can message int standard model,标准模式
    const char  *szDevNode = DEFAULT_NODE;  //define const pointer point to device name,定义设备地址
    pcan_handle = funLINUX_CAN_Open(szDevNode, O_RDWR );//use mapping function
如果打开的pcan_handle非空,则函数调用成功,进行下一步处理。此处进行了打开成功的提示,并通过读取驱动can的版本号来验证是否驱动成功。

    //judge whether the call is success.if pcan_handle=null,the call would be failed
    if(pcan_handle){
        printf("CAN Bus test: %s have been opened\n", szDevNode);
        errno = funCAN_VersionInfo(pcan_handle, txt);
        if (!errno)
            printf("CAN Bus test: driver version = %s\n", txt);
        else {
            perror("CAN Bus test: CAN_VersionInfo()");
        }

以上程序片段即完成了打开can是否成功的验证,运行时会输出以下类似信息。

robot@robot-ThinkPad-T410:~$ rosrun beginner_tutorials can_test 
CAN Bus test: /dev/pcan0 have been opened
CAN Bus test: driver version = Release_20130814_n
Device Info: /dev/pcan0; CAN_BAUD_1M; CAN_INIT_TYPE_ST

然后进行初始化函数的调用,wBTR0BTR1代表了can的波特率,引用此名称主要参考lipcan官方给的测试源码,这样后期其许多函数移植会比较方便。

        if (wBTR0BTR1) {
                errno = funCAN_Init(pcan_handle, wBTR0BTR1, nExtended);
                if (errno) {
                    perror("CAN Bus test: CAN_Init()");
                }
                else
                    printf("Device Info: %s; CAN_BAUD_1M; CAN_INIT_TYPE_ST\n", szDevNode);
            }
    }
    else
        printf("CAN Bus test: can't open %s\n", szDevNode);
3,数据的提取和发布。要实现数据的提取和发布需要以下函数进行辅助,将分别对其做介绍。

//function declaration
int  read_loop(HANDLE h,ros::Publisher pub,bool display_on,bool publish_on);<span style="white-space:pre">//循环读取函
  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下方式查看 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 总线硬件和相应的驱动程序而有所不同。请参阅设备和驱动程序的说明以获得更详细的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值