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,并确认已重新编译。