ros_canopen使用心得

近期开始准备上位机与机器人底盘进行CAN通讯,花了很长时间在网上整理学习资料,现将自己的心得和参考的链接整理如下。

首先,机器人操作系统中有ros_canopen可以去调用,其中socketcan-bridg功能包帮我们省却了很多底层工作,其socketcan_to_topicnode,topic_to_socketcannode这两个节点,可以将上位机发布的can消息转为话题发布,反之可以将底盘发送的信息转为话题进行订阅。

ros_canopen使用心得_第1张图片

 具体可以参考下面链接:

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口

ros_canopen使用心得_第2张图片

2、启动launch文件

ros_canopen使用心得_第3张图片

3、观察话题发布信息

ros_canopen使用心得_第4张图片

 4、额外测试(直接can口写和收,和ros 接口应该是独立的):

ros_canopen使用心得_第5张图片

补充:个人理解的---ros接口的话题发布,其消息需要rostopic echo 话题名 打印出来,candump是无法显示的。

你可能感兴趣的:(自动驾驶,人工智能)