【机器人学】机器人开源项目KDL源码学习:(1)下载源码并在ubuntu下运行geometry部分(旋转矩阵)

KDL(kinematic-Dynamic Library)项目是欧洲一些搞机器人的大牛做的一个开源的项目OROCOS(Open Robot Control Software)的一部分,,它产生和发展的历史可见官网(www.orocos.org),对于机器人学领域的同学们,如果想要学习机器人路径规划、轨迹规划、逆解算法,甚至编程的话,这是一个很好的学习素材。

这篇文章主要介绍如何在ubuntu下编译和运行一部分代码(geometry.cpp),初步观察和学习KDL的旋转矩阵运行结果。

从GITHUB上下载源码(https://github.com/orocos/orocos_kinematics_dynamics)。

查看example路径下的CmakeLists.txt文件。在orocos_kdl目录下:

ccmake .

配置成如下形式(需要注意的是必须将BUILD_MODELS和ENABLE_EXAMPLES这两项设为ON),否则无法make通过:


 BUILD_MODELS                     ON                                                                                        
 BUILD_MODELS_DEMO                OFF                                                                                           
 CMAKE_BUILD_TYPE                 Release                                                                                       
 CMAKE_INSTALL_PREFIX             /usr/local                                                                                    
 CPPUNIT                          /usr/lib/x86_64-linux-gnu/libcppunit.so                                                       
 CPPUNIT_HEADERS                  /usr/include                                                                                  
 ENABLE_EXAMPLES                  ON                                                                                            
 ENABLE_TESTS                     OFF                                                                                            
 Eigen_DIR                        Eigen_DIR-NOTFOUND                                                                            
 KDL_USE_NEW_TREE_INTERFACE       OFF

在orocos_kdl目录下:

make

再查看example目录下的文件内容,可以看到已经生成了三个可执行文件:geometry、trajectory_example、chainiksolverpos_lma_demo。执行geometry:

aicrobo@ubuntu:~/kdl/orocos_kdl/examples$ ./geometry 
v1 =[           0,           0,           0]
v2 = [           1,           2,           3]
v3 = [           1,           2,           3]
v4 = [           0,           0,           0]
v1: 4, 5, 6
v2: 7, 8, 9
v3: 10, 11, 12
2*v2 = [          14,          16,          18]
v1*2 = [           8,          10,          12]
v1/2 = [           2,         2.5,           3]
v1+v2 = [          11,          13,          15]
v3-v1 = [           6,           6,           6]
v3-=v1; v3 = [           6,           6,           6]
v2+=v1; v2 = [          11,          13,          15]
cross(v1,v2) =  [          -3,           6,          -3]
dot(v1,v2) = 199
v1=-v2; v1=[         -11,         -13,         -15]
v1.ReverseSign(); v1 = [          11,          13,          15]
v1==v2 ? 1
v1!=v2 ? 0
Equal(v1,v2,1e-6) ? 1
norm(v3): 10.3923
Normalize(v3)[     0.57735,     0.57735,     0.57735]
SetToZero(v1); v1 = [           0,           0,           0]
r1: [           1,           0,           0;
            0,           1,           0;
            0,           0,           1]
r2: [           0,           0,          -1;
            0,          -1,           0;
            1,           0,           0]
r3: [           0,           0,          -1;
            1,           0,           0;
            0,          -1,           0]
r4: [           1,           0,           0;
            0,           1,           0;
            0,           0,           1]
r5: [           1,           0,           0;
            0,         0.5,   -0.866025;
            0,    0.866025,         0.5]
r6: [         0.5,           0,    0.866025;
            0,           1,           0;
    -0.866025,           0,         0.5]
r7: [         0.5,   -0.866025,           0;
     0.866025,         0.5,           0;
            0,           0,           1]
r8: [    0.728028,   -0.525105,    0.440727;
     0.608789,    0.790791,  -0.0634566;
    -0.315202,    0.314508,    0.895395]
r9: [    0.765682,   -0.428256,      0.4799;
     0.571734,    0.794968,   -0.202787;
    -0.294665,    0.429649,    0.853551]
r10: [    0.103847,     0.86478,    0.491295;
     0.422919,   -0.485478,    0.765147;
     0.900198,     0.12832,   -0.416147]
r11: [   -0.224845,    0.902382,    -0.36763;
    -0.350175,   -0.426918,   -0.833738;
    -0.909297,  -0.0587266,    0.411982]
r12: [    0.411982,   -0.833738,    -0.36763;
   -0.0587266,   -0.426918,    0.902382;
    -0.909297,   -0.350175,   -0.224845]
r8(1,2): -0.0634566
equiv rot vector of r11: [     1.10589,    0.772924,    -1.78732]
equiv rot vector of r10:[    -0.72668,   -0.466596,   -0.504206]and angle: 2.68802
EulerZYZ: -0.399803, 0.548013, 0.969646
EulerZYX: 0.641385, 0.299109, 0.466338
Roll-Pitch-Yaw: 0.466338, 0.299109, 0.641385
UnitX of r8:[    -0.72668,   -0.466596,   -0.504206]
Unity of r8:[    -0.72668,   -0.466596,   -0.504206]
UnitZ of r8:[    -0.72668,   -0.466596,   -0.504206]

要搞明白上述运行结果的意义的话,可以查看geometry.cpp,这个程序是为了展示其定义的类Vector(包含向量的多种运算)和类Rotation。Rotation表示机器人的旋转矩阵(姿态),机器人学中表示机器人姿态有多种方法,orocos中定义的方法有RPY方法,角-轴,欧拉角方法,四元数方法。

参考资料:

[1]http://www.orocos.org;

[2]https://github.com/orocos/orocos_kinematics_dynamics







  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在ROS中,可以使用`moveit_commander`库中的`RobotCommander`和`MoveGroupCommander`类来求解机器人的雅可比矩阵。下面是一个使用Python函数求解机器人速度运动学雅可比矩阵的示例代码: ```python import rospy from moveit_commander import RobotCommander, MoveGroupCommander from geometry_msgs.msg import Pose rospy.init_node('jacobian_example') # 创建RobotCommander和MoveGroupCommander对象 robot = RobotCommander() group = MoveGroupCommander("arm") # 获取机器人的当前关节状态 current_joint_values = group.get_current_joint_values() # 设置机器人的当前关节状态 group.set_joint_value_target(current_joint_values) # 进行正向运动学,获取末端执行器的位姿 fk_pose = group.get_current_pose().pose # 创建一个Pose对象,表示末端执行器的位姿增量 delta_pose = Pose() delta_pose.position.x = 0.01 delta_pose.position.y = 0.01 delta_pose.position.z = 0.01 # 根据位姿增量计算目标位姿 target_pose = Pose() target_pose.position.x = fk_pose.position.x + delta_pose.position.x target_pose.position.y = fk_pose.position.y + delta_pose.position.y target_pose.position.z = fk_pose.position.z + delta_pose.position.z # 求解雅可比矩阵 jacobian_matrix = group.get_jacobian_matrix() # 打印雅可比矩阵 print(jacobian_matrix) ``` 以上代码中,我们首先初始化ROS节点并创建了`RobotCommander`和`MoveGroupCommander`对象。然后,我们获取机器人的当前关节状态,并使用`set_joint_value_target`函数将当前关节状态设置为目标状态。接下来,我们使用`get_current_pose`函数获取末端执行器的当前位姿,并创建一个位姿增量对象。通过将位姿增量添加到当前位姿,我们获得了目标位姿。最后,我们使用`get_jacobian_matrix`函数求解雅可比矩阵,并将结果打印出来。 请注意,以上代码只是一个简单示例,你需要根据你的机器人和实际需求进行相应的修改和适配。 希望这个示例能够帮助到你!如果你有任何其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值