跳到正文

Wiki

從零建立學習工作區

約 3 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

從本節開始,你親手建立學習工程。先只安裝模型和配置,不寫硬體 C++ 外掛。

1.示例 1:建立工作區與功能包

1.1.程式目標

建立 learn_control_hardware,先使用框架自帶的 GenericSystem 作為臨時硬體。等啟動鏈路跑通後,在從零編寫模擬硬體外掛換成自己寫的外掛。

開啟一個新的 Ubuntu 終端,只 source 系統 Humble:

source /opt/ros/humble/setup.bash
mkdir -p ~/ros2_control_humble_ws/src
cd ~/ros2_control_humble_ws/src
ros2 pkg create learn_control_hardware --build-type ament_cmake
cd learn_control_hardware
mkdir -p urdf config launch include/learn_control_hardware src

下面需要你編輯檔案。命令中的 ~ 指當前 Ubuntu 使用者的主目錄,例如 /home/你的用户名。後續工作區操作均使用普通使用者,不要給 colcon build 或建立原始碼檔案的命令新增 sudo。

1.2.檔案結構

learn_control_hardware/
├── CMakeLists.txt
├── package.xml
├── urdf/mini.urdf
├── config/                 下一节配置后续文件
├── launch/                 稍后编写启动文件
├── include/learn_control_hardware/
└── src/

1.3.完整 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(learn_control_hardware)
find_package(ament_cmake REQUIRED)
install(DIRECTORY urdf config launch DESTINATION share/${PROJECT_NAME})
ament_package()

install(DIRECTORY ...) 把執行所需資源安裝到 share 目錄。launch 中使用包的 share 路徑,所以必須安裝資源,而不能只把檔案留在原始碼目錄。

1.4.完整 package.xml

<?xml version="1.0"?>
<package format="3">
  <name>learn_control_hardware</name><version>0.0.1</version>
  <description>Humble learning hardware and bringup</description>
  <maintainer email="learner@example.com">Learner</maintainer>
  <license>Apache-2.0</license>
  <buildtool_depend>ament_cmake</buildtool_depend>
  <depend>hardware_interface</depend><depend>pluginlib</depend>
  <depend>rclcpp</depend><depend>rclcpp_lifecycle</depend>
  <exec_depend>controller_manager</exec_depend>
  <exec_depend>joint_state_broadcaster</exec_depend>
  <exec_depend>forward_command_controller</exec_depend>
  <exec_depend>joint_trajectory_controller</exec_depend>
  <exec_depend>robot_state_publisher</exec_depend><exec_depend>xacro</exec_depend>
  <exec_depend>launch_ros</exec_depend>
  <export><build_type>ament_cmake</build_type></export>
</package>

這裡提前列出後續基礎章節所需依賴。maintainer 中的示例身份請換成你自己的;它不影響外掛類名。

2.示例 2:編寫完整機器人描述

將以下內容儲存為 urdf/mini.urdf:

<?xml version="1.0"?>
<robot name="mini">

  <link name="world"/>
  <link name="base_link">
    <inertial><mass value="1"/><inertia ixx="0.005" ixy="0" ixz="0" iyy="0.005" iyz="0" izz="0.007"/></inertial>
    <visual><geometry><box size="0.2 0.2 0.1"/></geometry></visual>
  </link>
  <joint name="world_fixed" type="fixed"><parent link="world"/><child link="base_link"/></joint>

  <link name="link1">
    <inertial><origin xyz="0 0 0.2"/><mass value="1"/>
      <inertia ixx="0.0135" ixy="0" ixz="0" iyy="0.0135" iyz="0" izz="0.00042"/>
    </inertial>
    <visual><origin xyz="0 0 0.2"/><geometry><box size="0.05 0.05 0.4"/></geometry></visual>
    <collision><origin xyz="0 0 0.2"/><geometry><box size="0.05 0.05 0.4"/></geometry></collision>
  </link>
  <joint name="joint1" type="revolute">
    <parent link="base_link"/><child link="link1"/>
    <origin xyz="0 0 0.05"/><axis xyz="0 1 0"/>
    <limit lower="-1" upper="1" effort="20" velocity="2"/>
  </joint>

  <link name="link2">
    <inertial><origin xyz="0 0 0.2"/><mass value="1"/>
      <inertia ixx="0.0135" ixy="0" ixz="0" iyy="0.0135" iyz="0" izz="0.00042"/>
    </inertial>
    <visual><origin xyz="0 0 0.2"/><geometry><box size="0.05 0.05 0.4"/></geometry></visual>
    <collision><origin xyz="0 0 0.2"/><geometry><box size="0.05 0.05 0.4"/></geometry></collision>
  </link>
  <joint name="joint2" type="revolute">
    <parent link="link1"/><child link="link2"/>
    <origin xyz="0 0 0.4"/><axis xyz="0 1 0"/>
    <limit lower="-1" upper="1" effort="20" velocity="2"/>
  </joint>

  <ros2_control name="MiniSystem" type="system">
    <hardware><plugin>mock_components/GenericSystem</plugin></hardware>
    <joint name="joint1">
      <command_interface name="position"/>
      <state_interface name="position"><param name="initial_value">0.0</param></state_interface>
      <state_interface name="velocity"/>
    </joint>
    <joint name="joint2">
      <command_interface name="position"/>
      <state_interface name="position"><param name="initial_value">0.0</param></state_interface>
      <state_interface name="velocity"/>
    </joint>
  </ros2_control>
</robot>

2.1.關鍵結構說明

  • world_fixed 把機器人固定到 world,便於後續機械臂模擬。
  • 兩個可動關節名稱為 joint1、joint2。
  • 每個關節提供 position 命令,以及 position、velocity 狀態。
  • mock_components/GenericSystem 是已安裝框架的外掛,不需要你此時編寫 C++。
  • 慣量和碰撞是為後續物理模型準備;GenericSystem 不使用它們計算動力學。

3.編譯與檢查

cd ~/ros2_control_humble_ws
colcon build --symlink-install --packages-select learn_control_hardware
source install/setup.bash
ros2 pkg prefix learn_control_hardware
xacro src/learn_control_hardware/urdf/mini.urdf > /tmp/mini_expanded.urdf

3.1.執行結果

此時還沒有啟動控制器,所以不會出現機器人運動。驗收目標是包可以構建和找到、URDF 能被解析。完整執行放在YAML與launch啟動過程。

3.2.本示例需要注意的點

colcon 識別 src 中的 package.xml;CMake 控制構建和安裝;source install/setup.bash 讓當前終端找到新包。三者承擔不同工作。

原始碼目錄和安裝目錄的結構也不同:原始碼中是 urdf/mini.urdf,安裝後是 share/learn_control_hardware/urdf/mini.urdf。


返回 Humble 總覽 · 上一篇:執行第一個RRBot例項 · 下一篇:URDF與控制介面