[小冬搞开发]-基础篇-飞控开发系列(三)

小冬搞机之M100硬件建模

Posted by Lordon on February 26, 2020

关于本文

身边的同学多专注于算法与代码结构的设计,对硬件方面了解不多,在调试过程中普遍都是拿网上类似功能模型进行调试,这在整个机器人研发测试过程中就会有短板,本文主要整理这两天所查阅资料,记录下网上没有明确总结过的硬件部分开发流程.

3月5日作品展示


言归正传

笔者个人电脑配置:

Windows10:
Solidworks 2017[机械结构设计],导出urdf描述文件,STL类型表面文件,材质以及cmakelists等编译文件
Matlab 2018b[仿真],使用机器人仿真工具包(在探索)
V-Rep PRO EDU[仿真],查看.urdf,.dar(COLLADA)文件的meshes(怎么仿真还不会,好像潜力很大)
blender 2.8[机械结构设计,渲染],可以编辑stl,dae等文件,缺点是用在机器人方针需要手写urdf…

Ubuntu 18.04:
ROS-Melodic[支持也还可以,遇到的兼容性问题不多]
Gazebo 9.1, RViz
VSCode 包含bracket-pair-colorizer c/c++ easy-shell local-history python todo-tree shell-format插件.

Attention: 淘宝客服明确跟我强调blender多用于3D动画制作,想要机器人设计一步到位还是用SW 用SW 用SW,不过最后还是用blender设计好并且改写成了urdf格式,也算比较圆满吧.


「错误」总结始

github所给模型/meshes多为.dae.obj+.mtl或者.stl文件
1-需要提前导入到blender中适度优化后转化成.stl文件(单个部件保存,不用组装)
2-使用Rhino加载.stl文件另存为.3dm类型文件(SW可编辑)
3-进而加载.3dmSolidwork的[元件]工程中,另存为.SLDPRT类型文件
4-solidwork中新建[装配体]工程,将.SLDPRT类型元件组装好
5-最后通过SolidWorks to URDF Exporter插件导出.urdf文件
最后手动修改成.urdf.xacro,yeah!

「错误」总结终

此处还是特别感谢:陈冬林同学提供思路,并且多次很晚开机帮我测试文件,下面附带佬项目图:)

探索过程

「SDF和URDF的区别」

SDF和URDF都是基于XML的机器人描述格式。区别在于URDF只能描述单个机器人的运动和动态属性,而无法描述环境信息,也不支持多机器人、闭链(并联)机器人;SDF是相对更新的格式,它可以包含从世界环境到机器人属性相关的全部信息,且支持闭链结构。

「为什么广泛使用urdf」

尽管SDF格式具备更明显的优点,Gazebo官方也主推SDF格式,甚至已经下架了部分关于URDF的教程。但到目前为止,大多数网络上能找到的中文ROS教程仍然是基于URDF的,部分插件工具也只支持URDF。因此,在选择机器人描述格式时,如果对自己的开发能力有信心且有长期做Gazebo仿真开发的打算,或必须要用到闭链结构的机器人,推荐使用SDF格式;如果是刚入门的新手,还是建议采用教学资源更加丰富的URDF/XACRO格式建立自己的机器人。

1-solidwork2017链接教程,感谢佳林的baiduyun会员

2-使用solidwork导出URDF,导出目录下生成包含URDF文件、网格文件、材质文件等

3-ROSWiki官方urdf教程

4-urdf关节连接、安装位置坐标、颜色

5-urdf关节矢量旋转方向限度

urdf文件中部分参数解释,代码部分通过上面的345可以,简易的urdf模型是通过出版的机器人模型在简化建构之后根据DH参数法建模来建立的坐标系并通过solidworks生成了相应的ros package,部分参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<visul>描述机器人link部分的外观参数,如size,color,shape等
<inertial>描述link的惯性参数
<collosion>描述link的碰撞属性
<origin>描述位置
<axis>旋转方向

固定关节:fixed,不允许运动
转动关节:revolute,类似与continus,有旋转角度极限
滑动关节:prismatic,沿着某一轴线运动的关节,带有位置极限
浮动关节:floating,运行进行平移,旋转运动
平面运动关节:planner,允许在平面正交方向上平移或旋转
旋转关节:continus,可以绕某轴线无限旋转

<calibration>关节的参考位置,用来校准关节的绝对位置
<dynamics>描述关节的物理属性,例如阻尼值,物理静摩擦力等
<limit>描述运动的一些极限值,包括关节运动的上下限极限位置、速度限制、力矩限制等
<mimic>描述该关节与已有关节的关系
<safety_controller>描述安全控制器参数

