Solidworks生成urdf模型并使用ROS+moveit!对机械臂仿真

本次设计来源于机器人学布置的一次课程设计,问题描述按下不表,主要使用了Solidworks生成了Moveit!使用的URDF模型。装配体的整体效果如下图。

 左侧为一个两自由度的L型变位机右侧使用的是KUKAkr210机械臂模型有6个自由度,两个模型都可以在网上找到开源的机械模型。使用sw主要是为了标注坐标系,因为设计要求使用D-H法手推各关节的正逆向运动学方程。简化结构如下。

公式推导略过,需要的可以留言。

因为非机械专业出身,sw使用的并不是很熟练,主要的步骤可以在小破站看古月居的视频。在sw下标注坐标系和使用sw2urdf插件生成urdf模型时有几点需要注意:

1.如果直接使用现成的多个装配体模型组合成一个装配体标注旋转轴和坐标系的时候要先将多个转配体组合成一个整体后再标注旋转轴和坐标系。不然后面生成urdf模型的时候可能会出现模型分解的惨烈状况。

2.一定一定一定要固定基坐标系,虽然在学习机器人学的过程中,对基坐标的选取一般是跟第一个轴上的坐标系初始状态重合,但是在实际应用中,如果不选择在固定基座上建立坐标系,最后生成的模型显示出来是起飞状态。

3.一个非常玄学的问题,如果你按照网上视频一步一步完全没有错误得生成了urdf模型,并且已经安装joint_state_publisher插件,但是在打开rviz进行可视化仿真的时候并没有弹出 joint_state_publisher的GUI控制窗口,检查launch文件发现也是使用的joint_state_publisher_gui这个type,并且是true的打开状态。这是由于sw模型生成urdf的时候出现了问题,ros判断各joint的关系出现问题。此时你需要重新回到sw2urdf的步骤,在定义各轴类型时选择AUTO,因为设计到理论推导,在定义的过程中我只定义了各轴的坐标系,轴类型AUTO。这里也询问了B友,基本是相同的解决方式。

 目前想起这些注意事项,有其他问题可以留言交流。

涉及到moveit!配置的步骤可以看其他的博客或者视频,这一步的问题按部就班一般不会有什么问题。

所有配置完成后重新make以下

catkin_make

运行launch文件

rosrun xxx demo.launch

效果如下图

 使用joint_state_publisher可以调节各关节角度,对于课程设计的问题,只需要对变位机的两个关节进行手动干预,调节效果如下图。

 滑块显示的时角度,单位是弧度,范围-3.14到3.14。这里有一些不严谨的地方就是没有规定某些关节轴的运动范围,比如控制变位机物料盘的上下运动这个轴就有些穿模。当然还有就是机械臂基座和link1的运动范围,明显是有限位装置的,这里不再做考虑,有需要的可以在生成urdf模型的时候进行设置。

 机械臂的路径规划在配置moveit!的时候进行配置,但是多数情况下很多位置会显示不正做出正确的规划方案,这里是因为使用了moveit!自带的路径规划算法,可以下载trac_ik这个算法,然后在launch文件中把初始的路径规划算法替换。具体操作古月居也有相应的操作。

 变位机物料盘上有一个圆柱体来模拟货物P,机械臂的末端执行器来模拟抓取货物,因此要获取p的坐标,分步运行以下程序获取相应坐标,也可以在rviz下导入TF工具查看,只不过不能复制。

rosrun moveit_commander moveit_commander_cmdline.py

use #tab补全可以查看在moveit定义的group

cu+tab补全

 P的坐标

 使用python编写脚本如下 

#!/usr/bin/env python
import rospy, sys
import moveit_commander
from geometry_msgs.msg import PoseStamped, Pose
 
 
class IkDemo:
    def __init__(self):
 
        moveit_commander.roscpp_initialize(sys.argv)

        rospy.init_node('moveit_ik_demo')
                
        arm = moveit_commander.MoveGroupCommander('arm_group')
                
        end_effector_link = arm.get_end_effector_link()
                        
        reference_frame = 'base_link'
        arm.set_pose_reference_frame(reference_frame)
                
        arm.allow_replanning(True)

        arm.set_goal_position_tolerance(0.001)
        arm.set_goal_orientation_tolerance(0.01)
       
        arm.set_max_acceleration_scaling_factor(0.005)
        arm.set_max_velocity_scaling_factor(0.005)
 
        # arm.set_named_target('arm_init')
        # arm.go()
        # rospy.sleep(10)

        target_pose = PoseStamped()

        target_pose.header.frame_id = reference_frame
        target_pose.header.stamp = rospy.Time.now() 

        target_pose.pose.position.x = 0.151736448028                 
        target_pose.pose.position.y = 0.251521841331                  
        target_pose.pose.position.z = 0.719248838233                  

        target_pose.pose.orientation.x = -0.0388332383092
        target_pose.pose.orientation.y = -0.959095813803
        target_pose.pose.orientation.z = 0.22781282065
        target_pose.pose.orientation.w = 0.16348858766
        

        arm.set_start_state_to_current_state()
        

        arm.set_pose_target(target_pose, end_effector_link)
        

        traj = arm.plan()
        
        arm.execute(traj)
        # rospy.sleep(5)  
 

        # arm.set_named_target('arm_init')
        # arm.go()
 
        moveit_commander.roscpp_shutdown()
        moveit_commander.os._exit(0)
 
if __name__ == "__main__":
    IkDemo()

这段代码的作用是将目标点的位姿状态发布给机械臂的末端执行器,让机械臂的末端执行器运行到目标点的坐标系,两者坐标系重合。

运行视频

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值