• ROS1云课→16机器人模型从urdf到xacro


    ROS1云课→15主题与坐标系


    补充:

    2020:ROS机器人URDF建模_zhangrelay的博客-CSDN博客

    2022:URDF机器人模型ROS1&2案例(noetic+galactic)_zhangrelay的博客-CSDN博客 


    这里,先回顾一下概念:

    ROS中自定义机器人的3D模型

    机器人3D模型或部分结构模型主要用于仿真机器人或者为了帮助开发者简化他们的常规工作,在ROS中通过URDF文件实现。

    标准化机器人描述格式(Unified Robot Description Format , URDF)是一种用于描述机器人及其部分结构、关节、自由度等的XML格式文件。每次在ROS系统中看到3D机器人都会有URDF文件与之对应,例如PR2(Willow Garage)或者Robonaut(NASA)。在下面的小节中我们将会学习如何创建这种文件和格式用于定义不同的值。

    云端支持所有ROS1/2机器人模型,使用功能包安装并使用吧^_^

    通常机器人描述文件功能包格式:

    ros-版本号-机器人名称-description

    一个简单差动小车: 

     


    ROS官方给出了urdf的教程,非常详细,自主学习即可。

    xacroXML Macros的简写)可帮助压缩URDF文件的大小,并且增加文件的可读性和可维护性。它还允许我们创建模型并复用这些模型去创建相同的结构。

    此处只补充一些案例,这部分ROS1/2基本通用。

    在教程中有一个常用的指令:

    roslaunch urdf_tutorial display.launch model:=xxx.urdf.xacro


    好了,安装一些案例并且使用rviz查看这些案例的模型:

    1. 工业机械臂
    2. 移动机器人
    3. 移动协作机器人

     1. roslaunch urdf_tutorial display.launch model:=irb4400l_30_243.xacro

    2.  roslaunch urdf_tutorial display.launch model:=husky.urdf.xacro

    3.  roslaunch urdf_tutorial display.launch model:=pr2.urdf.xacro


    其实,这部分和机械制图类似,就靠多练习,没啥特别技术,主要是建模。

    以pr2为例:

    1. "1.0"?>
    2. <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="pr2" >
    3. <xacro:include filename="$(find pr2_description)/urdf/common.xacro" />
    4. <xacro:include filename="$(find pr2_description)/urdf/shoulder_v0/shoulder.urdf.xacro" />
    5. <xacro:include filename="$(find pr2_description)/urdf/upper_arm_v0/upper_arm.urdf.xacro" />
    6. <xacro:include filename="$(find pr2_description)/urdf/forearm_v0/forearm.urdf.xacro" />
    7. <xacro:include filename="$(find pr2_description)/urdf/gripper_v0/gripper.urdf.xacro" />
    8. <xacro:include filename="$(find pr2_description)/urdf/head_v0/head.urdf.xacro" />
    9. <xacro:include filename="$(find pr2_description)/urdf/tilting_laser_v0/tilting_laser.urdf.xacro" />
    10. <xacro:include filename="$(find pr2_description)/urdf/torso_v0/torso.urdf.xacro" />
    11. <xacro:include filename="$(find pr2_description)/urdf/base_v0/base.urdf.xacro" />
    12. <xacro:include filename="$(find pr2_description)/urdf/sensors/head_sensor_package.urdf.xacro" />
    13. <xacro:include filename="$(find pr2_description)/urdf/sensors/wge100_camera.urdf.xacro" />
    14. <xacro:include filename="$(find pr2_description)/urdf/sensors/projector_wg6802418.urdf.xacro" />
    15. <xacro:include filename="$(find pr2_description)/gazebo/gazebo.urdf.xacro" />
    16. <xacro:include filename="$(find pr2_description)/urdf/materials.urdf.xacro" />
    17. <xacro:pr2_base_v0 name="base"/>
    18. <xacro:pr2_torso_v0 name="torso_lift" parent="base_link">
    19. <origin xyz="-0.05 0 0.739675" rpy="0 0 0" />
    20. xacro:pr2_torso_v0>
    21. <xacro:pr2_head_v0 name="head" parent="torso_lift_link">
    22. <origin xyz="-0.01707 0.0 0.38145"
    23. rpy="0.0 0.0 0.0" />
    24. xacro:pr2_head_v0>
    25. <xacro:pr2_head_sensor_package_v0 name="sensor_mount" hd_frame_name="high_def"
    26. hd_camera_name="prosilica"
    27. stereo_name="double_stereo"
    28. parent="head_plate_frame">
    29. <origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
    30. xacro:pr2_head_sensor_package_v0>
    31. <xacro:projector_wg6802418_v0 name="projector_wg6802418" parent="head_plate_frame" >
    32. <origin xyz="0 0.110 0.0546" rpy="0 0 0" />
    33. xacro:projector_wg6802418_v0>
    34. <xacro:pr2_tilting_laser_v0 name="laser_tilt" parent="torso_lift_link" laser_calib_ref="0.0">
    35. <origin xyz="0.09893 0 0.227" rpy="0 0 0" />
    36. xacro:pr2_tilting_laser_v0>
    37. <xacro:pr2_shoulder_v0 side="r" reflect="-1" parent="torso_lift_link">
    38. <origin xyz="0.0 -0.188 0.0" rpy="0 0 0" />
    39. xacro:pr2_shoulder_v0>
    40. <xacro:pr2_upper_arm_v0 side="r" reflect="-1" parent="r_upper_arm_roll_link"/>
    41. <xacro:pr2_forearm_v0 side="r" reflect="-1" parent="r_forearm_roll_link">
    42. <origin xyz="0 0 0" rpy="0 0 0" />
    43. xacro:pr2_forearm_v0>
    44. <xacro:pr2_gripper_v0 reflect="-1.0" side="r" parent="r_wrist_roll_link"
    45. screw_reduction="${4.0/1000.0}"
    46. gear_ratio="${(729.0/25.0)*(22.0/16.0)}"
    47. theta0="${3.6029*M_PI/180.0}"
    48. phi0="${29.7089*M_PI/180.0}"
    49. t0="${-0.1914/1000.0}"
    50. L0="${37.5528/1000.0}"
    51. h="${0.0/1000.0}"
    52. a="${68.3698/1000.0}"
    53. b="${43.3849/1000.0}"
    54. r="${91.5/1000.0}" >
    55. <origin xyz="0 0 0" rpy="0 0 0" />
    56. xacro:pr2_gripper_v0>
    57. <xacro:pr2_shoulder_v0 side="l" reflect="1" parent="torso_lift_link">
    58. <origin xyz="0.0 0.188 0.0" rpy="0 0 0" />
    59. xacro:pr2_shoulder_v0>
    60. <xacro:pr2_upper_arm_v0 side="l" reflect="1" parent="l_upper_arm_roll_link"/>
    61. <xacro:pr2_forearm_v0 side="l" reflect="1" parent="l_forearm_roll_link">
    62. <origin xyz="0 0 0" rpy="0 0 0" />
    63. xacro:pr2_forearm_v0>
    64. <xacro:pr2_gripper_v0 reflect="1.0" side="l" parent="l_wrist_roll_link"
    65. screw_reduction="${4.0/1000.0}"
    66. gear_ratio="${(729.0/25.0)*(22.0/16.0)}"
    67. theta0="${3.6029*M_PI/180.0}"
    68. phi0="${29.7089*M_PI/180.0}"
    69. t0="${-0.1914/1000.0}"
    70. L0="${37.5528/1000.0}"
    71. h="${0.0/1000.0}"
    72. a="${68.3698/1000.0}"
    73. b="${43.3849/1000.0}"
    74. r="${91.5/1000.0}" >
    75. <origin xyz="0 0 0" rpy="0 0 0" />
    76. xacro:pr2_gripper_v0>
    77. <xacro:wge100_camera_v0 name="l_forearm_cam" image_format="R8G8B8" camera_name="l_forearm_cam" image_topic_name="image_raw"
    78. camera_info_topic_name="camera_info"
    79. parent="l_forearm_roll_link" hfov="90" focal_length="320.000105"
    80. frame_id="l_forearm_cam_optical_frame" hack_baseline="0"
    81. image_width="640" image_height="480">
    82. <origin xyz=".135 0 .044" rpy="${-M_PI/2} ${-32.25*M_PI/180} 0" />
    83. xacro:wge100_camera_v0>
    84. <xacro:wge100_camera_v0 name="r_forearm_cam" image_format="R8G8B8" camera_name="r_forearm_cam" image_topic_name="image_raw"
    85. camera_info_topic_name="camera_info"
    86. parent="r_forearm_roll_link" hfov="90" focal_length="320.000105"
    87. frame_id="r_forearm_cam_optical_frame" hack_baseline="0"
    88. image_width="640" image_height="480">
    89. <origin xyz=".135 0 .044" rpy="${M_PI/2} ${-32.25*M_PI/180} 0" />
    90. xacro:wge100_camera_v0>
    91. <xacro:arg name="KINECT1" default="false" />
    92. <xacro:arg name="KINECT2" default="false" />
    93. <xacro:if value="$(arg KINECT2)">
    94. <xacro:include filename="$(find pr2_description)/urdf/sensors/kinect2.urdf.xacro" />
    95. <xacro:kinect2_v0 name="head_mount" parent="head_plate_frame" >
    96. <origin xyz="-0.137376 0 0.091746" rpy="0 0 0" />
    97. xacro:kinect2_v0>
    98. xacro:if>
    99. <xacro:unless value="$(arg KINECT2)">
    100. <xacro:if value="$(arg KINECT1)">
    101. <xacro:include filename="$(find pr2_description)/urdf/sensors/kinect_prosilica_camera.urdf.xacro" />
    102. <xacro:kinect_prosilica_camera_swept_back_v0 name="head_mount" parent="head_plate_frame" >
    103. <origin xyz="-0.137376 0 0.091746" rpy="0 0 0" />
    104. xacro:kinect_prosilica_camera_swept_back_v0>
    105. xacro:if>
    106. xacro:unless>
    107. robot>

    其中,tf特别复杂:


    思考:

    如何移动机器人,必须了解ROS中一些通常使用的tf坐标系,如mapodombase_link。map tf坐标系是世界固连坐标系,它可用于长时间的全局参考。odom坐标系可用于精确的、短时间的局部参考。base_link与移动机器人的底座严格相连。通常这些坐标系是相互关联的,它们之间的关系可通过图形表示为map | odom | base_link。 


     

  • 相关阅读:
    驱动初级Day03_内核模块下_参数和依赖
    Conda常用命令及Pycharm使用虚拟环境
    sql语句数据库查询:如果当前元素已经使用过,下拉框不显示该元素该如何查询?
    Java 关键字:synchronized详解
    互联网那些技术 | 秒杀库存解决方案
    JVM - 双亲委派
    spring框架历史漏洞复现
    低代码引擎半岁啦,来跟大家唠唠嗑...
    计算机网络八股文复习
    自定义类型转换函数operator MyInt()
  • 原文地址:https://blog.csdn.net/ZhangRelay/article/details/126670468