这时候学完urdf文件的编写之后总是感觉很迷糊,好像哪里缺了什么东西使得整个流程连贯不起来.

「 所以,都会不禁地问: 」

为什么常见的格式都是.xacro,两种文件之间又该怎么转换?

xacro文件转换成urdf文件

1
2
$ rosrun xacro xacro --inorder model.urdf.xacro > model.urdf
$ rosrun xacro xacro.py model.xacro > model.urdf

urdf文件转换成xacro文件

solidwork导出的/urdf包复制到工作空间内,新建myrobot_description.urdf.xacro文件,并 参考进行修改即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0"?>
<robot name="myrobot_description" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!-- 原myrobot_description.urdf文件的内容 -->

      <!-- Transmissions for ROS Control -->
    <xacro:macro name="transmission_block" params="joint_name">
        <transmission name="tran1">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
            </joint>
            <actuator name="motor1">
                <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>
<!-- 添加关节名 -->
    <xacro:transmission_block joint_name="base_link_to_link_02"/>
    <xacro:transmission_block joint_name="link_02_to_link_03"/>
    <xacro:transmission_block joint_name="link_03_to_link_04"/>
    <xacro:transmission_block joint_name="link_04_to_link_05"/>
    <xacro:transmission_block joint_name="link_05_to_link_06"/>
    <xacro:transmission_block joint_name="finger_joint"/>

    <!-- ros_control plugin -->
    <gazebo>
        <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
            <robotNamespace>/myrobot_description</robotNamespace>
        </plugin>
    </gazebo>

</robot>

当然这只是文件格式上靠上了xacro,具体的应该仔细学学roswiki关于xacro语法的介绍,毕竟这么费劲改成了xacro格式就是为了以后调参能够方便一点.

几种文件形式的使用

.obj+.mtl->blender->.dae/.stl 参考

.obj/.stl/.dae->VREP(import mesh)->.ttm 参考

.stl->solidwork->.urdf

  • 存放obj格式文件的地方一般还会有同名的mtl格式文件,obj存放的是几何定义,mtl存放的是材质,直接导入obj,关联的mtl也会导入了,导入后按”Alt + z”来开启texture shading就可以看到有材质的模型了。另外blender界面太棒了…

多图预警

所以接下来几天打算专注一下blender的学习,大致确定一下建模方向,记录一下需要注意的地方以及遇到的几个问题。

「 快 捷 键 」
小键盘 1-正视 3-侧视 7-俯视 [+ctrl到对面]
g 移动物体 [gg 沿环线移动]
ctrl+r 添加循环边 [拓扑学]
编辑模式下--
i 内嵌面
e 挤出 [侧描轮廓(添加背景图,添加镜像),内凿]
shift+d 选中面后倒角
shift+s 在选中的面上放光标--改变物体初始位置--shift+a后s缩放即可准确放置

「 工 具 类 」
布尔:消去选中物体与相交物体的交集--轮毂 车轮
表面细分:在容器内进行物体填充,多用于制作边缘柔顺的物体--床垫 枕头
镜像:复杂的对称性物体--小车 步枪

「 注 意 点 」

问题一

缩放的比例:使用其他人工程中的物体调整好大小后会发现比例并不对,这样导出的零件格式不统一,再次使用的时候大小方向都恢复到原来的比例重新调节费时费力,所以在导出dae文件的时候应该重新设置比例大小,并且将位置初始化.
1、将调整好大小角度的物体X放置在原点,xyz比例非1.
2、创建新的立方体,调整大小把物体X完全罩住.
3、选中立方体,添加布尔工具,操作为交集,对物体X作用并应用.
4、删掉原来物体X,给新的模型添加其他属性即可.

问题二

物体的原点设置:一个小黄点
物体的合并、编辑等均会使原点出现偏移,然而机械设计讲究精密,所以出图的时候一定要将其回归到物体合理的位置上,并且将xyz+rpy均归零单独导出供urdf调用(物体->原点->质心)

问题三

使用贴图功能
参考32分钟部分步骤方法,下面总结部分未提及的内容:
1、选中要贴图的部分,添加材料属性并指定,注意基础色采用纹理图像纹理选项,加载所要贴的图片
2、编辑模式下选择要贴图的面,快捷键u将面展开,然后打开uvediting界面
3、使用s g等常规操作进行位置的调整即可

成果

3月1日第一个半成品:

3月3日第一个成品:

视频链接

https://youtu.be/Ssp2Lw6Yzzw


本文中使用blender对m100结构等进行二次精确开发设计,各个零件的导出文件以及设计工程已经放在了Github,算是整合了好几个工程中有用的部分,后面会跟同伴创建Organizations将工程一起放进去Github.