至于为什么叫框架,一是因为灵巧手的3维模型没有按照基本的设计要求画,正常来说,设计机器人机构之前应该设计好机构需要多少个自由度/DOF,每个自由度是旋转/revolute类型还是滑移/prismatic类型,各个关节的自由度限位/limits,各个连杆的长度/a,每个自由度之间的扭角/α,偏移/d,整个机器人的工作空间/workspace等等;二是当前搭建的框架能实现的function和控制很基础,灵巧手其实是一个多机器人协同的系统,需要在MoveIt!的代码上进行更改,至少抓取矩阵这种概念在MoveIt!上是没有的,还有很多地方需要修改。
 
总的来说,当前的框架不够deep,但基本的模样已经有了。
 
该博客同时将帮助更加顺利的完成以下工作,希望能对各位有所帮助,源码链接见文末:
  • 单纯的通过ROS控制Gazebo中的机器人模型
  • 通过MoveIt!直接控制现实中的机器人
  • MoveIt!与Gazebo联合仿真

博客目录:
  1. 使用Solidworks设计灵巧手,通过sw2urdf插件生成ROS包
  2. 机器人MoveIt!配置文件生成
  3. URDF适配Gazebo的简单修改
  4. ROS节点控制Gazebo中机器人模型
  5. Moveit!控制现实中的机器人
  6. MoveIt!与Gazebo联合仿真

Ⅰ. 使用Solidworks设计灵巧手,通过sw2urdf插件生成ROS包
 
用Solidwork设计,一是这样相对于自己搭URDF更专业,二是有插件支持,方便生成URDF。
几个需要注意的点:
  • 每个link都单独放入总装配体中,最好不要用子装配体
  • 设计好装配体后,使用sw2urdf插件定义各个关节连杆的从属关系,在这之前,使用D-H方法自己画出各个轴和坐标系,不要自动生成,这样生成的URDF99%会错位。另外旋转轴的类型对于机械臂这种机器人一般选择revolute,移动的小车这种机器人就选择continous,以上两者的区别在于如果选择前者会在URDF文件中定义关节限位,固定的关节选择fixed。
  • 如果你的机器人底座是固定的,那么你最好把base_link整体z坐标大于0,不然到时放到Gazebo的时候会与地面干涉,造成不必要的麻烦。
Ⅱ. 机器人MoveIt!配置文件生成
 
现在从Windows转到Ubuntu,将前面生成的URDF包放在工作空间, 前提是已经装好了MoveIt!,建议使用源码安装,方便阅读和修改源码.
打开MoveIt_Setup_assitants,参照官方文档设置
roslaunch moveit_setup_assistant setup_assistant.launch
加载URDF文件,按照顺序一一设置即可,后面要修改也再次可以加载MoveIt!配置文件修改.其中有几个要注意的地方:
  • 干涉检测那一部分自动生成后转到矩阵表示,检查是否符合自己的要求
  • virtual_joint的目的一般是为了将base_link和world坐标系相固连,在后面修改URDF的部分中为适配Gazebo已经添加了base_link和world的虚拟关节,所以在这里不再需要添加,各位自行决定.
  • planning_group按照每个手指分组.
  • Robot_Pose这一部分可以检测你的机器人关节的限位,如果动不了,一般是URDF中关节硬限位和软限位没有设置好.
  • ROS_Control这块根据具体的控制器类型选择,先按组自动添加,然后再修改控制器类型,如果和Gazebo联合仿真的话,选择position_controllers/JointTrajectoryController这一类型,原因是由MoveIt!和仿真环境或实际机器人的通信方式所决定,具体可在MoveIt!官网介绍.当然以上两者联合仿真的话也不一定就要position_controllers/JointTrajectoryController这种控制器,你也可以选择其它控制器,然后将MoveIt!的client发出的action消息写个Server端进行解析,然后用过ROS_Control进行Gazebo控制.
move_group talks to the controllers on the robot using the FollowJointTrajectoryAction interface. This is a ROS action interface. A server on the robot needs to service this action - this server is not provided by move_group itself. move_group will only instantiate a client to talk to this controller action server on your robot.
  • Simulation这部分生成适配Gazebo的URDF文件,在原来基础上添加了传动/Transmission和连杆惯量以及gazebo_ros_control插件,这样才能真实的模拟真实物理环境,把这个URDF文件作为后面用的机器人描述文件.
Ⅲ. URDF适配Gazebo的简单修改
  • 添加一个virtual_link用以连接base_link和world,类型为固定.
  • 设置好关节的软硬限位和旋转方向.
  • 检查惯性等属性是否正确,gazebo_ros_control可以设置你的机器人的命名空间,注意这个命名需要和之后的controller.yaml文件和MoveIt!配置生成的ros_control.launch中的命名空间一致,不然到时候节点会找不到另一个命名空间的控制器.
