ROS从安装到机械臂的仿真与实验
ROS 从安装到机械臂的仿真与实验
前⾔
刚刚结束在沈阳⾃动化研究所的实习,实习内容是实现机械臂的轨迹规划和仿真,使⽤的机械臂有UR5和Panda。沈⾃所的机器⼈实⼒确实很强,忙活了⼀个假期也只是学到了⼀点⽪⽑。这篇博客也算是⼀个实习的记录,将我在学习ROS过程中学到的知识和遇到的坑都记录下来,也希望能为其他还在ROS⾥挣扎的同学们提供⼀些帮助。鄙⼈不才,这篇博客顶多算是抛砖引⽟。
本⽂将详细的介绍ROS,从安装到仿真再到实验。因为内容较多,可能⼀次⽆法写完,会持续补充。
1. Ubuntu+ROS系统的搭建
现在ROS可以同时运⾏在Windows环境和Linux环境下,但是Linux环境下还是相对稳定⼀些,⽽且也更适合于程序员开发。安装Linux操作环境可以选择⽤虚拟机或者直接双系统(如果想要与真实的机械臂相连,不能使⽤虚拟机,如果⼀定要使⽤虚拟机需要打上实时补丁),在这⾥我选择⽤虚拟机来做轨迹规划仿真,⽤另⼀台装有Linux系统的电脑来做后⾯的真机实验。VMware是市⾯上⽬前⽐较主流的虚拟机⼯作平台,在这⾥我们使⽤它创建虚拟机。Ubuntu 16.04是⽬前和ROS Kinetic版本兼容度最⾼的,鉴于
我们之后会使⽤ROS Kinetic版本(因为这是⽐较稳定⽽且较新的版本),我们在虚拟机中安装Ubuntu 16.04版本。
a) 在VMware虚拟机中安装Ubuntu 16.04;
1. 下载并安装VMware v1
2.1.0,下载Ubuntu 16.04镜像⽂件
2.
3. 再安装好虚拟机和Ubuntu 16.04之后,我们重启虚拟机,往往会出现屏幕尺⼨太⼩的情况。有以下两种⽅法可以解决:
1. 第⼀种⽅法,在终端输⼊xrandr,并执⾏,输⼊我们需要设置的分辨率,xrandr -s 1920x1440,然后执⾏。
2. 第⼆种⽅法,直接打开虚拟机的设置,更改屏幕分辨率再应⽤
b) 在Ubuntu16.04LTS 中安装ROS(版本Kinetic):
1.
2. 再输⼊命令:sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers:80 --recv-key 0xB01FA116
3. 开始正式的安装,安装豪华⾄尊版ROS:sudo apt-get update
4. 前⼏步⼀般不会有太⼤问题,安装完成后可以查看使⽤的包:apt-cache search ros-kinetic
5. 到此,还没有结束,需要初始化:sudo rosdep init
6. rosdep update(这⼀命令会把所有相关的依赖项都升级到最新版)
(如果出现⽆法运⾏rosdep的情况,⽤rospack find rosdep检查rospack是否安装,⽤sudo apt install rospack-tools命令安装,但要注意的是,出现这种情况很有可能第2步执⾏安装命令出错,应该重新执⾏第2步)
7. 配置环境变量:echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
(注意:kinetic的k是⼩写,如果出现“没有到⽂件”的错误,可以通过gedit .bashrc来查看最后⼀⾏的source⽂件是否是⼩写k,这⾥⾮常坑,很多教程都写错了)
8. source ~/.bashrc
9. 此时,就完成了安装,可以测试⼀下:在命令⾏终端中输⼊roscore并运⾏。
此时如果出现:
那么恭喜你,ROS成功安装上了
10. 我们可以跑⼀个测试程序—⼩海龟。先安装⽰例 :sudo apt-get install ros-kinetic-turtlesim (16.04版本可能不⽤这⼀步也能直接
跑)
然后,在三个不同的终端分别执⾏以下三个指令:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
然后你就会看到经典的⼩乌龟窗⼝:
angular安装
试试⽤上下左右建来控制⼩乌龟吧~
11. 在正式使⽤ROS进⾏开发之前,我推荐⼤家⼏个插件,会在后⾯的开发时给⼤家节省⼤量的时间。
a). sudo apt install terminator(这是⼀个⾮常好⽤的终端插件,可以随意的分屏,鉴于我们平时使⽤ROS经常需要终端多开,可以随意
分割窗⼝还是⾮常⽅便的)
b). sudo apt install python-pip (使⽤Python语⾔脚本进⾏开发的话,⼀定会⽤到的插件)
c). sudo pip install ipython (可以实现对仿真进⾏同步debug,因为有的时候程序本⾝没有错,但是结合仿真就会跑飞)
d). sudo apt install meld (⼀个⽂本⽐较⼯具,当你修改过某个⽂件夹下的多个⽂件,但是⼜想不起来修改过哪些时,会派上⽤场)
2. ROS⼯作原理与Node通讯机制:
在教⼤家如何使⽤ROS控制机械臂之前,我们先来了解⼀下ROS的基本知识:
a) ⾸先,什么是ROS:
ROS(Robot Operating System)是⼀个开源平台,集成了各种各样的服务,包括视觉识别,轨迹规
划,模型仿真等很多强⼤的开发功能。
b) ROS通过Package来管理所需的⽂件,通常⼀个ROS Package包含以下⽂件或⽂件夹:
1. Launch⽂件夹:包含所有launch⽂件
2. Src⽂件夹:包含所有的cpp⽂件和python⽂件
3. :包含所有需要执⾏的cmake配置
4. l: 包含所有package信息和依赖项
c) ROS nodes(节点)
nodes是ROS⾥的⼀个基础程序,它是⼀个可执⾏⽂件,通过ROS与其他的nodes进⾏通讯。Nodes可以向topic发布或提取信息,可以提供或使⽤⼀个Service。
这⾥有个⼩技巧,我们⾃⼰创建node的时候,可以通过rosnode list来查看当前有哪些nodes在运⾏,如果我们创建的node不在列表⾥,那么说明我们的node可能没有运⾏起来,需要重新source⼀下。
d) ROS message
message是node在向topic发布或提取信息时的⼀种消息格式
可以使⽤rosmsg show 来查看某⼀种特定message的格式,因为message通常都是⾃定义的⼀种格式或已经定义好的⼀种格式,类似于C语⾔中的结构体,通常包含多个不同类型的变量。
e) 三种实现nodes间通信的⽅法
1. Ros topic:message通过publisher和subscriber来传递于多个nodes之间,⽽topic类似于⼀个公告板,所有的nodes可以通过
topic实现相互通信。⼀个topic可能会有很多publisher和subscriber,⽽⼀个node也可能会从多个topic上发布或获取message。
Topic是⽤来表⽰message内容的名称。
⽐如:
左边的teleop_turtle和右边的turtlesim是两个ROS nodes,他们通过中间的topic“/turtle1/command_vel
ocity”进⾏通讯。两个node是⽆法直接进⾏通讯的,通过发布器node发布message给topic,接收器再从topic上获取有⽤的信息,所以这种通讯通常不是同步的。
2. ROS service: service 是另⼀种可以实现nodes之间相互通信的⽅式。于topic的⽅法不同在于,topic使⽤publisher和subscriber
这种⾮常灵活的传递信息⽅式,但这种多对多,单向的灵活传递信息的⽅式,并不适⽤于分布式系统⾥需要答复请求的场景。所以衍⽣出了service的通信⽅式, service由⼀对message定义:⼀个⽤于请求,⼀个⽤于回复。当⼀个ROS node提供service通信时,客户端会发送⼀个请求给这个node,并停⽌动作等待回复。
3. ROS action: Action 是第三种可以实现nodes之间相互通信的⽅式。Action和Service的区别在于,Service是同步的,当⼀个ROS
程序调⽤⼀个service的时候,程序会停⽌当前的运⾏直到收到service的答复。⽽Action是不同步的,这就像启动⼀个新线程。当ROS程序调⽤action时,ROS程序可以在当前线程中等待action的答复,但在另⼀个线程中执⾏其他任务。
f) 什么是launch⽂件
还记得我们最开始时运⾏的⼩乌龟实例程序么?让我们来看看它的launch⽂件。
<launch>
<!-- turtlebot_teleop_key already has its own built in velocity smoother -->
<node pkg="turtlebot_teleop" type="turtlebot_teleop_key" name="turtlebot_teleop_keyboard"  output="screen">
<param name="scale_linear" value="0.5" type="double"/>
<param name="scale_angular" value="1.5" type="double"/>
<remap from="turtlebot_teleop_keyboard/cmd_vel" to="cmd_vel_mux/input/teleop"/>
</node>
</launch>
这⾥⾯node那⼀⾏是最重要的,我们先忽略其他的。
node那⼀⾏包含四个重要信息:
1. pkg=“package_name” # Name of the package that contains the code of the ROS program to execute
2. type=“cpp_executable_name” # Name of the cpp executable file that we want to execute
3. name=“node_name” # Name of the ROS node that will launch our C++ file
4. output=“type_of_output” # Through which channel you will print the output of the program
后⾯我们会详细介绍如何创建launch⽂件。
g)如何获取topic和message的信息
在ROS⾥,可以⽤rostopic list命令来获取所有可⽤的topic,同时也可以⽤rostopic echo <topic_name>命令来查看对应topic正在发布的消息,rostopic echo <topic_name> -n1可以获取对应topic发布的最后⼀条消息。
使⽤rostopic info <topic_name>命令可以查看对应topic的信息
如果想获得某⼀种message的信息,可以使⽤rosmsg show <message>命令,⽐如:rosmsg show std_msgs/Int32
这⾥的Int32是type,不过⽤法有点⼉像struct
通过rostopic info <topic_name>可以知道你编写的Python⽂件需要发布什么类型的数据来控制机械臂,再⽤rosmsg show <message>来确定variable的名称
rostopic pub <topic_name> <message_type> <value>,这个命令可以⽤来⽴即发布⼀些你想要发布的指令,⽤来测试subscriber是否在正常运⾏,例如:rostopic pub /counter std_msgs/Int32 7 , 这个命令可以让counter向screen持续发送数字‘7’
重要总结:在使⽤ROS控制仿真时,如果能对应的topic的名字,可以使⽤rostopic info <topic_name>命令来查看对应的msg的格式,然后再通过rosmsg show <message>命令来获取对应msg的组成部分,可以很容易的到我们需要的数据组成,因为msg就像是⼀个结构体,⽽我们通常只需要结构体中的⼀⼩部分数据。在到对应数据的调⽤格式之后,我们可以⽤rostopic echo <topic_name>命令来直观的看到对应topic的数据返回值的样⼦,这样有助于编写Python代码。当写完Python代码之后,就可以写launch⽂件和CMakelist⽂件了,这样⼀个完整的ROS包就算是初步组装完成可以运⾏啦~
3. 创建workspace(⼯作区)
ROS对机械臂的所有操作都是在⼀个⼯作区内实现的,所以我们先创建⼯作区。
1.  mkdir -p ~/XXX_ws/src  (这⾥的‘XXX’可以起⾃⼰喜欢的名字)
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
(有的教程⾥还有下⾯这句,但是我⾃⼰测试发现好像没什么⽤,⼤家要是有什么发现请告诉我)
echo $ROS_PACKAGE_PATH /home/youruser/catkin_ws/src:/opt/ros/kinetic/share (此处的"youruser"请修改为⾃⼰的⽤户名,也就是创建虚拟机时的那个)
4.创建⼀个ROS Package
1. cd ~/catkin_ws/src  (打开我们刚刚创建的⼯作区)
catkin_create_pkg <;包的名字><;包的依赖包>  (包的名字随便起,如果是⽤CPP编程,依赖包就写roscpp,如果是Python编程,就是rospy)
2. 我⽤的是Python,所以下⾯我们按Python来建包:
catkin_create_pkg my_package rospy
3. 可以⽤rospack list | grep my_package,或roscd my_package来确认是否成功创建包。
注意:此处的my_package是刚刚创建的ROS包的名字,不到的话⽤命令⾏:
source /home/muyang/Muyang_ws/devel/setup.bash
或者使⽤
sudo gedit ~/.bashrc
在最后⼀⾏添加
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/你的⼯作空间路径/src
注意:重启terminal⽣效
4. 下⼀步,回到catkin_ws ⽂件夹下,运⾏catkin_make
注意:当workspace下包含多个package时,可以⽤catkin_make --only-pkg-with-deps 你的ROS包对刚刚创建的‘‘你的ROS包’’进⾏catkin_make,有⼀个特殊的语句catkin_make -DCATKIN_WHITELIST_PACKAGES=“你的ROS包”,和前⾯的命令⾏⼀样,都是只运⾏指定的package
5. MoveIT控制机械臂:
1. 建⽴机械臂仿真模型:
a) 第⼀步建⽴⼯作区,⽣成⽂件夹,mkdir -p ~/Muyang_ws/src,这⾥我把⾃⼰的⼯作区起名为“Muyang_ws”
b) cd ~/ Muyang _ws/,打开刚刚⽣成的⽂件夹
c) catkin_make,这步很关键,是在⽣成相关的配置⽂件,包括等
d) source devel/setup.bash,通过这个命令,我们就可以在ros中调⽤这个⼯作区下的⽂件了。
e) 第⼀步:使⽤sudo apt-get install ros-kinetic-moveit命令安装moveit,moveit是我们建⽴仿真模型的软件
f) 在第⼀步的基础上,我们使⽤sudo apt-get install ros-kinetic-franka-description命令安装panda机械臂的urdf
g) 通过roslaunch moveit_setup_assistant setup_assistant.launch命令,启动MoveIt! Setup Assistant,会出现下⾯这样的窗⼝:
h) 我们选择Create New MoveIt! Configuration Package,在弹出的页⾯中点browse,选择路
径/opt/ros/kinetic/share/franka_description/robots/panda_arm_hand.urdf.xacro ,确认后点load会出现下⾯这样的窗⼝:
i) 下⼀步,配置self-collision,直接选择默认的95%,点击Generate Collision Matrix:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。