在小乌龟的例子中,通过 turtlesim 功能包下的 turtle_teleop_key 节点可以实现键盘控制小乌龟运动,那么在 Gazebo 仿真中也可以通过键盘控制 Gazebo 中的机器人进行运动,但默认情况下缺少相应的功能包,因此需要执行如代码7.32所示指令进行功能包的安装。
Code 7.32: Gazebo 键盘控制程序的安装
sudo apt-get install ros-melodic-teleop-twist-keyboard
在键盘控制功能包中有一个功能节点 teleop_twist_keyboard,该节点会监听键盘的按键事件,然后发布 cmd_vel 话题,该话题被 Gazebo 的两轮差速插件所订阅,然后转化为 Gazebo 中能够识别的
速度数据。因此只要运行该节点就可以通过键盘来控制机器人,修改 Launch 文件7.20中的代码,添加 teleop_twist_keyboard 节点,如代码7.33所示。执行 Launch 文件就可以看到如代码7.34所示的结果,
然后在终端中按照 teleop_twist_keyboard 节点的提示信息来控制智能机器人,从而得到如图7-38所示
的效果。
7.20
<launch >
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- 指 定 模 型 的URDF文 件 地 址 -->
<arg name="model"
default="$(find begin1)/urdf/simple_sai_robot.urdf"/>
<!-- RVIZ配 置 文 件 的 存 放 地 址 -->
<arg name="rvizconfig"
default="$(find begin1)/rviz/simple_model.rviz" />
<!-- 模 型 描 述 的 参 数 -->
<param name="robot_description"
command="$(find xacro)/xacro $(arg model)" />
<!-- 载 入 空 的 物 理 世 界 -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include >
<node if="$(arg gui)" name="joint_state_publisher_gui"
pkg="joint_state_publisher_gui"
type="joint_state_publisher_gui" />
<node unless="$(arg gui)" name="joint_state_publisher"
pkg="joint_state_publisher"
type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher"
type="robot_state_publisher" />
<!-- 创 建 一 个 模 型 对 象 -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model"
args="-x 0.0 -y 0.0 -z 0.0 -unpause -urdf
-model sai_robot -param robot_description"
respawn="false" output="screen" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)"
required="true" />
</launch >
Code 7.33: Launch 文件中添加 Gazebo 键盘控制程序(simple_model_gazebo.launch)
<launch>
<node name="twist_keyboard" pkg="teleop_twist_keyboard"
type="teleop_twist_keyboard.py" output="screen" />
</launch>
simple_model_gazebo.launch
<launch >
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- 指 定 模 型 的URDF文 件 地 址 -->
<arg name="model"
default="$(find begin1)/urdf/simple_sai_robot.urdf"/>
<!-- RVIZ配 置 文 件 的 存 放 地 址 -->
<arg name="rvizconfig"
default="$(find begin1)/rviz/simple_model.rviz" />
<!-- 模 型 描 述 的 参 数 -->
<param name="robot_description"
command="$(find xacro)/xacro $(arg model)" />
<!-- 载 入 空 的 物 理 世 界 -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include >
<node if="$(arg gui)" name="joint_state_publisher_gui"
pkg="joint_state_publisher_gui"
type="joint_state_publisher_gui" />
<node unless="$(arg gui)" name="joint_state_publisher"
pkg="joint_state_publisher"
type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher"
type="robot_state_publisher" />
<!-- 创 建 一 个 模 型 对 象 -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model"
args="-x 0.0 -y 0.0 -z 0.0 -unpause -urdf
-model sai_robot -param robot_description"
respawn="false" output="screen" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)"
required="true" />
<node name="twist_keyboard" pkg="teleop_twist_keyboard"
type="teleop_twist_keyboard.py" output="screen" />
</launch >