设为首页 加入收藏

TOP

从URDF到KDL(C++&Python)
2017-09-19 13:06:15 】 浏览:7391
Tags:URDF KDL &Python

从URDF到KDL(C++&Python)

毕竟我也是一个搞机器人的,今天就来写一些和机器人紧密相关的事情。

从URDF到KDLCPython KDL 简介 URDF模型 KDL C KDL Python


KDL 简介

PyKDL是一个神奇的库。里面包含了KDL库与vector,rotation, frame, kinematics, dynamics的相关函数和接口。计算机器人学中的运动学/动力学和坐标变换都是相当的彪悍。甚至可以加载urdf模型计算运动学,调用DH相关接口或者chain接口直接创建机器人模型。这个库主要是面向C++的,通过sig的形式做了相应的python接口。这里先讨论论c++中KDL的使用。
wiki tutorials
official site and git
python documentation
python kdl git

URDF模型

URDF模型是用于描述机器人运动学参数、动力学参数的配置文件。可以从多种来源获得,比如Solidworks可以直接保存出来。当然也可以自己编写,并不是很繁琐。
这篇教程清晰地写明了如何创建URDF模型。还是把最终的代码贴上来:

from urdf_parser_py.urdf import URDF
from pykdl_utils.kdl_parser import kdl_tree_from_urdf_model
robot = URDF.from_xml_file('/home/file/catkin_ws/src/KDL_Test/src/ur3_robot.urdf') # get a tree

然后在python中求解机构的运动学正逆解非常方便:

# KDL version 1
#!/usr/bin/env python
#-*- coding:utf-8 -*-
############################
#File Name: kdl_module.py
#Author: Wang
#Mail: wang19920419@hotmail.com
#Created Time:2017-09-09 10:51:39
############################

import sys
sys.path.insert(0, "/home/file/catkin_ws/src/Basic_math/hrl-kdl-indigo-devel/hrl_geom/src")
sys.path.insert(0, "/home/wangxu/catkin_ws/src/Basic_math/hrl-kdl-indigo-devel/pykdl_utils/src")

from urdf_parser_py.urdf import URDF
from pykdl_utils.kdl_kinematics import KDLKinematics
from pykdl_utils.kdl_parser import kdl_tree_from_urdf_model

robot = URDF.from_xml_file("/home/file/catkin_ws/src/KDL_Test/src/ur3_robot.urdf")
tree = kdl_tree_from_urdf_model(robot)
print tree.getNrOfSegments()
chain = tree.getChain("base", "tool0")
print chain.getNrOfJoints()
kdl_kin = KDLKinematics(robot, "base_link", "ee_link", tree)
q = [0,0,0,0,0,0]
pose = kdl_kin.forward(q) # forward kinematics (returns homogeneous 4x4 numpy.mat)
q_ik = kdl_kin.inverse(pose, [0.1,0.1,-0.1,0.1,0.1,0.1]) # inverse kinematics
if q_ik is not None:
    pose_sol = kdl_kin.forward(q_ik) # should equal pose
#J = kdl_kin.jacobian(q)
print 'q:', q
print 'q_ik:', q_ik
print 'pose:', pose
if q_ik is not None:
    print 'pose_sol:', pose_sol
#print 'J:', J

需要说明的:
1. 运动学正解输出的是4×4的坐标变换矩阵,如需变成位姿、四元数或者欧拉角需要进行额外的转换。
2. 运动学逆解的计算需要输入目标位姿和迭代角度初值,初值设置不要太离谱,不然就收敛不过去了,就好比深度学习权重初始值不能随机太夸张,否则就会not a number一样。
3. 如需其他开发,就要在这个基础上增加其他函数,见仁见智。
4. 无论是C++还是python,使用kdl都需要先将urdf parse成kdl能理解的模型。于是就有了两个语言的parser方法:

KDL是通用的运动学动力学库,对于复杂的运动学问题,比如并联机构的正解问题、串联机构的反解问题、冗余机构的无穷解问题都是利器。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计模式-外观模式 C++实现 下一篇C++:函数后面加const的用法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目