从零开始的机械臂yolov5抓取gazebo仿真(六)

  • Post author:
  • Post category:其他




项目构造简述

前段时间博主装22.04系统不小心把efi启动给删了,导致18.04系统崩了,所以只能简单讲一下这个项目的设计思路以及以grasp.py代码为例进行简单解析。



yolov5_ros功能包

首先,说一下yolov5_ros功能包,该功能包的作用就是用ros功能包封装yolov5这个代码包,并且通过话题的方式发布图像中的锚框信息。

yolov5_ros功能包代码原理这里不进行详解,只说一下如何使用。

新建一个开启yolov5_ros节点的launch文件,yolo_v5.launch:

<?xml version="1.0" encoding="utf-8"?>

<launch>
  <!-- Load Parameter -->
  
  <param name="yolov5_path"       value="$(find yolov5_ros)/yolov5"/>
  <param name="use_cpu"           value="true" />

  <!-- Start yolov5 and ros wrapper -->
  <node pkg="yolov5_ros" type="yolo_v5.py" name="yolov5_ros" output="screen" >
    <param name="weight_path"       value="$(find yolov5_ros)/weights/polygon.pt"/>
    <param name="image_topic"       value="/camera/color/image_raw" />
    <param name="pub_topic"         value="/yolov5/BoundingBoxes" />
    <param name="camera_frame"       value="camera_color_optical_frame"/>
    <param name="conf"              value="0.3" />
  </node>
</launch>

其中weight_path参数对应使用的权重路径,路径指向之前训练出来的权重文件。

image_topic参数对应仿真中相机的二维彩色图像输出话题。

pub_topic参数对应发布的话题。

camera_frame参数为相机的对应link。

只需要修改对应参数的value即可使用该功能包了。



vacuum_plugin使用

简单说一下吸盘插件的使用,参照vacuum_plugin功能包中test_gripper.urdf中的插件形式,在sunday.xacro中插入吸盘插件:

  <!-- vacuum_gripper plugin -->
  <gazebo>
    <plugin name="gazebo_ros_vacuum_gripper" filename="libvacuum_plugin.so">
      <robotNamespace>/sunday/vacuum_gripper</robotNamespace>
      <bodyName>link_6</bodyName>
      <topicName>grasping</topicName>
      <maxDistance>0.05</maxDistance>
      <minDistance>0.03</minDistance>
    </plugin>
</gazebo>


<gazebo reference="link_6">
  <mu1>50</mu1>
  <mu2>50</mu2>
  <minDepth>0.003</minDepth>
  <maxVel>0</maxVel>
  <kp>1000000.0</kp>
  <kd>1.0</kd>
  <material>Gazebo/Grey</material>
</gazebo>

robotNamespace吸盘命名空间为/sunday/vacuum_gripper,与服务进行对应。

bodyName为吸盘对应到的link,grasping为插件发布的吸盘话题。

吸盘通过服务来控制开关。

        rospy.wait_for_service('/sunday/vacuum_gripper/off')
        rospy.wait_for_service('/sunday/vacuum_gripper/on')
        self.vacuumOn=rospy.ServiceProxy('/sunday/vacuum_gripper/on', Empty)
        self.vacuumOff=rospy.ServiceProxy('/sunday/vacuum_gripper/off', Empty)



抓取脚本简述

关于这个抓取脚本,算是实现yolov5与moveit实现抓取的一个整合,简单说一下grasp.py,其实已经有详细的注释说明,大致讲一下思路。事先需要准备的是相机的内参,这个可以使用真实realsenseD435i的内参;以及机械臂向下拾取目标时的末端位姿endDown,这个可以在moveit中调整机械臂致预想位姿(四元数信息),并在rviz中获取。对照主函数,首先将机械臂运行至scan_food位置,此时yolov5_ros识别出目标物体,/yolov5/BoundingBoxes话题中有锚框的位置信息以及物体的名称信息,grasp.py再订阅相机深度话题,得到锚框中心点的深度信息,通过坐标转换,得到目标点到机械臂的坐标相对位置,并进行抓取。代码请自行参考开源内容。

grasp&feed的话,对yolov5_ros功能包进行二次调用,增加了嘴部张口闭口的识别,在拾取到之后机械臂进入scan_face位姿,如果识别到嘴巴张开则判断为进食,如果嘴部位置超出机械臂行程,则相对位置对应方向上-10cm,并重新开始规划,直至可达机械臂行程为止。grasp&feed节点运行图如下:

在这里插入图片描述



小结

博主的18.04系统在装22.04三系统的时候不小心搞没了,没办法拖更至今,到现在也只能大致讲一下代码的思路,机械臂的内容至此告一段落把。具体学习ros机械臂的话可以看一下深蓝古月ros机械臂的课程,课程可以私聊博主领取。博主接下去准备学一下嵌入式的内容,从平衡小车开始做起,接下去会做一个平衡小车的系列以及ros2小车的系列,相关问题博主不一定有时间来解答,下一个项目见。



版权声明:本文为qq_48427527原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。