The value of Zmotion is to bring customers more success!
今天,正运动技术为大家分享一下《运动控制卡在ROS上的应用(上)》。
本文从ROS应用背景讲起,再讲Ubuntu18.04安装ROS Melodic详细过程,最后通过ROS编程案例——消息发布和订阅,来详细说明正运动技术运动控制卡ROS的应用开发。
在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2618和ECI2828。这两款产品分别是6轴,8轴运动控制卡。
ECI2618支持6轴脉冲输入与编码器反馈,板载24点输入,16点输出,2AD,2DA,支持手轮接口,其中特定输出口支持高速PWM控制。
ECI2828支持8轴总线型输入与编码器反馈,板载24点输入,16点输出,2路AD,2路DA,支持手轮接口,其中特定输出口支持高速PWM控制。
ECI2618,ECI2828均使用同一套API函数,均支持C、C++、C#、LabVIEW、Python、Delphi等开发语言,支持VC6.0、VB6.0、Qt、.Net等平台,支持Windows、Linux、WinCE、iMac等操作系统。
一 ROS应用背景
ROS(robot operating system)是用于机器人的一种开源后操作系统(次级操作系统)。首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由ROS的基础工具实现。
简单来说,ROS作为一个灵活的操作系统,系统上的节点具有很大的随意性,它们可以位于不同的计算机上,甚至可以位于不同的网络上。我们可以使用一个Arduino作为一个节点发布信息,使用一台笔记本电脑作为一个节点订阅上述信息以及使用一台手机作为一个节点驱动电机等。上述灵活性使得ROS可以适应很多不同场合的应用。
1.ROS的主要特点可以归纳为以下几条
(1)分布式点对点设计
ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。
(2)多语言支持
ROS支持许多种不同的语言,例如C++、Python、Octave和LISP,也包含其他语言的多种接口实现。
(3)精简与集成
ROS建立的系统具有模块化的特点,各模块中的代码可以单独编译,而且编译使用的CMake工具使它很容易的就实现精简的理念。ROS基本将复杂的代码封装在库里,只是创建了一些小的应用程序为ROS显示库的功能,就允许了对简单的代码超越原型进行移植和重新使用。
(4)工具包丰富
为了管理复杂的ROS软件框架,我们利用了大量的小工具去编译和运行多种多样的ROS组建,从而设计成了内核,而不是构建一个庞大的开发和运行环境。
(5)免费并且开源
ROS所有的源代码都是公开发布的。
2.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系统开发:
二 软件安装过程
此部分主要讲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
成功打开如下图所示:
三 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)
#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)
#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
参考文献:
1.ROS Wiki:http://wiki.ros.org/
2.https://www.ncnynl.com/archives/201609/838.html
3.https://blog.csdn.net/qq_42145185/article/details/80413380?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
4.https://www.zhihu.com/question/29025926?sort=created
本次,正运动技术的《运动控制卡在ROS上的应用(上)》就分享到这里,更多精彩内容请关注“正运动小助手”公众号。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。