260519
接下来就按照上次编写好的文档来一步一步的实现吧。
我们首先关注的是 src/kibot_one_sim/config/ros_gz_bridge.yaml。
在我们旧版本中,我们的最小速度桥接项长这样:
- ros_topic_name: "/cmd_vel"
gz_topic_name: "/model/kibot_one_base/cmd_vel"
ros_type_name: "geometry_msgs/msg/Twist"
gz_type_name: "gz.msgs.Twist"
direction: ROS_TO_GZ
这里我们是将 /cmd_vel 通过 ros_gz_bridge 转为 Gazebo 的 gz.msgs.Twist。
最后 Gazebo DiffDrive 插件订阅 /model/kibot_one_base/cmd_vel 来驱动车体。
这个方案在我们旧的 FOLLOW 的演示是合理的,因为旧控制链路的最终输出就是 /cmd_vel。
但是 Nav2 默认可不是这样工作的,我们当前预期使用的是 Nav2 的 velocity smoother ,速度会先经过平滑器,即 /cmd_vel_smoothed。
因此,我们接下来需要将 Gazebo 的速度入口交给 Nav2 的平滑速度。
我们这里将 src/kibot_one_sim/config/ros_gz_bridge.yaml 的第一项的 topic 从 /cmd_vel 改成 /cmd_vel_smoothed:
- ros_topic_name: "/cmd_vel_smoothed"
gz_topic_name: "/model/kibot_one_base/cmd_vel"
ros_type_name: "geometry_msgs/msg/Twist"
gz_type_name: "gz.msgs.Twist"
direction: ROS_TO_GZ
这里 Gazebo 实际吃的就是我们新版本的 /cmd_vel_smoothed 这一话题了。
接下来我们要创建一个新的 launch 文件 src/kibot_one_sim/launch/nav2.launch.py,用于启动 Nav2。
不过我们目前先写入最简单的内容作为占位就可以了:
from launch import LaunchDescription
def generate_launch_description() -> LaunchDescription:
return LaunchDescription([])
然后我们就要试着编写 Nav2 的参数了。
我们要写一个 src/kibot_one_sim/config/nav2_params.yaml,因为 Nav2 本身是一组节点,每个节点都是从同一个 yaml 文件里读取自己的参数,所以我们就可以通过这个 yaml 文件来配置我们的这些节点。