本文以正運(yùn)動技術(shù)EtherCAT運(yùn)動控制器ZMC432和ZMC408CE為例,介紹正運(yùn)動技術(shù)運(yùn)動控制器在ROS上的應(yīng)用開發(fā)。
在正式學(xué)習(xí)之前,我們先了解一下正運(yùn)動技術(shù)的EtherCAT運(yùn)動控制器ZMC432和ZMC408CE。這兩款產(chǎn)品分別是32軸,8軸EtherCAT運(yùn)動控制器。
ZMC432功能簡介
ZMC432是正運(yùn)動推出的一款多軸高性能EtherCAT總線運(yùn)動控制器,具有EtherCAT、EtherNET、RS232、CAN和U盤等通訊接口,ZMC系列運(yùn)動控制器可應(yīng)用于各種需要脫機(jī)或聯(lián)機(jī)運(yùn)行的場合。
ZMC432最多可支持32軸運(yùn)動控制,支持直線插補(bǔ)、任意圓弧插補(bǔ)、空間圓弧、螺旋插補(bǔ)、電子凸輪、電子齒輪、同步跟隨等功能。
ZMC432支持32軸脈沖輸入與編碼器反饋,通用IO包含24路輸入口和12個輸出口;2路AD,2路DA;其中特定輸出口支持高速PWM控制。
ZMC432通過EtherCAT和CAN總線進(jìn)行硬件資源擴(kuò)展,可擴(kuò)展至4096路輸入和4096路輸出。
ZMC408CE功能簡介
ZMC408CE是正運(yùn)動推出的一款多軸高性能EtherCAT總線運(yùn)動控制器,具有EtherCAT、EtherNET、RS232、CAN和U盤等通訊接口,ZMC系列運(yùn)動控制器可應(yīng)用于各種需要脫機(jī)或聯(lián)機(jī)運(yùn)行的場合。
ZMC408CE支持8軸運(yùn)動控制,最多可擴(kuò)展至32軸,支持直線插補(bǔ)、任意圓弧插補(bǔ)、空間圓弧、螺旋插補(bǔ)、電子凸輪、電子齒輪、同步跟隨等功能。
ZMC408CE支持8軸運(yùn)動控制,可采用脈沖軸(帶編碼器反饋)或EtherCAT總線軸,通用IO包含24路輸入口和16路輸出口,部分IO為高速IO,模擬量AD/DA各兩路,EtherCAT最快125us的刷新周期。
ZMC408CE支持8個通道的硬件比較輸出、硬件定時器、運(yùn)動中精準(zhǔn)輸出,還支持8通道PWM輸出,對應(yīng)的輸出口為OUT0-7,支持8個通道同時觸發(fā)硬件比較輸出。
ZMC408CE可靈活進(jìn)行硬件資源擴(kuò)展,通過CAN或EtherCAT總線可擴(kuò)展至4096個輸入和4096個輸出。
→ZMC432,ZMC408CE均使用同一套API函數(shù),均支持C、C++、C#、LabVIEW、Python、Delphi等開發(fā)語言,支持VC6.0、VB6.0、Qt、.Net等平臺,支持Windows、Linux、WinCE、iMac等操作系統(tǒng)。
01ROS應(yīng)用背景
ROS(robot operating system)是用于機(jī)器人的一種開源后操作系統(tǒng)(次級操作系統(tǒng))。首要設(shè)計(jì)目標(biāo)是在機(jī)器人研發(fā)領(lǐng)域提高代碼復(fù)用率。
ROS是一種分布式處理框架(又名Nodes)。這使可執(zhí)行文件能被單獨(dú)設(shè)計(jì),并且在運(yùn)行時松散耦合。這些過程可以封裝到數(shù)據(jù)包(Packages)和堆棧(Stacks)中,以便于共享和分發(fā)。
ROS還支持代碼庫的聯(lián)合系統(tǒng)。使得協(xié)作亦能被分發(fā)。這種從文件系統(tǒng)級別到社區(qū)一級的設(shè)計(jì)讓獨(dú)立地決定發(fā)展和實(shí)施工作成為可能。上述所有功能都能由ROS的基礎(chǔ)工具實(shí)現(xiàn)。
簡單來說,ROS作為一個靈活的操作系統(tǒng),系統(tǒng)上的節(jié)點(diǎn)具有很大的隨意性,它們可以位于不同的計(jì)算機(jī)上,甚至可以位于不同的網(wǎng)絡(luò)上。我們可以使用一個Arduino作為一個節(jié)點(diǎn)發(fā)布信息,使用一臺筆記本電腦作為一個節(jié)點(diǎn)訂閱上述信息以及使用一臺手機(jī)作為一個節(jié)點(diǎn)驅(qū)動電機(jī)等。
上述靈活性使得ROS可以適應(yīng)很多不同場合的應(yīng)用。
ROS的主要特點(diǎn)可以歸納為以下幾條
1.分布式點(diǎn)對點(diǎn)設(shè)計(jì)
ROS的點(diǎn)對點(diǎn)設(shè)計(jì)以及服務(wù)和節(jié)點(diǎn)管理器等機(jī)制可以分散由計(jì)算機(jī)視覺和語音識別等功能帶來的實(shí)時計(jì)算壓力,能夠適應(yīng)多機(jī)器人遇到的挑戰(zhàn)。
2.多語言支持
ROS支持許多種不同的語言,例如C++、Python、Octave和LISP,也包含其他語言的多種接口實(shí)現(xiàn)。
3.精簡與集成
ROS建立的系統(tǒng)具有模塊化的特點(diǎn),各模塊中的代碼可以單獨(dú)編譯,而且編譯使用的CMake工具使它很容易的就實(shí)現(xiàn)精簡的理念。
ROS基本將復(fù)雜的代碼封裝在庫里,只是創(chuàng)建了一些小的應(yīng)用程序?yàn)镽OS顯示庫的功能,就允許了對簡單的代碼超越原型進(jìn)行移植和重新使用。
4.工具包豐富
為了管理復(fù)雜的ROS軟件框架,我們利用了大量的小工具去編譯和運(yùn)行多種多樣的ROS組建,從而設(shè)計(jì)成了內(nèi)核,而不是構(gòu)建一個龐大的開發(fā)和運(yùn)行環(huán)境。
5.免費(fèi)并且開源
ROS所有的源代碼都是公開發(fā)布的。
ROS在行業(yè)中的一些應(yīng)用
近年來,國內(nèi)外機(jī)器人企業(yè)、無人駕駛企業(yè),無人機(jī)企業(yè)(大疆無人機(jī))都紛紛加入ROS陣營。且在各大招聘中,不管是騰訊、小馬智行、阿里巴巴的菜鳥網(wǎng)絡(luò)、百度Apollo等,招聘無人駕駛規(guī)劃算法工程師、自主導(dǎo)航工程師、機(jī)器人感知算法工程師、系統(tǒng)平臺研發(fā)架構(gòu)師等崗位時,均要求“熟悉ROS”或者“具備ROS開發(fā)經(jīng)驗(yàn)者優(yōu)先”。從這些我們可以看出來ROS系統(tǒng)的發(fā)展趨勢,正在機(jī)器人行業(yè)一步一步的主導(dǎo)中國市場。
以下是一些ROS典型應(yīng)用場景:
1.機(jī)器人控制器中的大佬人物 - KEBA,他們的控制器已經(jīng)支持ROS。
2.美國NASA基于ROS開發(fā)的Robonaut 2已經(jīng)在國際空間站里干活了。
3.百度apollo無人車的底層是基于ROS開發(fā)的,差點(diǎn)改成了ROS 2,可以在github上找到(apollo-platform)。
4.ROS-I最近正準(zhǔn)備和微軟、寶馬合作,開發(fā)一套自動化解決方案(參考:A ROS-Industrial Collaboration with Microsoft and BMW)。
5.許多工業(yè)機(jī)械臂已經(jīng)開始使用ROS系統(tǒng),其中2017年底ROS-I官方發(fā)布的五周年視頻不乏四大家族中的機(jī)器人。下圖的庫卡youbot機(jī)器人就是采用ROS系統(tǒng)開發(fā)。
02 軟件安裝過程
此部分主要講Ubuntu18.04安裝ROS Melodic詳細(xì)過程(本文以Ubuntu18.04為例,其他同理,并不影響運(yùn)動控制器的運(yùn)用)。
1.設(shè)置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.設(shè)置key(公鑰已更新)
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
3.更新package(時間有點(diǎn)長,耐心等待)
$ sudo apt-get update
此時可能會遇到以下問題:
解決辦法如下,在終端輸入:
$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F42ED6FBAB17C654 $ sudo apt-get update
當(dāng)出現(xiàn)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文件,內(nèi)容如下;
②將:199.232.28.133 raw.githubusercontent.com添加在文件中,添加后的文件如下;
③然后保存文件后退出;
④在終端執(zhí)行:sudo rosdep init,問題解決。
6.測試ROS是否安裝成功
$ roscore
成功打開如下圖所示:
03ROS編程案例
這部分主要講“消息發(fā)布”和“訂閱”兩個ROS編程案例。
1.創(chuàng)建一個ROS工作空間。
$mkdir -p ~/catkin_ws/src $cd ~/catkin_ws/ $ catkin_make
2.創(chuàng)建ROS程序包(zmotion為程序包名,也可以定義為其他)。
$cd ~/catkin_ws/src $catkin_create_pkg zmotion std_msgs roscpp $cd ~/catkin_ws $ catkin_make
3.在創(chuàng)建完程序包后,每次運(yùn)行需要source ~ / catkin_ws / devel / setup.bash,否則無法找到文件。
解決每次都要source方法:
在終端輸入: $gedit ~/.bashrc 在文件末尾添加并保存: $ source ~/catkin_ws/devel/setup.bash
4.新建節(jié)點(diǎn)文件。
在zmotion包目錄中創(chuàng)建一個src目錄:
$cd ~/catkin_ws/src/zmotion //進(jìn)入zmotion程序包路徑下 $mkdir -p src //新建src文件夾,用來存放c++程序 $cd src/ //進(jìn)入src文件夾路徑下 $touch talker.cpp //新建發(fā)布消息節(jié)點(diǎn)cpp文件 $ touch listener.cpp //新建訂閱消息節(jié)點(diǎn)cpp文件
5.撰寫發(fā)布節(jié)點(diǎn)(talker.cpp)。
實(shí)現(xiàn)功能:
(1)初始化ROS系統(tǒng);
(2)在chatter topic上發(fā)布std_msgs/Float64消息;
(3)以每秒10次頻率發(fā)布消息。
#include "ros/ros.h" #include "std_msgs/Float64.h" #include int main(int argc, char **argv) { //初始化ROS,名稱重映射(唯一),必須為base name,不含/ ros::init(argc, argv, "talker"); //為進(jìn)程的節(jié)點(diǎn)創(chuàng)建一個句柄,第一個創(chuàng)建的NodeHandle初始化節(jié)點(diǎn) ros::NodeHandle n; //告訴主機(jī)要在chatter topic上發(fā)布一個std_msgs消息 //主機(jī)會訂閱所有chatter topic節(jié)點(diǎn),參數(shù)表示發(fā)布隊(duì)列的大小(先進(jìn)先出) ros::Publisher chatter_pub = n.advertise("chatter", 1000); ros::Rate loop_rate(10); //自循環(huán)頻率 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(); //休眠,來使發(fā)布頻率為10Hz loop_rate.sleep(); ++count; } return 0; }
6.撰寫訂閱節(jié)點(diǎn)(listener.cpp)。
實(shí)現(xiàn)功能:
(1)初始化ROS系統(tǒng);
(2)訂閱chatter topic消息;
(3)進(jìn)入自循環(huán),等待消息到達(dá);
(4)消息到達(dá),調(diào)用chatterCallback()函數(shù)。
#include "ros/ros.h" #include "std_msgs/Float64.h" //回調(diào)函數(shù) 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(); //自循環(huán) 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被調(diào)用。
generate_messages( DEPENDENCIES std_msgs )
(5)確保在運(yùn)行時依賴中也添加了該消息的依賴。
catkin_package( # INCLUDE_DIRS include # LIBRARIES beginner_tutorials # CATKIN_DEPENDS roscpp std_msgs # DEPENDS system_lib CATKIN_DEPENDS message_runtime )
(6)修改build下的設(shè)置
①將include_directories中include解注釋。
include_directories( include ${catkin_INCLUDE_DIRS} )
②在指定位置添加下列代碼下面的代碼可以任意添加在build中,我為了美觀所以添加在相應(yīng)位置的,只要在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均可,也可以都寫上 --?> message_generation/build_depend?> message_generation/build_export_depend?> !-- 執(zhí)行依賴,必須加上以下這句:--?> message_runtime/exec_depend?>
9.編譯。
$ cd ~/catkin_ws $ catkin_make
10.運(yùn)行程序。
(1)打開一個新終端,啟動ROS系統(tǒng);
$ roscore
(2)打開一個新終端,運(yùn)行發(fā)布節(jié)點(diǎn);
$ cd ~/catkin_ws //進(jìn)入工作控件目錄下 $ rosrun zmotion talker //運(yùn)行發(fā)布節(jié)點(diǎn)程序
(3)打開一個新終端,運(yùn)行訂閱節(jié)點(diǎn);
$ cd ~/catkin_ws $ rosrun zmotion listener
(4)結(jié)果。
運(yùn)行發(fā)布節(jié)點(diǎn)程序的結(jié)果:
[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
運(yùn)行訂閱節(jié)點(diǎn)程序的結(jié)果:
[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
本次,正運(yùn)動技術(shù)EtherCAT運(yùn)動控制器在ROS上的應(yīng)用(上),就分享到這里。
更多精彩內(nèi)容請關(guān)注“正運(yùn)動小助手”公眾號,需要相關(guān)開發(fā)環(huán)境與例程代碼,請咨詢正運(yùn)動技術(shù)銷售工程師。
本文由正運(yùn)動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運(yùn)動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。
審核編輯 黃宇
-
運(yùn)動控制器
+關(guān)注
關(guān)注
2文章
401瀏覽量
24703 -
ethercat
+關(guān)注
關(guān)注
18文章
686瀏覽量
38673 -
ROS
+關(guān)注
關(guān)注
1文章
278瀏覽量
17001
發(fā)布評論請先 登錄
相關(guān)推薦
評論