构建机器人


预计完成时间:5 分钟

2.6   使用 Gazebo Sim 服务生成机器人

你已经把机器人搭建好了,它已经有了底盘和车轮,因此已经可以用于仿真了。下面来看看如何把它放进 Gazebo 仿真环境中。

你可以通过两种方式把机器人模型生成到 Gazebo Sim 中:

  1. 使用 Gazebo Sim 生成服务
  2. 使用 ROS 2 Launch 文件

使用 Gazebo Sim 生成服务

虽然这不是把模型生成到 Gazebo Sim 中的首选方法,但你仍然可以借此观察模型在 Gazebo Sim 中生成后的行为。

这种方式会使用 Gazebo Sim 的 create 服务,它采用的是 EntityFactory 消息类型。

**注意:** 开始之前,请关闭并终止所有 web shell 中正在运行的任务。对所有活跃的 web shell 按下 Ctrl + C 来停止当前进程。

还记得上一章中你是如何生成本地模型的吗?首先需要设置环境变量,为 Gazebo Sim 指定资源路径。

把模型的 URDF 文件路径以及相关网格文件路径都配置进去。

  在 Web Shell 1 中执行

In [ ]:
export GZ_SIM_RESOURCE_PATH=/workspace/src/robot_description/urdf:/workspace/src

现在在 Gazebo Sim 中启动一个世界,这里我们使用空世界。

  在 Web Shell 1 中执行

In [ ]:
gz sim empty.sdf

在另一个终端中,使用下面的命令列出所有可用的 Ignition 服务:

  在 Web Shell 2 中执行

In [ ]:
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 中执行

In [ ]:
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 中执行

In [ ]:
cd /workspace/src/robot_description/urdf
In [ ]:
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,如下图所示:

"Ign Service Create"

查看 Gazebo Sim 界面时,你会发现机器人模型已经生成在 x = 0.0, y = 0.0, and z = 0.0 的位置。

如果你想进一步了解该服务请求消息的内容,可以查看 ignition.msgs.EntityFactory 的定义。