具體過程可參考:
從零開始的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時,會報錯:“未將對象引用設置到對象的實例”;
- - 對於末端參考點,可建立一小物體,嵌入、固聯於末端連桿;
- 關節類型爲fixed,其軸線可以不指定,但關節名必須給定,否則previe and export時,會提示;
- 設置完所有link和joint,選擇導出,如果關節是旋轉關節,則需要設置限制參數;
- 默認生成的package.xml裏的email是不合法的,要改成合法的,如<maintainer email="[email protected]" />;
- display.launch文件裏的裏的False改爲True,否則無法打開Joint State Publish工具;
- 啓動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中打開,零件飛起、散落
- - 不加控制器時,不會飛落;應該是控制器相關參數設置導致的;
- - 由於採用的是effort_controllers/JointPositionController,涉及到力控
- - - 調節PID參數和各連桿轉動慣量;
- - - 轉動慣量放大1.0E-04 到 1.0E-05倍
- - - 給定目標關節角,看是否有超調現象,調節PID參數;
control 依賴於 robot_description;
# 檢查URDF語法:在urdf文件所在目錄打開終端: check_urdf two_finger_module.urdf
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