具体过程可参考
从零开始的ROS机械臂,边学边做03-SW2URDF篇 https://www.jianshu.com/p/040635e4d8c8
Solidworks 2016中导出URDF文件 https://www.cnblogs.com/21207-iHome/p/7821269.html
Solidworks模型转化为URDF文件格式+三连杆机械臂示例+逆运动学 https://blog.csdn.net/gpeng832/article/details/73917487
相关总结:
## SolidWorks中,仿真模型的相关设置
- 建立轴和坐标系需要在装配体环境下,零件环境下建立的轴和坐标系不能在导出时使用(坐标系之间的相对关系错乱);
- 其它软件生成的中性文件,也可在solidworks中组装后,用sw2urdf插件导出urdf文件;
- 1.子连杆必须指定,否则在previe and export时,会报错:“未将对象引用设置到对象的实例”;
- - 对于末端参考点,可通过dumy link形式增加,后续有介绍;
- 关节类型为fixed,其轴线可以不指定,但关节名必须给定,否则previe and export时,会提示;
- 设置完所有link和joint,选择导出,如果关节是旋转关节,则需要设置限制参数;
- - lower、upper、velocity合理设置,否则关节可能不动;
- - gazebo仿真时,关节 effort 不能为0,否则无法驱动;
- 默认生成的package.xml里的email是不合法的,要改成合法的,如<maintainer email="yzy@gmail.com" />;
- - 这个在2018版本以后已经修正
- display.launch文件里的里的False改为True,否则无法打开Joint State Publish工具;
- - kinetic版本以后,joint-state-publisher变成joint-state-publisher-gui,还需安装 sudo apt-get install ros-kinetic-joint-state-publisher-gui
- 启动display.launch以后,在rviz的界面中将Global Options下的Fixed Frame 由map改为base_link(自己定义的基座的名字);
- Joint axis的方向定义在Joint frame中,而Joint frame(即子坐标系)则相对于其父坐标系Parent frame定义;
- 错误: (使用rviz中,使用motion plan选项时)
[ERROR] [1531378477.804970828]: Robot semantic description not found. Did you forget to define or remap '/robot_description_semantic'?
原因:没有运行moveIt!
请先运行MoveIt!
- gazebo.launch,打开时,各关节未定义驱动;直接在重力作用下自由晃动;
- - 需在urdf文件中,增加gazebo中的相关配置;
- <robotname>_control package
- - 定义每个关节控制器,控制器种类、pid参数等
- - 仿着写!
[ WARN] [1572440451.309709717]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF.
- - 注释掉URDF文件中 base_link的<inertia>...</inertia>属性部分;会报错,不行!
- - 以下是个解决方案:增加dummy link
- - 若不root link 不是dummy link,则KDL计算动力学时,也会将该root link包括在内,整体会晃动、未固定!
<link name="dummy">
</link>
<link name="base_link">
<inertial>
<origin xyz="0.15 0.15 .2" rpy="0 0 0"/>
<mass value="10"/>
<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.01 0.01 0.01"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.01 0.01 0.01"/>
</geometry>
</collision>
</link>
<joint name="dummy_joint" type="fixed">
<parent link="dummy"/>
<child link="base_link"/>
</joint>
- 末端参考点,如TCP和fingertip,也可通过增加虚拟连杆的形式增加;
<link
name="dummy">
</link>
<joint
name="dummy_joint"
type="fixed">
<origin
xyz="0.024 0 0"
rpy="1.5708 0 1.5708" />
<parent
link="link1" />
<child
link="dummy" />
<axis
xyz="0 0 0" />
</joint>
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find two_finger_module)/urdf/two_finger_module.urdf -urdf -model two_finger_module -z 0.2 -r 1" />
- 此处 -z 0.2 是将仿真模型放置于环境中(0,0,200mm)处; -r 还不知具体含义?
先启动display.launch再启动gazebo.launch,Rviz中RobotModel项就会有如下报错:
突然报错:Status erro
- No transform from [link0_left] to [base_link]
sudo apt-get install unicode 后,也会出现该情况;未解决?
# 异常:
- 设置完各关节的控制器以后,gazebo中打开,零件飞起、散落
- - 不加控制器时,不会飞落;应该是控制器相关参数设置导致的;
- - gazebo仿真时,关节 effort 为0,无法驱动,在重力作用下会自由晃动。
- - 由于采用的是effort_controllers/JointPositionController,涉及到力控
- - - 调节PID参数和各连杆转动惯量;
- - - 转动惯量放大1.0E-04 到 1.0E-05倍
- - - 给定目标关节角,看是否有超调现象,调节PID参数;
control 依赖于 robot_description;
# 检查URDF语法:在urdf文件所在目录打开终端: check_urdf two_finger_module.urdf
## sudo apt install liburdfdom-tools
robot name is: two_finger_module
---------- Successfully Parsed XML ---------------
root Link: base_link has 2 child(ren)
child(1): link0_left
child(1): link1_left
child(1): link2_left
child(1): link3_left
child(1): link4_left
child(1): tip_left
child(2): link0_right
child(1): link1_right
child(1): link2_right
child(1): link3_right
child(1): link4_right
child(1): tip_right
##### gazebo仿真相关配置:
- 在urdf文件中,增加gazebo相关属性配置;
- 设置关节控制器 --- 否则关节会在重力作用下, 自由晃动;
- - <robotname>_control package 定义每个关节控制器,控制器种类、pid参数等, 仿着写!
相关问题解决:
- 设置完各关节的控制器以后,gazebo中打开,零件飞起、散落;不加控制器时,不会飞落;应该是控制器相关参数设置导致的;
- - 由于采用的是effort_controllers/JointPositionController,涉及到力控
- - - 调节PID参数和各连杆转动惯量;
- - - 转动惯量放大1.0E-04 到 1.0E-05倍
- - - 给定目标关节角,看是否有超调现象,调节PID参数;
control 依赖于 robot_description;
#### 对灵巧手或其它具有较多相同模块的机器人,urdf文件生成
- 相同模块生成一次,接口部分统一;
- 注意:joint转动轴线 必须在 子连杆坐标轴上;
- 坐标系必须与连杆绑定;
<!-- 此标记中间模块,为结构上的共用模块,五个手指可共用相同的STL文件,但XML文件中,link和joint的名称不能相同,必须唯一-->
<link>.STL文件,是包含坐标系的3D图形文件
导出文件时,sw2urdf工具,将3维模型及指定的坐标系相关联,生成对应连杆的STL文件;
连杆的相对位置,由<joint>中的<origin>属性指定,xyzrpy设定了child连杆在parent连杆坐标系中的位姿;关节轴,是child连杆坐标系的某一坐标轴;
sw2urdf工具导出的urdf文件,往往会有错误,如:Rviz显示时,某些零件相对位置反了,这就是因为<joint>中的<origin>属性的rpy角度生成错误,需要手动修正;
#### 相关问题:
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find two_finger_module)/urdf/two_finger_module.urdf -urdf -model two_finger_module -z 0.2 -r 1" />
- 此处 -z 0.2 是将仿真模型放置于环境中(0,0,200mm)处; -r 还不知具体含义?
- 先启动display.launch再启动gazebo.launch,Rviz中RobotModel项就会有如下报错:
突然报错:Status erro
- No transform from [link0_left] to [base_link]
sudo apt-get install unicode 后,也会出现该情况;未解决?
[ WARN] [1572440451.309709717]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF.
- - 注释掉URDF文件中 base_link的<inertia>...</inertia>属性部分;会报错,不行!
- - 以下是个解决方案:增加dummy link
- - 若root link 不是dummy link,则KDL计算动力学时,也会将该root link包括在内,整体会晃动、未固定!
<link name="dummy">//world
</link>
<link name="base_link">
<inertial>
<origin xyz="0.15 0.15 .2" rpy="0 0 0"/>
<mass value="10"/>
<inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.01 0.01 0.01"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.01 0.01 0.01"/>
</geometry>
</collision>
</link>
<joint name="dummy_joint" type="fixed">
<parent link="dummy"/>
<child link="base_link"/>
</joint>
No transform from [thumb_l1] to [base_link]
# xacro的使用
- 使用宏定义,简化urdf文件,增加模块复用率;
[WARN]: Controller Spawner couldn't find the expected controller_manager ROS Interface
1.ros-kinetic-gazebo-ros-control未安装
解决方法:sudo apt-get install ros-kinetic-gazebo-ros-control
2.urdf文件, gazebo-ros-control 的 robotNamespace未配置正确
<gazebo>
<plugin filename="libgazebo_ros_control.so" name="gazebo_ros_control">
</plugin>
</gazebo>
改为:
<gazebo>
<plugin filename="libgazebo_ros_control.so" name="gazebo_ros_control">
<robotNamespace>/robot_hand_left</robotNamespace>
</plugin>
</gazebo>