DEV Community

Cover image for How to Develop EtherCAT Motion Controller on ROS (2)
ZMOTION CONTROLLER
ZMOTION CONTROLLER

Posted on

How to Develop EtherCAT Motion Controller on ROS (2)

In last article, we have known ROS background, how to install ROS Melodic by Ubuntu18.04, and two ROS programming examples. Please visit “How to Develop EtherCAT Motion Controller on ROS (1)” for details.

Then, today, the second part is coming, that is, how to configure Zmotion dynamic library environment, and how one single-axis of EtherCAT motion controller on ROS is.

Still, the hardware takes ZMC432-V2 & ZMC408CE. They can be used in offline or online occasions.

For development, both use one same set of API function, C, C++, C#, LabVIEW, Python, Delphi all can be used, and mainstream platforms and operation systems all are valid, which means it is easy and convenient to develop.

Image description

1. Configure Zmotion Dynamic Link Library Environment

(1) Add Dynamic Link Library

New build folder "lib" under "content" -- zmotion(catkin_ws/src/zmotion/) of program package, and save dynamic link library "libzmotion.so".

Image description

Image description

A. add the third party path (under build) in CMakeLists.txt

link_directories(
lib
${catkin_LIB_DIRS}
)
Enter fullscreen mode Exit fullscreen mode

B. also, link dynamic link library in CMakeLists,txt file(when calling the link libaray, remember to remove lib and .so)
target_link_libraries(talker ${catkin_LIBRARIES} zmotion)

(2) Add Library Function “zmcaux.cpp”, “zmotion.h”, “zmcaux.h”

A. add zmcaux.cpp file into "catkin_ws/src/zmotion/src"

Image description

B. add head file "zmotion.h and zmcaux.h" into "catkin_ws/src/zmotion/include/ zmotion"

Image description

C. and add these three library files in CMakeLists.txt:

add_executable(talker
src/talker.cpp
src/zmcaux.cpp
include/zmotion/zmotion.h
include/zmotion/zmcaux.h
)
Enter fullscreen mode Exit fullscreen mode

D. modify head file's quote, like below image (need to fill corresponding address of "include" file, zmotion is the name of program package)

#include "zmotion/zmotion.h"
#include "zmotion/zmcaux.h"
Enter fullscreen mode Exit fullscreen mode

Image description

2. Zmotion Controller Single-Axis Motion by ROS

“talker” node achieves axis 0 motion, and real time sends the position to “listener” node, then modifies "talker.cpp":

(1) Add Handle & Head File

#include "zmotion/zmotion.h"
#include "zmotion/zmcaux.h"
ZMC_HANDLE g_handle=NULL;
Enter fullscreen mode Exit fullscreen mode

(2) Connect to Motion Controller Through EtherNET

ZMC_LinuxLibInit();
//EtherNET (Ethernet) to link
char ipaddr[16] = {"192.168.0.11"};
int x =ZAux_OpenEth(ipaddr,&g_handle); //***ZMC
ROS_INFO("connect to controller through Ethernet:%d",x);//Return 0 -- success
Enter fullscreen mode Exit fullscreen mode

(3) Single-Axis Motion

ZAux_Direct_SetSpeed(g_handle, 0, 200); //set axis 0 motion speed as 200units/s
ZAux_Direct_SetAccel(g_handle, 0, 2000); //set axis 0 acceleration as 2000units/s/s
ZAux_Direct_SetDecel(g_handle, 0, 2000); //set axis 0 deceleration as 2000units/s/s
ZAux_Direct_SetSramp(g_handle, 0, 100); //set axis 0 S curve time as 100ms
ZAux_Direct_Single_Move(g_handle, 0, 300); //axis 0 moves 100 units that relates to current position
Enter fullscreen mode Exit fullscreen mode

(4) Send Real-Time Position to “listener” Node

float piValue;
while (ros::ok())
{
    std_msgs::Float64 msg;
    ZAux_Direct_GetMpos(g_handle, 0, & piValue);//read time
    msg.data = piValue;
    //output, used to replace prinf/cout
    ROS_INFO("Position is: %f", msg.data);
    chatter_pub.publish(msg);
    ros::spinOnce();
    //sleep, make publishment frequency as 10Hz
    loop_rate.sleep();
}
Enter fullscreen mode Exit fullscreen mode

(5) Compile

cd ~/catkin_ws/
catkin_make
Enter fullscreen mode Exit fullscreen mode

(6) Run the Program

//open one new end station
roscore
//open another new end station
cd ~/catkin_ws/
rosrun zmotion talker
//open another new end station
cd ~/catkin_ws/
rosrun zmotion listener
Enter fullscreen mode Exit fullscreen mode

Following is the running effect, real-time output position:

Image description

In addition, it can be seen that axis 0 is running S curve motion from the oscilloscope.

Image description

That's all, thank you for your reading -- How to Develop EtherCAT Motion Controller on ROS (2)

Have a good day, best wishes, see you next time.

Top comments (0)