ROS機(jī)器人URDF建模

      網(wǎng)友投稿 1216 2022-05-30

      在閱讀本文之前,推薦閱讀前篇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代碼為:

      Gazebo/Green

      false

      簡(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}" />

      ROS機(jī)器人URDF建模

      transmission_interface/SimpleTransmission

      hardware_interface/EffortJointInterface

      hardware_interface/EffortJointInterface

      1

      transmission_interface/SimpleTransmission

      hardware_interface/EffortJointInterface

      hardware_interface/EffortJointInterface

      1

      /cozmo

      10.0

      1.3962634

      400

      400

      R8G8B8

      0.01

      100

      gaussian

      0.0

      0.007

      true

      10.0

      cozmo_camera

      image

      camera_info

      camera_link

      0.07

      0.0

      0.0

      0.0

      0.0

      0.0

      0 0 0 0 0 0

      true

      50

      10

      1

      -0.14835

      0.14835

      10

      1

      -0.14835

      0.14835

      0.01

      2

      0.02

      0.005

      true

      50

      drop_sensor

      drop_ir

      INFRARED

      0.2967

      true

      true

      100

      true

      __default_topic__

      imu

      imu

      10.0

      ${0.0017*0.0017}

      0 0 0

      0 0 0

      imu

      0 0 0 0 0 0

      25.0

      /

      base_to_flw

      base_to_frw

      base_to_rlw

      base_to_rrw

      0.048

      0.04

      base_link

      20

      cmd_vel

      cmd_vel

      odom

      odom

      1

      注意,加載紋理的部分:

      對(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)角具有一定的限制。

      標(biāo)簽用于選擇以下屬性:effort關(guān)節(jié)所承受的最大力,lower賦值給關(guān)節(jié)的下限(旋轉(zhuǎn)接頭revolute joint的單位是弧度,帶滑移鏈prismatic joint的單位是米),upper賦值給關(guān)節(jié)的上限,velocity強(qiáng)制關(guān)節(jié)的最大速度。

      物理和碰撞屬性

      如果想在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)容。

      上一篇:項(xiàng)目管理常用術(shù)語(yǔ)
      下一篇:怎么制作Excel表格的半圓圓環(huán)圖
      相關(guān)文章
      亚洲av片劲爆在线观看| 亚洲一区二区视频在线观看| 亚洲真人日本在线| 在线精品亚洲一区二区 | 亚洲六月丁香六月婷婷蜜芽| 亚洲av永久无码精品漫画| 亚洲精品无码成人片久久| 曰韩亚洲av人人夜夜澡人人爽| 亚洲女同成人AⅤ人片在线观看| 亚洲av永久无码一区二区三区| 亚洲精华液一二三产区| 亚洲中文字幕AV每天更新| 亚洲一本一道一区二区三区| 亚洲色一区二区三区四区| 亚洲日本一线产区和二线| 亚洲乱色熟女一区二区三区蜜臀| 亚洲色成人网站WWW永久四虎 | 亚洲性猛交xx乱| 亚洲区视频在线观看| 亚洲另类图片另类电影| 亚洲三级视频在线| 亚洲日韩看片无码电影| 久久亚洲精品成人无码| 亚洲国产精品丝袜在线观看| 亚洲人成国产精品无码| 久久夜色精品国产亚洲av| 亚洲精品国产精品乱码不卡√| 国产AV无码专区亚洲AV男同| 亚洲成a人片77777老司机| 亚洲高清视频免费| 亚洲一卡二卡三卡四卡无卡麻豆| 中文字幕无码亚洲欧洲日韩| 亚洲av日韩综合一区二区三区| 在线观看亚洲精品专区| 午夜亚洲福利在线老司机| 国产亚洲成归v人片在线观看 | 亚洲精品无码久久久久A片苍井空| 亚洲国产AV一区二区三区四区| 亚洲AV无码成人精品区大在线| 国产亚洲AV手机在线观看| 亚洲AV无码一区二区二三区软件 |