项目构造简述
前段时间博主装20.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小车的系列,相关问题博主不一定有时间来解答,下一个项目见。