EtherCAT运动控制器在ROS上的应用(上)

news2024/10/5 16:26:04

本文以正运动技术EtherCAT运动控制器ZMC432和ZMC408CE为例,介绍正运动技术运动控制器在ROS上的应用开发。

在正式学习之前,我们先了解一下正运动技术的EtherCAT运动控制器ZMC432和ZMC408CE。这两款产品分别是32轴,8轴EtherCAT运动控制器。

ZMC432功能简介

ZMC432是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。

在这里插入图片描述

ZMC432最多可支持32轴运动控制,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随等功能。

ZMC432支持32轴脉冲输入与编码器反馈,通用IO包含24路输入口和12个输出口;2路AD,2路DA;其中特定输出口支持高速PWM控制。

ZMC432通过EtherCAT和CAN总线进行硬件资源扩展,可扩展至4096路输入和4096路输出。

在这里插入图片描述

ZMC408CE功能简介

ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。

在这里插入图片描述

ZMC408CE支持8轴运动控制,最多可扩展至32轴,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随等功能。

ZMC408CE支持8轴运动控制,可采用脉冲轴(带编码器反馈)或EtherCAT总线轴,通用IO包含24路输入口和16路输出口,部分IO为高速IO,模拟量AD/DA各两路,EtherCAT最快125us的刷新周期。

ZMC408CE支持8个通道的硬件比较输出、硬件定时器、运动中精准输出,还支持8通道PWM输出,对应的输出口为OUT0-7,支持8个通道同时触发硬件比较输出。

ZMC408CE可灵活进行硬件资源扩展,通过CAN或EtherCAT总线可扩展至4096个输入和4096个输出。

在这里插入图片描述

→ZMC432,ZMC408CE均使用同一套API函数,均支持C、C++、C#、LabVIEW、Python、Delphi等开发语言,支持VC6.0、VB6.0、Qt、.Net等平台,支持Windows、Linux、WinCE、iMac等操作系统。

在这里插入图片描述

01 ROS应用背景

ROS(robot operating system)是用于机器人的一种开源后操作系统(次级操作系统)。首要设计目标是在机器人研发领域提高代码复用率。

ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。

ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由ROS的基础工具实现。

简单来说,ROS作为一个灵活的操作系统,系统上的节点具有很大的随意性,它们可以位于不同的计算机上,甚至可以位于不同的网络上。我们可以使用一个Arduino作为一个节点发布信息,使用一台笔记本电脑作为一个节点订阅上述信息以及使用一台手机作为一个节点驱动电机等。

上述灵活性使得ROS可以适应很多不同场合的应用。

在这里插入图片描述

ROS的主要特点可以归纳为以下几条

1.分布式点对点设计

ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。

在这里插入图片描述

2.多语言支持

ROS支持许多种不同的语言,例如C++、Python、Octave和LISP,也包含其他语言的多种接口实现。

在这里插入图片描述

3.精简与集成

ROS建立的系统具有模块化的特点,各模块中的代码可以单独编译,而且编译使用的CMake工具使它很容易的就实现精简的理念。

ROS基本将复杂的代码封装在库里,只是创建了一些小的应用程序为ROS显示库的功能,就允许了对简单的代码超越原型进行移植和重新使用。

4.工具包丰富

为了管理复杂的ROS软件框架,我们利用了大量的小工具去编译和运行多种多样的ROS组建,从而设计成了内核,而不是构建一个庞大的开发和运行环境。

在这里插入图片描述

5.免费并且开源

ROS所有的源代码都是公开发布的。

ROS在行业中的一些应用

近年来,国内外机器人企业、无人驾驶企业,无人机企业(大疆无人机)都纷纷加入ROS阵营。且在各大招聘中,不管是腾讯、小马智行、阿里巴巴的菜鸟网络、百度Apollo等,招聘无人驾驶规划算法工程师、自主导航工程师、机器人感知算法工程师、系统平台研发架构师等岗位时,均要求“熟悉ROS”或者“具备ROS开发经验者优先”。

从这些我们可以看出来ROS系统的发展趋势,正在机器人行业一步一步的主导中国市场。以下是一些ROS典型应用场景:

