1、程序功能说明

小车启动,终端运行程序,rviz中会显示URDF模型。

2、进入小车docker

打开终端输入以下指令进入docker:

./docker_ros2.sh

出现以下界面就是进入docker成功,现在即可通过指令控制小车,

image-20240814152903441

3、程序启动

加载URDF和生成一个模拟控制器并且启动rviz,终端输入,

ros2 launch yahboomcar_description display_launch.py

image-20240815161831838

然后,用鼠标调整视角,滑动刚才生成的模拟控制器,即可看的小车的轮胎/相机在变化,

image-20240814194923976

  • l1_Joint:控制左前轮
  • l2_Joint:控制左后轮
  • r1_Joint:控制右前轮
  • r2_Joint:控制右后轮
  • arm1_Joint:控制云台1
  • arm2_Joint:控制云台2
  • Randomize:随机发布数值到各个joint
  • Center:所有的Joint归中

4、源程序代码

from ament_index_python.packages import get_package_share_path
​
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import Command, LaunchConfiguration
​
from launch_ros.actions import Node
from launch_ros.parameter_descriptions import ParameterValue
​
def generate_launch_description():
    urdf_tutorial_path = get_package_share_path('yahboomcar_description')
    default_model_path = urdf_tutorial_path / 'urdf/Raspbot-V2.urdf'
    default_rviz_config_path = urdf_tutorial_path / 'rviz/raspbotv2.rviz'
​
    model_arg = DeclareLaunchArgument(name='model', default_value=str(default_model_path),
                                      description='Absolute path to robot urdf file')
    robot_description = ParameterValue(Command(['xacro ', LaunchConfiguration('model')]),
                                       value_type=str)
    rviz_arg = DeclareLaunchArgument(name='rvizconfig', default_value=str(default_rviz_config_path),
                                     description='Absolute path to rviz config file')
    
    robot_state_publisher_node = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        parameters=[{'robot_description': robot_description}]
    )
​
    joint_state_publisher_gui_node = Node(
        package='joint_state_publisher_gui',
        executable='joint_state_publisher_gui'
    )
​
    
    tf_base_footprint_to_base_link = Node(
        package='tf2_ros',
        executable='static_transform_publisher',
        arguments=['0', '0', '0.05', '0.0', '0.0', '0.0', 'base_footprint', 'base_link'],
    )
    
    rviz_node = Node(
        package='rviz2',
        executable='rviz2',
        name='rviz2',
        output='screen',
        arguments=['-d', LaunchConfiguration('rvizconfig')],
    )
    return LaunchDescription([
        model_arg,
        joint_state_publisher_gui_node,
        robot_state_publisher_node,
        tf_base_footprint_to_base_link,
        rviz_arg,
        rviz_node
    ])
  • model_arg:加载模型参数,加载的模型为Raspbot-V2.urdf
  • joint_state_publisher_gui_node:发布sensor_msgs/JointState消息
  • robot_state_publisher_node:机器人状态发布
  • tf_base_footprint_to_base_link:发布base_footprint到base_link的静态变换

5、URDF模型

        URDF,全称为 Unified Robot Description Format ,翻译为中文为统一机器人描述性格式,是一种使用xml格式描述的机器人模型文件,类似于D-H参数。

<?xml version="1.0" encoding="utf-8"?>

第一行为xml必填项,描述了xml的版本信息。

<robot

        name="RaspbotV2">

</robot>

第二行描述了当前的机器人名称;当前机器人所有信息均包含在【robot】标签内。

5.1、组成部分

  • link,连杆,可以想象成是人的手臂
  • joint,关节,可以想象成是人的手肘关节

        link与joint的关系:两个link之间通过关节连接起来,想象成手臂有小臂(link)和大臂(link)通过肘关节(joint)连接。

5.1.1、link

1)简介

在URDF描述性语言中,link是用来描述物理特性的,

  • 描述视觉显示, 标签。
  • 描述碰撞属性, 标签。
  • 描述物理惯性, 标签不常用。

        Links还可以描述连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等,每个Link会成为一个坐标系。

2)示例代码

<link
    name="base_link">
    <inertial>
      <origin
        xyz="0.013209067968915 0.000305835286849597 0.034565647785585"
        rpy="0 0 0" />
      <mass
        value="0.315736522899678" />
      <inertia
        ixx="0.000126930677782624"
        ixy="-1.93570093947537E-07"
        ixz="-3.2159760519397E-08"
        iyy="0.000217028578454845"
        iyz="3.16386759318505E-07"
        izz="0.000309637617387382" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://yahboomcar_description/meshes/base_link.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.203921568627451 0.203921568627451 0.203921568627451 1" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://yahboomcar_description/meshes/base_link.STL" />
      </geometry>
    </collision>
  </link>

3)标签介绍

  • origin:描述的是位姿信息; xyz 属性描述的是在大环境中的坐标位置, rpy 属性描述的是自身的姿态。

  • mess:描述的是link的质量。

  • inertia:惯性参考系,由于转动惯性矩阵的对称性,只需要6个上三角元素 ixx, ixy, ixz, iyy, iyz, izz作为属性。

  • geometry:标签描述的是形状; mesh 属性主要的功能是去加载纹理文件的, filename 属性纹理路径的文件地址

  • material:标签描述的是材质; name 属性为必填项,可以为空,可以重复 。通过【color】标签中的 rgba属性来描述红、绿、蓝、透明度,中间用空格分隔。

5.1.2、joints

1)简介

描述两个关节之间的关系,运动位置和速度限制,运动学和动力学属性。关节类型有以下几种:

  • fixed:固定关节。不允许运动,起连接作用。
  • continuous:旋转关节。可以持续旋转,没有旋转角度的限制。
  • revolute:旋转关节。类似于continuous,有旋转角度的限制。
  • prismatic:滑动关节。沿某一轴线移动,有位置限制。
  • floating:悬浮关节。具备六个自由度,3T3R。
  • planar:平面关节。允许在平面正交上方平移或者旋转。

2)示例代码

 <joint
    name="arm1_Joint"
    type="revolute">
    <limit effort="100" velocity="1" lower="-1.57" upper="1.57"/>
    <origin
      xyz="0.058 0 0.0575"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="arm1_Link" />
    <axis
      xyz="0 0 1" />
    <limit
      lower="0"
      upper="0"
      effort="0"
      velocity="0" />
  </joint>

        在【joint】标签中 name 属性是 必填项,描述关节的名称,并且是唯一。在【joint】标签中 type 属性,对应填写六大关节类型。

3)标签介绍

  • origin:子标签,指的是旋转关节于 parent 所在坐标系的相对位置。
  • parent,child:parent,child子标签代表的是两个要连接的link;parent是参照物,child围绕着praent旋转。
  • axis:子标签表示child对应的link围绕哪一个轴(xyz)旋转和述绕固定轴的旋转量。
  • limit:子标签主要是限制child的。 lower 属性和 upper 属性限制了旋转的弧度范围, effort 属性限制的是转动过程中的受力范围。(正负value值,单位为牛或N), velocity 属性限制了转动时的速度,单位为米/秒或m/s。
  • mimic:描述该关节与已有关节的关系。
  • safety_controller:描述安全控制器参数。保护机器人关节的运动。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