Ⅳ. ROS节点控制Gazebo中机器人模型
要实现ROS节点控制Gazebo中机器人模型只需要运行gazebo.launch和一个自定义的关节角发布节点.
MoveIt!配置生成的ROBOT_moveit_config包中含有诸多launch文件和config文件,建议都看看以了解其原理.
gazebo.launch负责加载Gazebo中的空世界模型和机器人URDF模型,以及controller_manager,运行该文件会加载/config/ros_controllers.yaml中的参数到ROS的参数服务器,ros_controllers.yaml是较为关键的一环,格式不对会导致运行出错.比如我之前配置MoveIt!的时候,如果选择控制器类型为position_controllers/JointPositionController,可以这样写(部分代码):
 
mutifingerhand:
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50 J11_controller:
type: position_controllers/JointPositionController
joint: J11
pid: {p: 100.0, i: 0.01, d: 1}
J12_controller:
type: position_controllers/JointPositionController
joint: J12
pid: {p: 100.0, i: 0.01, d: 1}


以上的控制器名就是之前在MoveIt!中配置的名字,也和ros_control.launch中的控制器名一致,注意我这里的命名空间是mutifingerhand,所以在ros_control.launch和URDF中的命名空间也当是如此.
接下来就是写一个发布各关节控制的消息发布节点,根据Gazebo的官方示例,消息类型为std_msgs::Float64,话题名为/mutifingerhand/J11_controller/command,参照这样的格式写即可.
 
 
Ⅴ. Moveit!控制现实中的机器人
 
要实现ROS节点控制控制现实中的机器人只需要运行demo.launch和一个自定义的基于moveit的规划节点.
 
 
demo.launch加载机器人RVIZ配置文件和move_group等节点,其中在下面代码中有个fake_execution决定了控制实际机器人或者仿真,还是直接进行fake_control,在这里把它改为false.
  <include file="$(find mutifingerhand_moveit_config)/launch/move_group.launch">
<arg name="allow_trajectory_execution" value="true"/>
<arg name="fake_execution" value="true"/>
<arg name="info" value="true"/>
<arg name="debug" value="$(arg debug)"/>
<arg name="pipeline" value="$(arg pipeline)"/>
</include>


另外,上文中讲到了MoveIt!通讯的机制,MoveIt!作为client需要一个机器人端的Server与其对应,同时ros_controllers.yaml控制器类型需要修改成position_controllers/JointTrajectoryController,注意这些都要写在controller_list下,具体结构参考下面的代码:
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
controller_list:
- name: finger1_controller
action_ns: follow_joint_trajectory
type: FollowJointTrajectory
default: true
joints:
- J11
- J12
- J13
- J14
- J15