1.机器人控制器中的大佬人物 - KEBA,他们的控制器已经支持ROS。

在这里插入图片描述

2.美国NASA基于ROS开发的Robonaut 2已经在国际空间站里干活了。

在这里插入图片描述

3.百度apollo无人车的底层是基于ROS开发的,差点改成了ROS 2,可以在github上找到(apollo-platform)。

在这里插入图片描述

4.ROS-I最近正准备和微软、宝马合作,开发一套自动化解决方案(参考:A ROS-Industrial Collaboration with Microsoft and BMW)。

在这里插入图片描述

5.许多工业机械臂已经开始使用ROS系统,其中2017年底ROS-I官方发布的五周年视频不乏四大家族中的机器人。下图的库卡youbot机器人就是采用ROS系统开发。

在这里插入图片描述

02 软件安装过程

此部分主要讲Ubuntu18.04安装ROS Melodic详细过程(本文以Ubuntu18.04为例,其他同理,并不影响运动控制器的运用)。

1.设置sources.list

$ sudo sh -c '. /etc/lsb-release && echo "deb 
http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > 
/etc/apt/sources.list.d/ros-latest.list'

2.设置key(公钥已更新)

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key 
421C365BD9FF1F717815A3895523BAEEB01FA116

在这里插入图片描述

3.更新package(时间有点长,耐心等待)

$ sudo apt-get update

此时可能会遇到以下问题:

在这里插入图片描述

解决办法如下,在终端输入:

$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F42ED6FBAB17C654
$ sudo apt-get update

在这里插入图片描述

当出现Reading package lists… Done说明更新完成。

4.安装ROS melodic完整版

$ sudo apt-get install ros-melodic-desktop-full

5.初始化rosdep

$sudo rosdep init
$rosdep update
$echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

效果示意图:

在这里插入图片描述
在这里插入图片描述

输入指令sudo rosdep init若遇到以下问题:

(1)sudo : rosdep : command not found问题

在终端输入:sudo apt install rospack-tools

(2)ERROR : cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list Website may be down.

①在终端输入:sudo gedit / etc / hosts,打开hosts文件,内容如下;

在这里插入图片描述

②将:199.232.28.133 raw.githubusercontent.com添加在文件中,添加后的文件如下;

在这里插入图片描述

③然后保存文件后退出;

在这里插入图片描述

④在终端执行:sudo rosdep init,问题解决。

6.测试ROS是否安装成功

$ roscore

成功打开如下图所示:

在这里插入图片描述

03 ROS编程案例

这部分主要讲“消息发布”和“订阅”两个ROS编程案例。

1.创建一个ROS工作空间。

$mkdir -p ~/catkin_ws/src
$cd ~/catkin_ws/
$ catkin_make

2.创建ROS程序包(zmotion为程序包名,也可以定义为其他)。

$cd ~/catkin_ws/src
$catkin_create_pkg zmotion std_msgs roscpp
$cd ~/catkin_ws
$ catkin_make

3.在创建完程序包后,每次运行需要source ~ / catkin_ws / devel / setup.bash,否则无法找到文件。

解决每次都要source方法:

在终端输入:
$gedit ~/.bashrc
在文件末尾添加并保存:
$ source ~/catkin_ws/devel/setup.bash

4.新建节点文件。

在zmotion包目录中创建一个src目录:

$cd ~/catkin_ws/src/zmotion //进入zmotion程序包路径下
$mkdir -p src    //新建src文件夹,用来存放c++程序
$cd src/    //进入src文件夹路径下
$touch talker.cpp   //新建发布消息节点cpp文件
$ touch listener.cpp //新建订阅消息节点cpp文件

5.撰写发布节点(talker.cpp)。

实现功能:

(1)初始化ROS系统;

(2)在chatter topic上发布std_msgs/Float64消息;

(3)以每秒10次频率发布消息。

