Realtime servoing 即实时伺服。
一、概念:
首先了解伺服的含义:
伺服系统,又称随动系统,是用来精确地跟随或复现某个过程的反馈控制系统。伺服系统使物体的位置、方位、状态等输出被控量能够跟随输入目标(或给定值)的任意变化。
机器人是一个机电一体化的设备,从控制的角度来说,机器人可分成四大部分即:执行机构、驱动系统、传感系统和控制系统。伺服属于执行机构。机器人通过伺服系统来执行操作。如实时视觉伺服系统就可以使用相机寻找物体,确定物体位姿,然后让机械臂移动到指定位置抓取目标。
二、背景:
realtime-servo演示内容是展示伺服节点对奇点处理和碰撞检查,防止操作员破坏机器人
机械臂的实时伺服目前支持Noetic和foxy版。二者都是属于跟随联动伺服。在rviz 上启动第一个仿真机械臂,第二个在gazebo上启动。当你操作Rviz上的机械臂时,gazebo上机械臂会跟随作相同的移动。
三、 Noetic中Realtime Arm Servoing 演示:
首先,需要安装ros noetic。安装教程:noetic/Installation/Ubuntu - ROS Wikihttp://wiki.ros.org/noetic/Installation/Ubuntu
其次,安装和下载Movit源码。教程:Getting Started — moveit_tutorials Noetic documentationhttps://ros-planning.github.io/moveit_tutorials/doc/getting_started/getting_started.html
问题1:在执行语句:git clone https://github.com/ros-planning/panda_moveit_config.git -b melodic-devel遇到目标已存在,且不为空时。直接在文件中删除那个文件即可。或者跳过这一步。据我检查。两个目标的内容一模一样。
问题2:如果执行完语句:catkin config --extend /opt/ros/${ROS_DISTRO} --cmake-args -DCMAKE_BUILD_TYPE=Release。后结果和下图不一致,显示出红色的MISSING,那么你需要重头再来一遍教程。
上面已经完成了工作空间和Movit源码的下载。
下面开始详细的教程演示:
1、复制源码:
cd ws_movit/src
git clone -b melodic-devel https://github.com/ros-industrial/universal_robot
安装依赖:
rosdep install -y --from-paths . --ignore-src --rosdistro $ROS_DISTRO
编译:
source devel/setup.bash
catkin build
打开四个终端,执行
source devel/setup.bash
启动机械臂:
roslaunch ur_gazebo ur5.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
在启动的Rviz中移动机械臂A到某一位置之后,点击plan按钮,会有演示的机械臂B移动到机械臂A的位置与之重合。但这是虚拟的,只是演示以下跟随移动的场景。接着点击Plan&&exec后,就会让这种演示执行,并让Gazebo中的机械臂C跟随Riz中的机械臂B进行移动。设置伺服命令:(100为100HZ,是以100HZ的速率发送新的命令。
rostopic pub -r 100 -s /servo_server/delta_twist_cmds geometry_msgs/TwistStamped "header: auto twist: linear: x: 0.0 y: 0.01 z: -0.01 angular: x: 0.0 y: 0.0 z: 0.0"
这是通过终端命令。向机械臂发送目标位置。
四:代码分析:
之前我们复制的代码包语句为:
git clone -b melodic-devel https://github.com/ros-industrial/universal_robot
所以,我们针对universal_robot包即可‘
主要的launch文件:
Gazebo文件:ur_gazebo ur5.launch
<?xml version="1.0"?>
<launch>
<arg name="limited" default="false" doc="If true, limits joint range [-PI, PI] on all joints." />
<arg name="paused" default="false" doc="Starts gazebo in paused mode" />
<arg name="gui" default="true" doc="Starts gazebo gui" />
<!-- startup simulated world -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" default="worlds/empty.world"/>
<arg name="paused" value="$(arg paused)"/>
<arg name="gui" value="$(arg gui)"/>
</include>
<!-- send robot urdf to param server -->
<include file="$(find ur_description)/launch/ur5_upload.launch">
<arg name="limited" value="$(arg limited)"/>
</include>
<!-- push robot_description to factory and spawn robot in gazebo -->
<node name="spawn_gazebo_model" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model robot -z 0.1" respawn="false" output="screen" />
<include file="$(find ur_gazebo)/launch/controller_utils.launch"/>
<!-- start this controller -->
<rosparam file="$(find ur_gazebo)/controller/arm_controller_ur5.yaml" command="load"/>
<node name="arm_controller_spawner" pkg="controller_manager" type="controller_manager" args="spawn arm_controller" respawn="false" output="screen"/>
<!-- load other controllers -->
<node name="ros_control_controller_manager" pkg="controller_manager" type="controller_manager" respawn="false" output="screen" args="load joint_group_position_controller" />
</launch>
可以看到,lanuch文件启动了三个节点。分别是spawn_gazebo_model、arm_controller_spawner、ros_control_controller_manager。
ur5_moveit_config ur5_moveit_planning_execution.launch
moveit2的实时伺服在碰撞检测做得比moveit要好。
在moveit中,机械臂会检测到前方物体并根据规划的路径检测碰撞,若可能碰撞,则降低速度直至为零。
Rviz中的文件:ur5_moveit_config moveit_rviz.launch
rostopic pub -r 100 -s /servo_server/delta_twist_cmds geometry_msgs/TwistStamped "header: auto
twist:
linear:
x: 0.0
y: 0.01
z: -0.01
angular:
x: 0.0
y: 0.0
z: 0.0"rostopic pub -r 100 -s /serrostopic pub -r 100 -s /servo_server/delta_twist_cmds geometry_msgs/TwistStamped "header: auto
twist:
linear:
x: 0.0
y: 0.01
z: -0.01
angular:
x: 0.0
y: 0.0
z: 0.0"vo_server/delta_twist_cmds geometry_msgs/TwistStamped "header: auto
twist:
linear:
x: 0.0
y: 0.01
z: -0.01
angular:
x: 0.0
y: 0.0
z: 0.0"
Rviz中启动了一个节点:$(anon rviz)????
五、foxy的实时伺服演示:
第一步:首先你要安装ros2对应的ros版本Foxy。推荐不要乱来。我之前用的是官网教程,安装完很多错误。下面安装教程借鉴鱼香ros的教程。附上链接:鱼香Ros
安装完之后,无错就可以跳过了。
如果有错,请继续,这里列举以下我遇到的错误:
错误1、bash设置出错,因为我之前先装的noetic,所以与后装的Bash冲突了:
解决:进入root:使用指令:
sudo su
输入密码即可。然后进入ros安装目录。如果你不知道安装在哪的话,使用命令:
printenv | grep -i ROS
一般在opt目录下。找到noetic目录,使用命令即可:
rm -r noetic
错误二:
第二步:官方教程链接:moveit2-foxy
事实上,官网教程虐我千万遍,我待官网教程如初恋。直接说我遇到的问题:
问题一:rosdep update
怎么解决的????我忘了。下次遇到补上!!!!
问题二:执行命令:vcs import < moveit2_tutorials/moveit2_tutorials.repos时,无法识vcs关键字,因为没有装python3-vcstool,执行sudo apt install python3-vcstool;
第二个:执行完这句,失败。没有下载到,我使用的命令是:
git clone https://ghproxy.com/https://github.com/PickNikRobotics/rviz_visual_tools -b foxy-devel src/rviz_visual_tools/
问题三;rviz_visual_tools这个包无法被colcon build编译,试着去依次解决bug,后面的错误就直接说错误,也不提示错误在哪!!!
解决方法:待定
演示:按照教程无错的运行出来后的界面如下,启动终端键盘输入控制,如图和视频
四、总结
在noetic中,Gazebo中的地面是具备物理材质的,即实体。在Rviz中规划完的路径之后,如果有从地面下方转的路径,则会出错。
在foxy中,明显体现体现出moveit2的实时伺服在碰撞检测做得比moveit要好。
在moveit2中,机械臂会检测到前方物体并根据规划的路径检测碰撞,若可能碰撞,则降低速度直至为零。
最后,对其中的原理以及节点的通信,还在探索。