###以一个完整的仿真案例为主线项目了解ROS全流程
以下是一个基于Gazebo的ROS机器人仿真全流程案例,通过该案例可以全面了解ROS的通信机制、仿真环境搭建、机器人模型创建、控制逻辑实现以及数据交互等核心内容。
一、项目目标
构建一个ROS + Gazebo的仿真环境,实现一个差速驱动机器人的仿真,并通过键盘控制其运动。同时,使用激光雷达传感器进行环境感知,并在rviz中可视化。
二、项目流程概览
| 阶段 | 内容 |
|---|---|
| 1. 环境准备 | 安装Ubuntu + ROS + Gazebo |
| 2. 创建工作空间 | 使用catkin_make构建ROS包 |
| 3. 机器人模型构建 | 使用URDF/xacro定义机器人模型 |
| 4. Gazebo仿真配置 | 加载机器人模型到Gazebo中 |
| 5. 控制逻辑实现 | 编写键盘控制节点 |
| 6. 传感器集成 | 添加激光雷达并发布数据 |
| 7. 可视化与调试 | 使用rviz和rqt查看信息 |
三、详细步骤
1. 环境准备(Ubuntu + ROS + Gazebo)
- 安装Ubuntu 20.04(推荐)
- 安装ROS Noetic:
sudo apt update sudo apt install ros-noetic-desktop-full - 安装Gazebo:
sudo apt install gazebo
2. 创建ROS工作空间
mkdir -p ~/gazebo_sim/src cd ~/gazebo_sim/ catkin_make source devel/setup.bash3. 创建ROS包
cd src roscreate-pkg my_robot_gazebo std_msgs rospy roscpp4. 机器人模型构建(URDF/xacro)
在my_robot_gazebo/urdf目录下创建robot.urdf.xacro文件:
<robot name="my_robot"> <link name="base_link"> <visual> <geometry> <box size="0.2 0.2 0.1"/> </geometry> </visual> </link> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel"/> <axis xyz="0 1 0"/> </joint> <link name="left_wheel"> <visual> <geometry> <cylinder radius="0.05" length="0.02"/> </geometry> </visual> </link> <joint name="right_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="right_wheel"/> <axis xyz="0 1 0"/> </joint> <link name="right_wheel"> <visual> <geometry> <cylinder radius="0.05" length="0.02"/> </geometry> </visual> </link> </robot>5. Gazebo仿真配置
在my_robot_gazebo/worlds目录下创建my_world.world文件:
<?xml version="1.0"?> <sdf version="1.6"> <world name="default"> <include> <uri>model://ground_plane</uri> </include> <include> <uri>model://sun</uri> </include> <model name="my_robot"> <pose>0 0 0.1 0 0 0</pose> <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"> <robotNamespace>/my_robot</robotNamespace> </plugin> <link name="base_link"> <inertial> <mass>1.0</mass> <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/> </inertial> </link> </model> </world> </sdf>6. 控制逻辑实现(键盘控制)
在my_robot_gazebo/scripts目录下创建keyboard_teleop.py文件:
#!/usr/bin/env python3 import rospy from geometry_msgs.msg import Twist def main(): rospy.init_node('keyboard_teleop') pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10) rate = rospy.Rate(10) while not rospy.is_shutdown(): key = input("Enter command (w/a/s/d): ") twist = Twist() if key == 'w': twist.linear.x = 0.5 elif key == 's': twist.linear.x = -0.5 elif key == 'a': twist.angular.z = 0.5 elif key == 'd': twist.angular.z = -0.5 else: twist.linear.x = 0 twist.angular.z = 0 pub.publish(twist) rate.sleep() if __name__ == '__main__': try: main() except rospy.ROSInterruptException: pass7. 传感器集成(激光雷达)
在my_robot_gazebo/urdf目录下修改robot.urdf.xacro,添加激光雷达:
<sensor name="laser" type="ray"> <pose>0 0 0.1 0 0 0</pose> <max_range>10.0</max_range> <horizontal_samples>360</horizontal_samples> <vertical_samples>1</vertical_samples> <ray> <min_angle>-1.5708</min_angle> <max_angle>1.5708</max_angle> </ray> </sensor>8. 可视化与调试
- 启动Gazebo和ROS主节点:
roscore gazebo --verbose ~/gazebo_sim/my_robot_gazebo/worlds/my_world.world - 启动键盘控制节点:
rosrun my_robot_gazebo keyboard_teleop.py - 在
rviz中查看机器人和激光雷达数据:rviz
四、关键概念总结
| 概念 | 描述 |
|---|---|
roscore | ROS主节点,所有节点必须连接到它 |
roslaunch | 启动多个节点或配置文件 |
rosrun | 运行一个ROS节点 |
rostopic | 查看和发布话题 |
rviz | 3D可视化工具 |
gazebo | 物理仿真器 |
URDF | 机器人描述格式 |
xacro | URDF的扩展语言 |
Twist | 速度消息类型 |
LaserScan | 激光雷达数据类型 |
五、参考资料
- Gazebo与ROS结合的机器人仿真教程
- ROS多机器人Gazebo仿真
参考来源
- ROS联合Webots仿真
- ROS学习笔记之——gazebo仿真
- ROS仿真笔记之——基于gazebo的ROS多机器人仿真
- ROS联合webots实战案例目录
- ROS 从安装到机械臂的仿真与实验