#include "ros/ros.h"
#include "std_msgs/Float64.h"
#include <sstream>
int main(int argc, char **argv)
{
  //初始化ROS,名称重映射(唯一),必须为base name,不含/
  ros::init(argc, argv, "talker"); 
  //为进程的节点创建一个句柄,第一个创建的NodeHandle初始化节点
  ros::NodeHandle n;
  //告诉主机要在chatter topic上发布一个std_msgs消息
  //主机会订阅所有chatter topic节点,参数表示发布队列的大小(先进先出)
  ros::Publisher chatter_pub = n.advertise<std_msgs::Float64>("chatter", 1000);
  ros::Rate loop_rate(10);  //自循环频率
  int count = 0;
  while (ros::ok())
  {
    std_msgs::Float64 msg;
    msg.data = count*1.0;
    //输出,用来替代prinf/cout
    ROS_INFO("Position is: %f", msg.data); 
chatter_pub.publish(msg);
    ros::spinOnce();
    //休眠,来使发布频率为10Hz
    loop_rate.sleep();
    ++count;
  }
  return 0;
}

6.撰写订阅节点(listener.cpp)。

实现功能:

(1)初始化ROS系统;

(2)订阅chatter topic消息;

(3)进入自循环,等待消息到达;

(4)消息到达,调用chatterCallback()函数。

#include "ros/ros.h"
#include "std_msgs/Float64.h"
//回调函数
void chatterCallback(const std_msgs::Float64::ConstPtr& msg)
{
  ROS_INFO("I heard: %f", msg->data);
}
int main(int argc, char **argv)
{
  ros::init(argc, argv, "listener");
  ros::NodeHandle n;
  //告诉master需要订阅chatter topic消息
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  ros::spin(); //自循环
  return 0;
}

7.修改CMakeLists.txt。

(1)打开程序包zmotion(catkin_ws / src / zmotion)路径,找到CMakeLists.txt文件。

在这里插入图片描述

(2) 最低版本修改为2.8.3。

cmake_minimum_required(VERSION 2.8.3)

(3) 找到find_package,添加依赖包message_generation。

find_package(catkin REQUIRED COMPONENTS
   roscpp
   std_msgs
   message_generation
)

(4)确保generate_message被调用。

generate_messages(
   DEPENDENCIES
   std_msgs
)

(5)确保在运行时依赖中也添加了该消息的依赖。

catkin_package(
# INCLUDE_DIRS include
# LIBRARIES beginner_tutorials
# CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
  CATKIN_DEPENDS message_runtime
)

(6)修改build下的设置

在这里插入图片描述

①将include_directories中include解注释。

在这里插入图片描述

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

②在指定位置添加下列代码下面的代码可以任意添加在build中,我为了美观所以添加在相应位置的,只要在build中添加都生效。

add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
add_dependencies(talker $zmotion_generate_messages_cpp)//zmotion为程序包名
target_link_libraries(talker
   ${catkin_LIBRARIES}
)
target_link_libraries(listener
   ${catkin_LIBRARIES}
)

在这里插入图片描述

(7)最后,列出完整的CMakeLists.txt。

cmake_minimum_required(VERSION 2.8.3)
project(zmotion)
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  message_generation
)
## Generate added messages and services with any dependencies listed here
generate_messages(
   DEPENDENCIES
   std_msgs
)
###################################
## catkin specific configuration ##
###################################
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES zmotion
# CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
CATKIN_DEPENDS message_runtime
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
## Rename C++ executable without prefix
add_dependencies(talker $zmotion_generate_messages_cpp)
## Specify libraries to link a library or executable target against
target_link_libraries(talker
   ${catkin_LIBRARIES}
)
target_link_libraries(listener
   ${catkin_LIBRARIES}
)

8.修改package.xml文件。

<!-- build 依赖。下面两句任选其1均可,也可以都写上 -->
<build_depend>message_generation</build_depend>
<build_export_depend>message_generation</build_export_depend>
<!-- 执行依赖,必须加上以下这句:-->
<exec_depend>message_runtime</exec_depend>

在这里插入图片描述

9.编译。

$ cd ~/catkin_ws
$ catkin_make

10.运行程序。

(1)打开一个新终端,启动ROS系统;

$ roscore

(2)打开一个新终端,运行发布节点;

