ROS Melodic 与周立功CAN卡:从驱动安装到实时通讯的完整实践

1. 开篇:为什么要在ROS里折腾CAN卡?

你好,我是老张,一个在机器人行业摸爬滚打了十来年的工程师。今天想跟你聊聊一个在机器人开发中特别常见,但又让不少新手头疼的问题:怎么在ROS Melodic里,让周立功的USB-CAN卡跟你的电机、传感器这些设备“对上话”。

你可能正在做一个移动机器人,底盘是CAN总线控制的;或者在做机械臂,关节驱动器用的是CAN通讯。这时候你会发现,ROS本身并不直接支持CAN总线,你得自己搭一座“桥”。这座桥搭得好,数据流就顺畅,机器人控制起来得心应手;搭得不好,那就是各种“通讯失败”、“丢包”、“权限错误”,调试起来能让人抓狂。

我见过太多朋友,拿到周立功CAN卡,照着网上零散的教程操作,不是驱动装不上,就是ROS节点跑不起来,最后卡在某个报错上,一耗就是好几天。所以,我决定把这一整套流程,从驱动安装、权限配置,到ROS功能包创建、代码编译,再到最后的双向数据收发测试,完完整整、一步一步地写出来。这不是一个简单的命令罗列,而是我踩过无数坑之后,总结出的可复现、带排错的实战指南。目标就一个:让你跟着做,就能成功建立起稳定可靠的CAN通讯。

咱们用的环境是ROS Melodic(Ubuntu 18.04),硬件是周立功最常用的那款USB-CAN卡(型号比如USBCAN-II Pro,原理相通)。放心,哪怕你刚接触ROS和CAN总线,只要按着步骤来,也能搞定。

2. 战前准备:搞定驱动与系统权限

万事开头难,和硬件打交道的第一步往往不是写代码,而是让系统“认识”你的设备。很多问题都出在这一步。

2.1 驱动获取与依赖安装

周立功官方提供了Linux下的驱动,通常是一个压缩包,里面包含源代码、编译好的库文件(libusbcan.so)和一些测试程序。你可以从周立功官网的下载中心找到对应你卡型号的Linux驱动。如果官网找起来麻烦,网上也有一些技术社区分享的资源包,使用前注意查杀病毒。

拿到驱动包后,先别急着安装,咱们得把地基打好。这个驱动依赖于libusb库来操作USB设备,所以先确保它已经安装:

sudo apt-get update
sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev

第一行是更新软件源列表,确保能获取到最新信息。第二行中,libusb-1.0-0是运行时必需的库,而libusb-1.0-0-dev包含了开发用的头文件,有时候编译测试程序会需要,一并装上更省心。

2.2 驱动安装与初步测试

驱动包解压后,你通常会看到几个文件夹。关键文件是那个libusbcan.so(动态链接库)。按照官方老方法,可能需要把它拷贝到/lib或者/usr/lib目录下。但我更推荐一种更规范、不易引起系统混乱的做法:将它放到/usr/local/lib目录下。

# 假设你的驱动包解压在 ~/zlg_can_driver 目录下
sudo cp ~/zlg_can_driver/libusbcan.so /usr/local/lib/

然后,需要让系统知道这个新库的存在,执行一下库链接更新:

sudo ldconfig

接下来,进入驱动包里的test目录(或者类似名称的示例程序目录)。我们可以用make命令编译测试程序(如果已有可执行文件则跳过)。编译后,运行测试程序不带任何参数,它会打印出使用说明,告诉你各个参数的意义,比如通道号、波特率等。这是一个好习惯,先看看怎么用。

2.3 攻克“权限不足”这个拦路虎

到了激动人心的测试时刻,你输入类似下面的命令(参数含义后续会讲):

./test 4 0 3 0x1400 2 0 3 1000

结果很可能迎面泼来一盆冷水:libusb_open failed: ret=-3。别慌,几乎所有人在Linux下第一次玩USB-CAN卡都会遇到这个问题。这根本不是驱动没装好,而是当前用户没有权限去直接读写这个USB设备

网上有些教程会教你简单粗暴的一招:sudo chmod -R 777 /dev/bus/usb/。这命令确实能暂时解决问题,因为它给所有USB设备赋予了最高权限。但我非常不推荐这样做,这是严重的安全隐患,相当于把你家所有房门和保险柜的钥匙都插在门上。

我们应该采用更优雅、一劳永逸的方法:创建一条udev规则。udev是Linux系统管理设备节点的服务,通过规则文件,我们可以在设备插入时,自动为其设置合适的权限。

首先,找到你CAN卡的“身份证”——厂商ID(idVendor)和产品ID(idProduct)。把CAN卡插上电脑,然后在终端输入:

lsusb

你会看到一列USB设备列表,找到类似“ZLG”或“QinHeng Electronics”的描述(周立功卡常用沁恒的USB芯片),记下对应的ID号,例如 067b:2303(这里067b是厂商ID,2303是产品ID)。

接下来,创建udev规则文件:

sudo touch /etc/udev/rules.d/50-usbcan.rules
sudo gedit /etc/udev/rules.d/50-usbcan.rules  # 也可以用nano, vim

在打开的文件里,写入下面这行规则(请将ATTRS{idVendor}ATTRS{idProduct}替换成你刚才用lsusb查到的实际ID):

SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", GROUP="users", MODE="0666"

这行规则的意思是:当检测到一个USB子系统设备,且其厂商ID和产品ID匹配时,将其所属组设置为users,访问权限设置为0666(即所有用户可读可写)。GROUP="users"需要确保你的当前用户属于users组(通常默认是的)。

保存文件后,让udev重新加载规则,使其生效:

sudo udevadm control --reload-rules
sudo udevadm trigger

现在,拔掉CAN卡再重新插入。这是关键一步,让新规则生效于这个设备。完成后,你应该不需要sudo,直接就能运行那个./test测试程序了。再执行一次测试命令,如果看到程序开始运行,没有报错,并且可能开始收发数据(具体看测试程序功能),那么恭喜你,最难的坎已经迈过去了!

3. 构建ROS的CAN通讯桥梁

驱动通了,相当于学会了方言,现在我们要在ROS这个“大社区”里建一个翻译站,让ROS的“标准语”(Topic/Message)能和CAN的“方言”(数据帧)互相转换。

3.1 创建ROS工作空间与

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值