当前位置:   article > 正文

Robotics Library 学习使用记录

robotics library

编译篇

最近用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 *)" (?
  • 1

乍一看是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" } ] } ] }

对于一个#VRML V2.0 (.wrl)格式的装配模型,需要用两个xml文件进行定义。一个xml用来定义场景,一个xml用来定义约束及结构。

定义场景的比较简单,指定装配模型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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

定义约束的就比较复杂,主要就是描述每个零件之间的关系,这里有种新定义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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

第二个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"
				}
			]
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/724016
推荐阅读
相关标签
  

闽ICP备14008679号