2. 创建ROS2工作空间

任务目标

在Ubuntu 22.04 + ROS2 Humble环境下,从零创建一个名为dev_ws的ROS2工作空间,并在其中新建一个功能包hello_ws,完成编译与环境加载,最终通过运行节点验证工作空间配置正确。

环境准备

开始前确认已安装ROS2 Humble桌面版,并已source环境。若未安装,执行:

sudo apt install ros-humble-desktop python3-colcon-common-extensions
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

创建并编译工作空间

工作空间采用标准ROS2布局:src存放源码,build/install/log由编译工具自动生成。执行以下命令创建目录结构并编译空工作空间:

mkdir -p ~/dev_ws/src
cd ~/dev_ws
colcon build

编译完成后,install/setup.bash会生成。每次使用该工作空间前需source它:

echo "source ~/dev_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

创建功能包

在src目录下使用ROS2命令行工具生成一个Python功能包hello_ws,包含一个发布字符串话题的节点:

cd ~/dev_ws/src
ros2 pkg create --build-type ament_python --node-name hello_node hello_ws

该命令自动生成package.xml、setup.py、setup.cfg及节点文件hello_node.py。编辑节点文件,写入以下内容:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class HelloNode(Node):
    def __init__(self):
        super().__init__('hello_node')
        self.publisher = self.create_publisher(String, 'hello_topic', 10)
        self.timer = self.create_timer(1.0, self.publish_message)

    def publish_message(self):
        msg = String()
        msg.data = 'Hello from dev_ws!'
        self.publisher.publish(msg)
        self.get_logger().info(f'Publishing: {msg.data}')

def main(args=None):
    rclpy.init(args=args)
    node = HelloNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

在package.xml的<depend>标签中添加std_msgs依赖:

<depend>rclpy</depend>
<depend>std_msgs</depend>

编译功能包

回到工作空间根目录,重新编译使新功能包生效:

cd ~/dev_ws
colcon build --packages-select hello_ws

编译成功时终端无报错,且install/hello_ws目录被生成或更新。

运行与验证

打开两个终端,均先执行source ~/.bashrc(或手动source工作空间)。终端1运行节点:

ros2 run hello_ws hello_node

终端2监听话题:

ros2 topic echo /hello_topic

通过条件:终端1每秒输出一条Publishing: Hello from dev_ws!日志;终端2持续收到相同内容的String消息。同时执行ros2 pkg list | grep hello_ws能列出该包,说明工作空间配置与功能包编译均正确。

常见问题

  • 找不到ros2命令:检查~/.bashrc中ROS2环境source行是否存在,或手动执行source /opt/ros/humble/setup.bash。
  • 编译提示Package 'hello_ws' not found:确认在~/dev_ws根目录执行colcon build,且src下存在hello_ws目录。
  • 运行节点报ModuleNotFoundError:检查setup.py中entry_points是否包含hello_node = hello_ws.hello_node:main,并确认已重新编译。