ros_canopen使用心得

近期开始准备上位机与机器人底盘进行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 <ros/ros.h>

#include <ros/spinner.h>

#include <std_msgs/String.h>

#include<tf/transform_broadcaster.h>

#include<nav_msgs/Odometry.h>

#include<geometry_msgs/Twist.h>

#include <std_msgs/String.h>

#include <socketcan_bridge/topic_to_socketcan.h>

#include <socketcan_bridge/socketcan_to_topic.h>

#include <can_msgs/Frame.h>

#include <socketcan_interface/socketcan.h>


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<can_frame.dlc; i++)

{

can_frame.data[i] = transition[i];

}

ros::NodeHandle roscan("~");

ros::Publisher roscan_send_message;

roscan_send_message = roscan.advertise<can_msgs::Frame>("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文件:

<launch>

    <node pkg="socketcan_bridge" name="topic_to_socketcan_node" type="topic_to_socketcan_node" output="screen">
    </node>

    <node pkg="socketcan_bridge" name="socketcan_to_topic_node" type="socketcan_to_topic_node" output="screen">
    </node>
    
    <node pkg="robotx4_bringup" name="canopen_test" type="canopen_test" output="screen">
    </node>

</launch>

四、实验验证

1、执行第二部分前4步,打开虚拟can口

2、启动launch文件

3、观察话题发布信息

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

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

  • 11
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 39
    评论
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值