ROS-Melodic 实现CAN(周立功CAN卡)通讯

本文详细介绍了如何安装MiniPCIe接口CAN卡的驱动,包括解决权限问题,并提供了编译ROS包的步骤,包括创建工作空间、配置依赖、编辑CMakeLists.txt和运行测试。此外,还涉及了CAN卡的通讯配置与ROS包的运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、安装CAN驱动

1.官网下载MiniPCIe接口CAN卡-广州致远电子有限公司

(百度网盘连接:链接: https://pan.baidu.com/s/1JKeDpe33g88Z6PAcSJMDoQ 提取码: l8p1)

apt-get install libusb-1.0-0  ##确保安装依赖

2.安装

2.1将文件夹里的libusbcan.so文件复制到/lib(其他位置-计算机-lib)目录下

2.2进入test目录

make
./test

不带参数运行测试程序,会打印CAN测试参数说明

2.3 加入参数,调用test,可进行收发测试:

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

报错libusb_open failed: ret=-3,是权限问题

2.3.1修改权限

第一步:执行以下命令
sudo chmod -R 777 /dev/bus/usb/
重新运行测试程序,若还报错,执行第二步
第二步:永久赋予普通用户操作USBCAN设备的权限,修改udev配置
su
touch /etc/udev/rules.d/50-usbcan.rules
gedit /etc/udev/rules.d/50-usbcan.rules
在50-usbcan.rules文件中输入:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", GROUP="users", MODE="0666"
保存并退出
重新加载 udev 规则:
sudo udevadm control --reload

重启电脑或插拔设备

2.3.2再次执行

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

二、编译ros包(绝对干货)

1.创建工作空间

在根目录下新建文件夹can_demo
cd can_demo
mkdir src
catkin_make

1.2.在src下创建功能包ros_can,添加依赖roscpp rospy std_msgs
在功能包ros_can下创建msg文件夹,将文件Frame.msg放入该文件夹下

1.3.package.xml中添加编译依赖与执行依赖

 <build_depend>message_generation</build_depend>
 <exec_depend>message_runtime</exec_depend>

1.4.CMakeLists.txt编辑 msg 相关配置

find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
Copy
## 配置 msg 源文件
add_message_files(
FILES
Person.msg
)
Copy
# 生成消息时依赖于 std_msgs
generate_messages(DEPENDENCIES
std_msgs
)

#执行时依赖
catkin_package(
#
INCLUDE_DIRS include
#
LIBRARIES demo02_talker_listener
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#
DEPENDS system_lib
)

1.5 编译

会在  .../工作空间/devel/include/包名/  目录生成Frame.h文件

2.配置通讯

2.1将cmakelist.txt中第3行以下的部分替换你自己的内容

controlcan.h放入1.5所述生成Frame.h的文件夹下

ros_candata_rx放入ros_can/src

修改includePath

2.2编译

2.3运行

rosrun ros_can rx

rosrun ros_can roscan

完工!!!

### 使用CAN Socket在ROS中的实现 #### 创建ROS工作空间并初始化环境 为了便于管理和测试,在开始之前建议创建一个新的ROS工作空间。这有助于保持项目的整洁有序[^1]。 ```bash mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ wstool init src ``` #### 安装必要的依赖项 确保安装了`socketcan_interface`和其他可能需要的软件包来支持CAN通信: ```bash sudo apt-get install ros-noetic-can* python3-catkin-tools ``` #### 配置内核模块加载CAN接口 为了让Linux识别CAN设备作为网络接口,需执行如下命令以加载相应的内核模块,并设置CAN通道参数[^3]: ```bash sudo modprobe can sudo modprobe vcan sudo ip link add dev vcan0 type vcan sudo ip link set up vcan0 ``` 对于实际硬件连接的情况,则替换上述虚拟CAN(`vcan`)配置为物理CAN端口配置,例如: ```bash sudo modprobe kvaser_usb # 或者其他适配器对应的驱动程序 ip link set can0 type can bitrate 500000 ifconfig can0 up ``` #### 编写节点代码读取/发送CAN消息 接下来编写两个简单的ROS节点用于接收和发送CAN报文。这里给出Python版本的例子;C++实现方式类似。 ##### 发送方节点 (`send_can.py`) ```python #!/usr/bin/env python3 import rospy from std_msgs.msg import String import cantools import can def send(): db = cantools.database.load_file('example.dbc') msg = db.get_message_by_name('ExampleMessage') bus = can.interface.Bus(bustype='socketcan', channel='can0') while not rospy.is_shutdown(): data = {'signal': value} # 替换value为你想要传输的数据 message = msg.encode(data) try: bus.send(can.Message(arbitration_id=msg.frame_id, data=message)) rospy.loginfo(f"Sent {message}") except Exception as e: rospy.logerr(e) if __name__ == '__main__': rospy.init_node('can_sender') rate = rospy.Rate(10) # 10hz try: send() finally: pass ``` ##### 接收方节点 (`receive_can.py`) ```python #!/usr/bin/env python3 import rospy from diagnostic_msgs.msg import KeyValue import cantools import can def callback(msg): decoded_msg = dbc.decode_message(msg.arbitration_id, msg.data) rospy.loginfo(decoded_msg) def receive(): global dbc dbc = cantools.database.load_file('example.dbc') bus = can.interface.Bus(bustype='socketcan', channel='can0') for msg in bus: callback(msg) if __name__ == '__main__': rospy.init_node('can_receiver') try: receive() finally: pass ``` 以上脚本假设已经有一个DBC文件定义了要使用的CAN协议格式。如果没有现成的DBC文件,可以根据具体需求自行创建或获取。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CPU疼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值