ROS機(jī)器人URDF建模
在閱讀本文之前,推薦閱讀前篇ROS機(jī)器人TF基礎(chǔ)和全部資料文檔:
TF基礎(chǔ):https://blog.csdn.net/ZhangRelay/article/details/108374509
全文檔:https://blog.csdn.net/ZhangRelay/article/details/108192167
所有內(nèi)容均在ROS1 indigo,kinetic,melodic,noetic以及ROS2 dashing,foxy等測(cè)試通過(guò)。
但介紹以noetic和foxy為主。
在ROS中自定義機(jī)器人的3D模型
機(jī)器人模型通常為移動(dòng)機(jī)器人和工業(yè)機(jī)械臂,那么如果在rviz中進(jìn)行三維可視化的URDF模型設(shè)計(jì)呢?
先看如下兩副截圖(點(diǎn)擊可看大圖,細(xì)節(jié)清晰):
參考命令:
ros2 launch urdf_tutorial display.launch.py model:=/home/ros/RobCode/urdf_tutorial/src/urdf/magician.urdf
/\/\/\移動(dòng)機(jī)器人案例如上/\/\/\
參考命令:
ros2 launch urdf_tutorial display.launch.py model:=/home/ros/RobCode/urdf_tutorial/src/urdf/cozmo2.urdf
/\/\/\工業(yè)機(jī)械臂案例如上/\/\/\
可以看到機(jī)器人各關(guān)節(jié)的坐標(biāo)以及非常精細(xì)的模型,并可以通過(guò)人機(jī)交互面板(joint_state_publisher)控制其狀態(tài)。
由此可知:
相比于仿真,雖然直接在一個(gè)真正的機(jī)器人上進(jìn)行編程能夠給我們最佳的反饋,并且也更加令人激動(dòng),但是并不是每個(gè)人都有機(jī)會(huì)接觸到真正的機(jī)器人?;谶@個(gè)原因,我們需要對(duì)整個(gè)物理世界進(jìn)行建模與仿真。機(jī)器人三維模型或部分結(jié)構(gòu)模型主要用于仿真機(jī)器人或者為了幫助開發(fā)者簡(jiǎn)化他們的常規(guī)工作,在ROS中通過(guò)URDF文件實(shí)現(xiàn)。標(biāo)準(zhǔn)化機(jī)器人描述格式(Unified Robot Description Format , URDF)是一種用于描述機(jī)器人及其部分結(jié)構(gòu)、關(guān)節(jié)、自由度等的XML格式文件。每次在ROS系統(tǒng)中看到3D機(jī)器人都會(huì)有URDF文件與之對(duì)應(yīng),例如PR2(Willow Garage)或者Robonaut(NASA)。在下面的章節(jié)中我們將會(huì)學(xué)習(xí)如何創(chuàng)建這種文件和格式用于定義不同的值。
在正式開啟之前,再觀看一個(gè)視頻,了解以下官方案例:
ros1ros2urdf
此部分介紹在ROSwiki中,不在此贅述。URDF模型在ROS1和ROS2中通用。
特別注意兩者launch文件差別:
ros1(indigo,kinetic,melodic,noetic):
ros2(dashing,foxy):
import launch
from launch.substitutions import Command, LaunchConfiguration
import launch_ros
import os
def generate_launch_description():
pkg_share = launch_ros.substitutions.FindPackageShare(package='urdf_tutorial').find('urdf_tutorial')
default_model_path = os.path.join(pkg_share, 'urdf/01-myfirst.urdf')
default_rviz_config_path = os.path.join(pkg_share, 'rviz/urdf.rviz')
robot_state_publisher_node = launch_ros.actions.Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{'robot_description': Command(['xacro ', LaunchConfiguration('model')])}]
)
joint_state_publisher_node = launch_ros.actions.Node(
package='joint_state_publisher',
executable='joint_state_publisher',
name='joint_state_publisher',
condition=launch.conditions.UnlessCondition(LaunchConfiguration('gui'))
)
joint_state_publisher_gui_node = launch_ros.actions.Node(
package='joint_state_publisher_gui',
executable='joint_state_publisher_gui',
name='joint_state_publisher_gui',
condition=launch.conditions.IfCondition(LaunchConfiguration('gui'))
)
rviz_node = launch_ros.actions.Node(
package='rviz2',
executable='rviz2',
name='rviz2',
output='screen',
arguments=['-d', LaunchConfiguration('rvizconfig')],
)
return launch.LaunchDescription([
launch.actions.DeclareLaunchArgument(name='gui', default_value='True',
description='Flag to enable joint_state_publisher_gui'),
launch.actions.DeclareLaunchArgument(name='model', default_value=default_model_path,
description='Absolute path to robot urdf file'),
launch.actions.DeclareLaunchArgument(name='rvizconfig', default_value=default_rviz_config_path,
description='Absolute path to rviz config file'),
joint_state_publisher_node,
joint_state_publisher_gui_node,
robot_state_publisher_node,
rviz_node
])
掌握此部分內(nèi)容非常重要,更具體的講解參考如下鏈接:
ROS 2啟動(dòng)-launch-:https://blog.csdn.net/ZhangRelay/article/details/103498784
機(jī)器人+復(fù)雜環(huán)境案例:https://blog.csdn.net/ZhangRelay/article/details/105707950
那么開始創(chuàng)建第一個(gè)URDF案例吧!
創(chuàng)建第一個(gè)URDF文件
一個(gè)四輪小車模型如下:
其urdf代碼為:
簡(jiǎn)單解釋一下,如需了解更全面具體的內(nèi)容參考(wiki.ros.org/urdf/XML)。
這些URDF代碼是基于XML的,這種格式并不強(qiáng)制縮進(jìn),但還是建議大家這么做。因此,建議大家使用一個(gè)支持縮進(jìn)的編輯器或者找到適當(dāng)插件并進(jìn)行配置(例如,比較好的是Vim中的.vimrc文件)。
解釋文件格式
如在代碼中所見,有兩種用于描述機(jī)器人幾何結(jié)構(gòu)的基本字段:連接(link)和關(guān)節(jié)(joint)。
如連接的名字是base_link(本體連接),這個(gè)名稱在文件中必須唯一。
為了定義我們?cè)诜抡姝h(huán)境中的物體,在前面的代碼中使用了visual字段。在代碼中你能夠定義幾何形狀(圓柱體、立方體、球體和紋理網(wǎng)格)、材質(zhì)(顏色和紋理)和原點(diǎn)。
然后使用以下代碼定義關(guān)節(jié):
在joint字段中,我們先定義名稱(名稱要求唯一)。然后定義關(guān)節(jié)類型(固定關(guān)節(jié)fixed,轉(zhuǎn)動(dòng)關(guān)節(jié)revolute,旋轉(zhuǎn)關(guān)節(jié)continuous,自由度浮動(dòng)關(guān)節(jié)floating,或平面運(yùn)動(dòng)關(guān)節(jié)planar),以及父連接坐標(biāo)系和子連接坐標(biāo)系(關(guān)節(jié)相連的前后坐標(biāo)系)。在本例中,wheel_1是base_link的子連接坐標(biāo)系。它是固定關(guān)節(jié)(fixed),但如果這個(gè)關(guān)節(jié)是一個(gè)輪軸,那么我們可以設(shè)置其為轉(zhuǎn)動(dòng)關(guān)節(jié)(revolute)。
關(guān)于urdf各類工具如check,tf等自行探索實(shí)踐!
使用如下命令查看模型:
ros2 launch urdf_tutorial display.launch.py model:=/home/ros/RobCode/urdf_tutorial/src/urdf/robot1_base1.urdf
如果使用ros1,將ros2 launch替換為roslaunch即可。
ROS1的urdf模型都可以直接移植到ROS2中,需要修改的代碼非常少,主要為launch和其他配置文件,如功能包名稱以及紋理材質(zhì)配置的路徑等。
加載紋理網(wǎng)格到機(jī)器人模型
以ROS1的cozmo模型為例:
izz="${0.0833333 * mass * (3 * radius * radius + length * length)}" iyz="0.0" iyy="${0.5 * mass * radius * radius}" /> 注意,加載紋理的部分: 對(duì)應(yīng)文件為: 有時(shí)候希望自己構(gòu)建的模型能夠更加真實(shí),并不是說(shuō)簡(jiǎn)單地增加更多的基本幾何形狀和模塊,而是通過(guò)添加更多的現(xiàn)實(shí)元素使模型變得更加豐富和細(xì)致。這就需要加載我們自行創(chuàng)建的紋理網(wǎng)格(mesh)或者使用其他機(jī)器人模型的紋理網(wǎng)格。URDF模型支持.stl和.dae格式的紋理網(wǎng)格。 使機(jī)器人模型運(yùn)動(dòng) 為了將模型轉(zhuǎn)換成能實(shí)際運(yùn)動(dòng)的機(jī)器人,我們唯一需要做的是檢查好所選用的關(guān)節(jié)類型。如果你檢查URDF模型文件,將會(huì)看到我們?cè)谀P椭惺褂昧瞬煌愋偷年P(guān)節(jié)。 要判斷關(guān)節(jié)的軸或轉(zhuǎn)動(dòng)限值是否合適,有一種好的辦法就是使用Join_State_Publisher圖形化用戶界面(GUI)。 這意味著它們能夠像旋轉(zhuǎn)關(guān)節(jié)一樣轉(zhuǎn)動(dòng),但是它們的轉(zhuǎn)動(dòng)角具有一定的限制。 物理和碰撞屬性 如果想在Gazebo或者其他仿真軟件中進(jìn)行機(jī)器人仿真,就需要添加物理屬性和碰撞屬性。這意味著我們需要設(shè)定幾何尺寸來(lái)計(jì)算可能的碰撞。例如,需要首先設(shè)定重量我們才能夠計(jì)算慣性等。 需要保證模型文件中的所有連接都有這些參數(shù),否則就無(wú)法對(duì)這些機(jī)器人進(jìn)行仿真。 對(duì)于紋理網(wǎng)格模型文件來(lái)說(shuō),使用簡(jiǎn)單的幾何形狀比實(shí)際的紋理網(wǎng)格模型更容易進(jìn)行碰撞計(jì)算。相比簡(jiǎn)單的幾何形狀,在兩個(gè)紋理網(wǎng)格模型之間進(jìn)行碰撞計(jì)算要使用更加復(fù)雜的計(jì)算方法,也會(huì)耗費(fèi)更多的計(jì)算資源。 注意: 對(duì)于其他的link也是如此。記住,要為所有l(wèi)ink添加collision和inertial元素,因?yàn)槿绻贿@樣做的話,Gazebo將無(wú)法使用這些模型。 當(dāng)然urdf的升級(jí)版為xacro——一種更好的機(jī)器人建模方法。 izz="${0.0833333 * mass * (3 * radius * radius + length * length)}" iyz="0.0" iyy="${0.5 * mass * radius * radius}" /> 后續(xù)博文再做詳細(xì)介紹吧。 思考與提升: 將ROS1中豐富的URDF模型移植到ROS2中吧^_^ 單片機(jī) 機(jī)器人
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。