预计完成时间:5 分钟
你已经把机器人搭建好了,它已经有了底盘和车轮,因此已经可以用于仿真了。下面来看看如何把它放进 Gazebo 仿真环境中。
你可以通过两种方式把机器人模型生成到 Gazebo Sim 中:
虽然这不是把模型生成到 Gazebo Sim 中的首选方法,但你仍然可以借此观察模型在 Gazebo Sim 中生成后的行为。
这种方式会使用 Gazebo Sim 的 create 服务,它采用的是 EntityFactory 消息类型。
**注意:**
开始之前,请关闭并终止所有 web shell 中正在运行的任务。对所有活跃的 web shell 按下 Ctrl + C 来停止当前进程。
还记得上一章中你是如何生成本地模型的吗?首先需要设置环境变量,为 Gazebo Sim 指定资源路径。
把模型的 URDF 文件路径以及相关网格文件路径都配置进去。
在 Web Shell 1 中执行
export GZ_SIM_RESOURCE_PATH=/workspace/src/robot_description/urdf:/workspace/src
现在在 Gazebo Sim 中启动一个世界,这里我们使用空世界。
在 Web Shell 1 中执行
gz sim empty.sdf
在另一个终端中,使用下面的命令列出所有可用的 Ignition 服务:
在 Web Shell 2 中执行
gz service --list
执行完上面的命令后,你会在输出中看到一个名为 /world/empty/create 的服务,如下所示。
通用的服务名称格式为 /world/<name_of_world>/create。例如,如果你的 world 文件中的世界名称是 factory_floor,那么服务名就会是 /world/factory_floor/create。
/gazebo/resource_paths/add /gazebo/resource_paths/get /gazebo/resource_paths/resolve /gazebo/worlds /gui/camera/view_control /gui/camera/view_control/reference_visual /gui/camera/view_control/sensitivity /gui/copy /gui/follow /gui/follow/offset /gui/move_to /gui/move_to/pose /gui/paste /gui/screenshot /gui/view/collisions /gui/view/com /gui/view/frames /gui/view/inertia /gui/view/joints /gui/view/transparent /gui/view/wireframes /marker /marker/list /marker_array /server_control /world/empty/control /world/empty/control/state /world/empty/create /world/empty/create_multiple /world/empty/declare_parameter /world/empty/disable_collision /world/empty/enable_collision /world/empty/entity/system/add /world/empty/generate_world_sdf /world/empty/get_parameter /world/empty/gui/info /world/empty/level/set_performer /world/empty/light_config /world/empty/list_parameters /world/empty/playback/control /world/empty/remove /world/empty/scene/graph /world/empty/scene/info /world/empty/set_parameter /world/empty/set_physics /world/empty/set_pose /world/empty/set_pose_vector /world/empty/set_spherical_coordinates /world/empty/state /world/empty/state_async /world/empty/system/info /world/empty/visual_config /world/empty/wheel_slip
继续在同一个终端中,查看该服务的信息,以确认请求和响应所使用的消息类型。
注意: 和 ROS2 命令不同,这个命令不支持 Tab 自动补全,所以需要手动输入完整命令。
在 Web Shell 2 中执行
gz service --info --service /world/empty/create
执行完该命令后,你应该会看到与下图类似的输出:
Service providers [Address, Request Message Type, Response Message Type]: tcp://192.168.32.7:37923, gz.msgs.EntityFactory, gz.msgs.Boolean
然后在同一个终端中输入下面的命令,将你的 URDF 模型生成到 Gazebo Sim 中:
注意: 和 ROS2 命令不同,这个命令不支持 Tab 自动补全,所以需要手动输入完整命令。
在 Web Shell 2 中执行
cd /workspace/src/robot_description/urdf
gz service --service /world/empty/create \
--reqtype ignition.msgs.EntityFactory \
--reptype ignition.msgs.Boolean \
--timeout 1000 \
--req 'sdf_filename:"robot.urdf",name:"my_robot"'
注意:--req 参数中的内容不能包含空格。如果你写入了空格,就会收到下面这样的报错:
The following arguments were not expected: "my_robot" name: "robot.urdf",
如果你正确完成了前面的步骤,那么执行生成服务命令后应该会返回 data: true,如下图所示:

查看 Gazebo Sim 界面时,你会发现机器人模型已经生成在 x = 0.0, y = 0.0, and z = 0.0 的位置。
如果你想进一步了解该服务请求消息的内容,可以查看 ignition.msgs.EntityFactory 的定义。
