近期开始准备上位机与机器人底盘进行CAN通讯,花了很长时间在网上整理学习资料,现将自己的心得和参考的链接整理如下。
首先,机器人操作系统中有ros_canopen可以去调用,其中socketcan-bridg功能包帮我们省却了很多底层工作,其socketcan_to_topicnode,topic_to_socketcannode这两个节点,可以将上位机发布的can消息转为话题发布,反之可以将底盘发送的信息转为话题进行订阅。
具体可以参考下面链接:
ROS中CANopen的使用(1)_zyf_to_utopia的博客-CSDN博客
一、安装canopen
1.1开始准备工作(下载):
$ mkdir -p /xxx_ws/src
$ cd /xxx_ws
$ git clone git https://github.com/ros-industrial/ros_canopen.git
最后一行代码可以改为git clone git://github.com/ros-industrial/ros_canopen.git
就是新建工作空间,在工作空间中下载ros_canopen
1.2 开始安装ros_canopen
$ sudo apt-get install libmuparser-dev
上述链接中提到上一步安装出现问题的话,执行下面这一步:
$ sudo apt-get install libmuparser libmuparser2v5 libmuparser-doc libmuparserx-dev libmuparser-dev libmuparserx4.0.7
1.3 开始编译
cd xxx_ws 进入工作空间
开始运行 catkin_make
个人习惯一次一敲 source ./devel/setup.bash 所以跳过了后续
笔者当时参考的链接:
ubuntu ros melodic 安装 canopen - xyyh - 博客园 (cnblogs.com)
二、创建虚拟can口进行调试
本文主要针对笔记本电脑等设备,因为该设备通常没有can卡,所以需要创建并调用虚拟can口,步骤如下:
下面创建虚拟CAN。只做粗体部分即可。
1.sudo modprobe vcan //加载虚拟can模块
2.sudo ip link add dev can0 type vcan //添加can0网卡
3.ifconfig -a //查看can0
4.sudo ip link set dev can0 up //开启can0
5.sudo ip link set dev can0 down //关闭can0
6. sudo ip link del dev can0 //删除can0
roscore //启动roscore
rosrun socketcan_bridge socketcan_to_topic_node//启动节点
rostopic echo /received_messages (这里的数据是ROS MSG格式)---打印通道内容
candump can0 (原样的数据显示)接受CAN数据
cansend can0 7ff#123456 //发送CAN数据测试
执行到第四步开启can口就好了,因为后续可以自己写程序和launch文件进行集成运行。
笔者当时参考的链接:
ROS中使用CAN通信的调查记录_学习笔记-CSDN博客
三、笔者写的简单调试代码
canopen_test.cpp:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void send_can_message(int motor_1,int motor_2,int motor_3,int motor_4)
{
while(ros::ok())
{
ROS_INFO("start send can_message");
setlocale(LC_ALL,"");
uint8_t transition[8];//中间传递转速变量数组
can_msgs::Frame can_frame;
memset(&transition,0,sizeof(transition));//初始化数组元素为0
transition[0]=motor_1 >> 8;
transition[1]=motor_1 & 0xFF;
transition[2]=motor_2 >> 8;
transition[3]=motor_2 & 0xFF;
transition[4]=motor_3 >> 8;
transition[5]=motor_3 & 0xFF;
transition[6]=motor_4 >> 8;
transition[7]=motor_4 & 0xFF8;
can_frame.id=0x07ff1234;//需要修改
can_frame.is_extended = true;
can_frame.is_rtr = false;
can_frame.is_error = false;
can_frame.dlc = 8;//有效数据长度
for(uint8_t i =0; i("sent_messages",100);
roscan_send_message.publish(can_frame);
ROS_INFO("has sent messages to motor 1-4");
ros::Duration(0.5).sleep();
ros::spinOnce();
}
}
int main(int argc, char**argv)
{
ros::init(argc, argv, "robotx4");
ros::NodeHandle n("~");
send_can_message(100,200,300,400);
}
.launch文件:
四、实验验证
1、执行第二部分前4步,打开虚拟can口
2、启动launch文件
3、观察话题发布信息
4、额外测试(直接can口写和收,和ros 接口应该是独立的):
补充:个人理解的---ros接口的话题发布,其消息需要rostopic echo 话题名 打印出来,candump是无法显示的。