赞
踩
最近用Robotics Library 做机械臂的模拟和路径规划,刚开始弄,一边研究一遍记录。
官网下载已编译好的库文件进行安装https://www.roboticslibrary.org/download
安装很简单没什么问题。
准备开始使用,这里有向导
https://www.roboticslibrary.org/tutorials/
单独的按向导的代码,cmake构建工程
https://www.roboticslibrary.org/tutorials/first-steps-windows/
从库文件里选择模型文件运行工程没什么问题。
这里有个小细节,debug模式提示“无法打开Coin4d.lib”,也就是debug模式暂时用不了先不管了(后来我调出,缺了一堆debug下的文件,补上才可以,并且还有内存管理错误),release能用就行,但是打断点的时候会提示”当前不会命中断点,还没有为该文档加载任何符号“
解决办法:
1项目-〉属性-〉配置属性-〉C/C+±〉常规-〉调试信息格式,这里改成“用于“编辑并继续”的程序数据库 (/ZI)”
2项目-〉属性-〉配置属性-〉链接器-〉调试-〉生成调试信息,这里设为“优化以便于调试 (/DEBUG)”。
验证了一下放到Qt里也比较简单 widget->setParent(wd);就可以了。这时候我还没有开始看 API (http://doc.roboticslibrary.org/0.7.0/index.html)
我想看API 感觉看不懂啊,官方向导就这么点不够详细,具体怎么去做路径规划没有说明,但是在bin下有几个已经编译好了的例子程序,我跑了下,感觉rlCoachMdl、rlPlanDemo.exe这几个比较具有参考价值
所以我又把源代码下下来了,CMake打开工程
还是有很多例子的,代码都在这就比较方便学习了
全部运行一下,debug一运行还是报错,那就release吧,结果release也有几个工程报错,我想挑事的rlPlanDemo这个也报错了,错误如下
1>BulletCollision.lib(btConvexConvexAlgorithm.obj) : error LNK2019: 无法解析的外部符号 __libm_sse2_sincosf_,该符号在函数 "public: virtual void __cdecl btConvexConvexAlgorithm::processCollision(struct btCollisionObjectWrapper const *,struct btCollisionObjectWrapper const *,struct btDispatcherInfo const &,class btManifoldResult *)" (?
乍一看是BulletCollision.lib这个库的问题,bullet这玩意已经编译好的库还不好下,我下源码自己编译了替换下,不提示这个库的错误了,但是又提示别的库的错误(rlsgs.lib),这个库是RL 工程里自己的库,最后发明不是这个库的问题BulletCollision.lib
解决方法:
在报错工程的主窗口代码里注释掉一些东西
我也没看懂这是什么意思,大概就是在sg目录下有几个Scene.h头文件,不环境下要用相对应的头文件,反正我试出来我这边用ode目录下的就可以了,它这宏定义为啥没起作用,我也就不深究了,不懂宏,反正其它注释掉,我现在能用,可以正常编译了。
————————————————————————————
对于刚刚的宏定义问题,最好的办法是不改它的代码
这些都不用注释了
在属性预处理器里把其它的宏定义删除即可。
这会儿就明白这宏定义是怎么用了,字面意思,如果定义了RL_SG_BULLET这个宏就包含头文件。
——————————————————————
本来准备开始啃代码,一行注释都没有,真的是看的奶奶痛。
我决定还是先了解它的模型文件系统。
我们想显示一个机械臂模型,并实时控制姿态,通过solidworks或者其它软件可以导出.wrl格式文件。
我们先做一个最简单的机械臂,就是由两个零件组成,只有一个旋转自由度。首先每个单独的零件都需要导出。
同时还要导出,装配好的零件
装配好的零件用不上,但里面数据用得上,备份一下,后面要用。
把装配好的零件里是数据清空, 自己在整理下,这个文件里的Tranform 和 rotation 调整对后面使用没有作用,通过solidworks或者freeCAD导入可以验证正确性。
#VRML V2.0 utf8 DEF robot Transform { children [ DEF link0 Transform { children [ Inline { url "link0.wrl" } ] } DEF link1 Transform { rotation 0 1 0 1.57 translation 0 0 0.6604 children [ Inline { url "link1.wrl" } ] } ] }
定义场景的比较简单,指定装配模型robot.wrl,并指明有两个零件link0和link1。
<?xml version="1.0" encoding="UTF-8"?>
<rlsg xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="rlsg.xsd">
<scene href="robot.wrl">
<model name="robot">
<body name="link0"/>
<body name="link1"/>
</model>
</scene>
</rlsg>
定义约束的就比较复杂,主要就是描述每个零件之间的关系,这里有种新定义frame,新定义的frame相当于空零件,有点像加了几个没有实体的零件,为什么要这个呢,本来我们的模型很简单:一个世界(world)两个零件(body0、body1),world和body0固定,body0和body1铰接,但是实际上我们描述body0和body1之间关系时要先描述一个位置转换(就是把body1放到正确地方),每个零件都有一个世界坐标和自身坐标。我们先引入一个frame0,frame0和body0之间没有运动自由度,所以frame0和body0之间是fix固定关系,通过rotation和transform移动位置,此时frame0的世界坐标为(x0,y0,z0),在描述frame0和body1之间为铰接revolute关系时,用的是frame0的自身坐标,body1描述的坐标是和frame0的(0,0,0)重叠的。
所以第一个fixed0 描述的是body0跟世界坐标系的关系,靠rotation和translation来控制,我们需要把之前保持的装配里的数据都转换到这里来,
<fixed id="fixed0"> <frame> <a idref="world"/> <b idref="body0"/> </frame> <rotation> <x>0</x> <y>0</y> <z>0</z> </rotation> <translation> <x>0</x> <y>0</y> <z>0</z> </translation> </fixed>
第二个fixed1描述的是body0和frame0之间的关系
这里有一个大坑,这里描述角度的单位是角度
而之前导出的装配文件里rotation里是弧度,其次这里的rotation下的x,y,z分别就指绕X Y Z轴旋转,而导出的装配模型中rotation后面有四位数据,这里是用向量表示的,rotation 1 0 0 -1.570796 表示绕 [1 0 0] 向量旋转-1.57弧度,也就是绕X轴逆时针旋转90度
DEF link1 Transform {
rotation 1 0 0 -1.570796
translation 0 0 0.6604
children [
Inline {
url "link1.wrl"
}
]
}
在revolute,x y z是设置铰链的转动轴的,x y z也是向量表示,如果模不等于1就会放大或缩小,下面max和min是允许的做大最小值
<revolute id="joint0">
<frame>
<a idref="frame0"/>
<b idref="body1"/>
</frame>
<axis>
<x>0</x>
<y>1</y>
<z>0</z>
</axis>
<max>360</max>
<min>-360</min>
<speed>140</speed>
</revolute>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。