$ cd ~/catkin_ws //进入工作控件目录下
$ rosrun zmotion talker //运行发布节点程序

(3)打开一个新终端,运行订阅节点;

$ cd ~/catkin_ws
$ rosrun zmotion listener

(4)结果。

运行发布节点程序的结果:

[INFO] [WallTime: 1314931831.774057] Position is: 1.000000
[INFO] [WallTime: 1314931832.775497] Position is: 2.000000
[INFO] [WallTime: 1314931833.778937] Position is: 3.000000
[INFO] [WallTime: 1314931834.782059] Position is: 4.000000
[INFO] [WallTime: 1314931835.784853] Position is: 5.000000

运行订阅节点程序的结果:

[INFO] [WallTime: 1314931970.262246] I heard: 1.000000
[INFO] [WallTime: 1314931971.266348] I heard: 2.000000
[INFO] [WallTime: 1314931972.270429] I heard: 3.000000
[INFO] [WallTime: 1314931973.274382] I heard: 4.000000
[INFO] [WallTime: 1314931974.277694] I heard: 5.000000

本次,正运动技术EtherCAT运动控制器在ROS上的应用(上),就分享到这里。

更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享Web.dev.cn中国开发者可以正常访问

谷歌开发者很高兴地宣布&#xff0c;web.dev 和 Chrome for Developers 现在都可以通过 .cn 域名访问&#xff0c;这将帮助中国的开发者更加容易获取我们的内容。 在 .cn 域名上&#xff0c;我们已向您提供所有镜像后的内容&#xff0c;并提供支持的语言版本。 Web.dev 中国开…

【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject&#xff1f; 在游戏开发中&#xff0c;有大量的配置数据需要存储&#xff0c;这个时候就需要ScriptableObject来存储数据了。 很多人会说我可以用json、xml、txt&#xff0c;excel等等 但是你们有没有想过&#xff0c;假设你使用的是json&#x…

CSS全局样式的设置,JavaScript运算符

面试题&#xff1a; Html 1&#xff0c;html语义化 2&#xff0c;meta viewport相关 3&#xff0c;canvas 相关 CSS 1&#xff0c;盒模型 1.1&#xff0c;ie盒模型算上border、padding及自身&#xff08;不算margin&#xff09;&#xff0c;标准的只算上自身窗体的大小 c…

相机类型的分辨率长宽、靶面尺寸大小、像元大小汇总

镜头的靶面尺寸大于等于相机靶面尺寸。 相机的芯片长这样&#xff0c;绿色反光部分&#xff08;我的手忽略&#xff09;&#xff1a; 基本所有像素的相机的靶面大小都可以在这个表格里面找到。 镜头的靶面尺寸在镜头外表上可以找到&#xff0c;选型很重要&#xff01;

Android logcat系统

一 .logcat命令介绍 android log系统: logcat介绍 : logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息. 二.C/Clogcat访问接口 Android系统中的C/C日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别&#xff1a; /…

信息安全系列04-安全启动介绍

本文框架 1. 基本概念1.1 基本概念回顾1.2 数字签名及验签流程 2. 安全启动实施2.1 信任根选择2.1.1 使用HSM作为信任根2.1.2 使用最底层Bootloader作为信任根 2.2 校验方法确认2.2.1 基于非对称加密算法&#xff08;数字签名&#xff09;2.2.2 基于对称加密算法 2.3 安全启动方…

三星成功研发出业界首款12层堆叠HBM3E

三星电子有限公司成功研发出业界首款12层堆叠HBM3E DRAM——HBM3E 12H&#xff0c;这是迄今为止容量最大的HBM产品。这款新型HBM3E 12H内存模块提供了高达1,280GB/s的史上最高带宽&#xff0c;并拥有36GB的存储容量&#xff0c;相较于之前的8层堆叠HBM3 8H&#xff0c;在带宽和…

Java代码审计安全篇-常见Java SQL注入

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望…

怎么把一段音频的人声和背景音乐分开?3种方法分享

