当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 从URDF到KDL(C++&Python)

从URDF到KDL(C++&Python)

2018年09月14日  | 移动技术网IT编程  | 我要评论

重生躲美录,荆门租房网,1.85传奇私服网

从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是通用的运动学动力学库,对于复杂的运动学问题,比如并联机构的正解问题、串联机构的反解问题、冗余机构的无穷解问题都是利器。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网