和前面Gazebo端的ros_controller.yaml有点类似,但是不同.大部分博文中这两个yaml文件被分成了两个,但其实放在同一个文件里也可以,各取所需,反正都是要加载到ROS参数服务器的.
Server端如何写,我这里有个参考,完整代码移步文末的Github链接.
#include <ros/ros.h>
#include "actionlib/server/action_server.h"
#include "actionlib/server/server_goal_handle.h"
#include <control_msgs/FollowJointTrajectoryAction.h> class ControllerServerAction
{
protected: ros::NodeHandle nh_; actionlib::ActionServer<control_msgs::FollowJointTrajectoryAction> action_server;
actionlib::ServerGoalHandle<control_msgs::FollowJointTrajectoryAction> goal_handle_; control_msgs::FollowJointTrajectoryResult result_; public: ControllerServerAction(std::string name) :
action_server(nh_, name, boost::bind(&ControllerServerAction::pubGoalJoints, this, _1), false)
{
action_server.start();


至于自定义的基于moveit的规划节点,参照MoveIt!官方教程写就行,记得加上代码:
// Moving to a pose goal
/* Uncomment below line when working with a real robot */

move_group.move();
这是让机器人发送规划的轨迹的关键一步.
 
Ⅵ. MoveIt!与Gazebo联合仿真
 
关键在于ros_controller.yaml的配置,Gazebo端和MoveIt!端的controller.yaml文件可以放在一个文件,两者的格式分别就是上文中第四第五节中讲到的格式,运行demo_gazebo.launch文件同时加载Gazebo和MoveIt!,不需要写Server了,Gazebo这端默认作为了Server端.要控制的话写一个上文中第五节一样的节点就行.
控制器类型得是position_controllers/JointTrajectoryController.
如图我这里是控制了第四根手指弯曲,把PID参数调到机器人没有抖动,先调P,然后调ID参数,I负责消除稳态累计误差,D负责噪声影响.
 
 
Github项目链接
如有问题可在评论区留言,或者私信,或者本人主页咨询或者Github提出,欢迎交流探讨.
不过这种东西也就是工具,精髓在于MoveIt!的源码,所以是建议大家源码安装.

多指灵巧手MoveIt!与Gazebo联合仿真框架搭建的更多相关文章

  1. 【探索之路】机器人篇(5)-Gazebo物理仿真环境搭建_让机器人运动起来

    如果完成了前两步,那么其实我们已经可以去连接我们的现实中的机器人了. 但是,做机器人所需要的材料还没有到,所以我们这里先在电脑平台上仿真一下.这里我们用到的就算gazebo物理仿真环境,他能很好的和R ...

  2. 01_Keil与Proteus联合仿真的注意事项

    01. 关于keil5和Proteus8的联合仿真的操作步骤,这里就不细说,给个链接,步骤差不多是最齐全的 CSDN博客链接:https://blog.csdn.net/wzk456/article/ ...

  3. (转)Quartus II和Modelsim的联合仿真(详细)

    这篇文章不需要在modelsim中建库.映射.建工程等一些繁琐的步骤,直接使用modelsim中的默认work库.使用quartus+modelsim联合仿真. 首先推荐一篇文章 http://www ...

  4. 通过文件读写方式实现Matlab和Modelsim的联合仿真

    虽然Modelsim的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法的仿真验证的时候,则显得有点不足.而进行数字信号处理是Matlab的强项,不但有大量的关于数字信号处 ...

  5. ISE和Modelsim联合仿真(详细步骤讲解)

    ISE和Modelsim联合仿真(转) 地址:http://www.cnblogs.com/feitian629/archive/2013/07/13/3188192.html 相信很多人会遇到过这个 ...

  6. vivado与modelsim的联合仿真(二)

     最近在做Zynq的项目,曾经尝试使用ISE+PlanAhead+XPS+SDK组合和Vivado+SDK来搭建工程,使用中发现前者及其不方便后者有诸多不稳定.近期得闻Xilinx退出Vivado20 ...

  7. vivado2013.4和modelsim联合仿真

    vivado2013.4和modelsim联合仿真                           Hello,Panda        最近在做Zynq的项目,曾经尝试使用ISE+PlanAhe ...

  8. Xilinx ISE如何调用Modelsim进行联合仿真

    图: 在对设计的芯片进行测试时,经常要用到FPGA,可是里面的仿真工具却不如Modelsim那么好用,且在规模比较大时,ISE在仿真时,软件经常会报告内存限制的问题,此时一般会切换到Modelsim软 ...

  9. vivado2017.1和modelsim10.5联合仿真

    vivado2017.1和modelsim版本 vivado可在xilinx官网查询匹配的modelsim最低版本,下载modelsim前记得选用合适的版本号,如图 查询地址:https://www. ...

随机推荐

  1. Flask:基本结构

    在大多数标准中,Flask 都算是小型框架,小到可以称为"微框架".但是,小并不意味着它比其他框架的功能少.Flask 自开发伊始就被设计为可扩展的框架,它具有一个包含基本服务的强 ...

  2. 测试平台系列(1) 搭建Flask服务

    搭建Flask服务 项目地址 点我进入项目地址 代码都会在这里有所展示,喜欢的话可以帮点个star,谢谢大家了!如果你喜欢该教程,也可以分享给其他人. 关于选型 想了很久,本来打算用「Gin」做为后端 ...

  3. AI人脸匹对

    人脸匹对 技术 调用到百度的AI接口,layui的图片上传,栅格化布局 核心代码 纯py代码运行 # encoding:utf-8 from aip import AipFace import bas ...

  4. CVE-2017-12149-JBoss 5.x/6.x 反序列化

    漏洞分析 https://www.freebuf.com/vuls/165060.html 漏洞原理 该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过 ...

  5. 树莓派 3/4 安装 FreeBSD

    已盼春来归 已盼春来归 今日去 愿为春来归 盼归春天来了 FreeBSD 的春天在哪里? 树莓派是什么,相信凡是关注了我们的人都不会不知道,但是介于非专业人员需要在此做简要介绍.我们的安卓手机,大部分 ...

  6. slickgrid ( nsunleo-slickgrid ) 5 增加子件

    slickgrid ( nsunleo-slickgrid ) 5 增加子件 上次把单元格切换的问题解决了,这次要最做的事情就是给slickgrid的treegird增加子件,我们先选中某一条记录,然 ...

  7. java 动态规划解决最大连续子数列和

    很多动态规划算法非常像数学中的递推.我们如果能找到一个合适的递推公式,就能很容易的解决问题.我们用dp[n]表示以第n个数结尾的最大连续子序列的和,这里第n个数必须在子序列中.于是存在以下递推公式: ...

  8. GreenDao3.2使用详解(增,删,改,查,升级)

    首先看一下效果图: 项目结构如下图所示: 第一步:在build中添加配置如下: projet 目录下的build.gradle dependencies { classpath 'org.greenr ...

  9. canvas-修改图片亮度

    canvas操作-修改图片亮度 目录 canvas操作-修改图片亮度 图片亮度的概念 下面用ps截图举一个例子: 调整图片亮度的方案 实现方案一 从RGB到HSV的转换 转换的公式 javascrip ...

  10. python的迭代

    迭代 1:并行迭代 程序可以同时迭代两个序列 names["zhangsan","lisi","zhaosi"] age[12,13,14] ...