怎么把一段音频的人声和背景音乐分开&#xff1f;随着技术的不断发展进步&#xff0c;将音频中的人声和背景音乐分离已成为现实。这种技术不仅提升了音频编辑的效率和准确性&#xff0c;更为我们提供了无限的可能性。例如&#xff0c;音乐制作人可以更容易地提取出纯净的人声或…

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据】操作批量新增、分页查询(四)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本编码方式mybatis☑️☑️3.5.4lambda xml 优化sq…

SAR ADC学习笔记(3)

一、SAR ADC采样电路 1.采样网络的时域响应&#xff1a;采保信号 2.采样网络的KT/C噪声 3.采样抖动 采样开关的种类 1.单MOS管开关 2.传输门开关 3.栅极自举&#xff08;Bootstrap&#xff09;开关 结论&#xff1a;M4的衬底需要和B点短接&#xff0c;保证B点能够到达高压&…

Linux系统的服务/进程

系统守护进程&#xff08;服务&#xff09; •服务就是运行在网络服务器上监听用户请求的进程 •服务是通过端口号来区分的 常见的服务及其对应的端口 1.ftp&#xff1a;21 FTP指的是文件传输协议&#xff0c;它是用于在计算机网络上进行文件传输的标准网络协议。通过FTP&am…

为什么MySQL中多表联查效率低,连接查询实现的原理是什么?

MySQL中多表联查效率低的原因主要涉及到以下几个方面&#xff1a; 数据量大: 当多个表通过连接查询时&#xff0c;如果这些表的数据量很大&#xff0c;那么查询就需要处理更多的数据&#xff0c;这自然会降低查询效率。 连接操作复杂性: 连接查询需要对参与连接的每个表中的数…

ES入门三:全文搜索Api实践

ES是一个强大的搜索引擎&#xff0c;它提供了非常丰富的数据检索Api来满足用户各种各样的需求。我们今天要介绍的是部分非常基础的全文搜索Api&#xff0c;这部分Api我们会在日常使用中经常用到。 在我们查询一些文本内容的时候&#xff0c;一般不会做精确匹配&#xff0c;一来…

Docker Compose实战指南:让容器管理变得简单而强大

&#x1f9e8;个人主页&#xff1a;明明跟你说过 &#x1f6a9;欢迎&#x1f397;️点赞&#x1f638;关注❤️分享 &#x1f638;希望本文能够对您有所帮助&#xff0c;如果本文有不足之处&#xff0c;或您有更好的建议、见解&#xff0c;欢迎在评论区留下您的看法&#xff0c…

界面控件DevExpress WinForms 2024产品路线图预览(一)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

用Java在Spring Boot项目中,如何传递来传递一个对象(多个参数??

前言&#xff1a; 在前面我们已经了解到&#xff0c;Spring Boot项目中&#xff0c;可以传递一个参数&#xff0c;或者多个参数&#xff0c;但是&#xff0c;随着参数的增加&#xff0c;咱们总不能每增加一个参数&#xff0c;就重新写一段代码吧&#xff1f;&#xff1f;这样显…

剑指offer》15--二进制中1的个数[C++]

1. 题目描述 输入一个整数&#xff0c;输出该数二进制表示中 1 的个数。 2. 解题思路 如果对负数直接右移&#xff0c;会导致最高位一直补1&#xff0c;最终变成0xFFFF死循环。 常规做法&#xff1a; 3. 代码实现 #include<iostream> #include<vector> using…

Express学习(一)

Express Express简介 什么是Express 官方给出的概念&#xff1a;Express是基于Node.js平台&#xff0c;快速、开放、极简的web开发框架。 通俗的理解&#xff1a;Express的作用和Node.js内置的http模块类似&#xff0c;是专门用来创建Web服务器的。进一步理解Express 不使用E…

GIS之深度学习10:运行Faster RCNN算法

&#xff08;未完成&#xff0c;待补充&#xff09; 获取Faster RCNN源码 &#xff08;开源的很多&#xff0c;论文里也有&#xff0c;在这里不多赘述&#xff09; 替换自己的数据集&#xff08;图片标签文件&#xff09; &#xff08;需要使用labeling生成标签文件&#xf…