Wiki
从零创建学习工作区
Existing English translations were reused. 21 current source blocks remain in Simplified Chinese, without triggering paid translation.
从本节开始,你亲手创建学习工程。先只安装模型和配置,不写硬件 C++ 插件。
1.示例 1:创建工作区与功能包
1.1.Program Objectives
创建 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.Points to note in this example
colcon 识别 src 中的 package.xml;CMake 控制构建和安装;source install/setup.bash 让当前终端找到新包。三者承担不同工作。
源码目录和安装目录的结构也不同:源码中是 urdf/mini.urdf,安装后是 share/learn_control_hardware/urdf/mini.urdf。
返回 Humble 总览 · 上一篇:运行第一个RRBot实例 · 下一篇:URDF与控制接口