260416
目前为止我们已经完成了我们跟踪目的的前两个步骤,接下来来到我们的第三个步骤——实现实时旗帜跟随 + 避障。
因为我们要读取 Gazebo 传回的 pose 信息了,因此我们需要先配置一下我们的环境 ros_gz_bridge 相关依赖信息。
首先是将它添加到我们 IDE 的 python 分析路径中:
"python.analysis.extraPaths": [
"/opt/ros/jazzy/lib/python3.12/site-packages",
"/usr/lib/python3/dist-packages",
"/opt/ros/jazzy/opt/gz_msgs_vendor/lib/python",
"${workspaceFolder}/install/kibot_one_interface/lib/python3.12/site-packages",
"${workspaceFolder}/install/kibot_one_control/lib/python3.12/site-packages"
]
这里我们将 /opt/ros/jazzy/opt/gz_msgs_vendor/lib/python 给添加到了我们的路径中。
然后是 ~/.bash_profile.jazzy,需要额外写入一行 PYTHON 路径:
export PYTHONPATH=/usr/lib/python3/dist-packages:/opt/ros/jazzy/opt/gz_msgs_vendor/lib/python:$PYTHONPATH
接下来我们就可以开始进行开发了。
我们首先要实现的是,旗帜实时发布自己的位姿。
我们先在我们旗帜的 sdf 里引入这个插件:
<plugin
filename="gz-sim-pose-publisher-system"
name="gz::sim::systems::PosePublisher">
<publish_model_pose>true</publish_model_pose>
<publish_link_pose>false</publish_link_pose>
<use_pose_vector_msg>false</use_pose_vector_msg>
<static_publisher>false</static_publisher>
<update_frequency>10</update_frequency>
</plugin>
这个插件是用来发布模型的位姿的一个插件,我们设置为发布整个模型的位姿,不发布其中 link 的位姿。
同时,我们关闭了 use_pose_vector_msg,这个影响其实不大,因为我们实际发布的就只有 model 一个对象的消息,而非所有 link,是否打包对我们来说没有多少影响。
然后在 src/kibot_one_sim/config/ros_gz_bridge.yaml,我们新增了 /flag_pose 这一 ros2 话题来对接 gz 的 /model/follow_flag/pose,以此来获取旗帜的位置。
- ros_topic_name: "/flag_pose"
gz_topic_name: "/model/follow_flag/pose"
ros_type_name: "geometry_msgs/msg/PoseStamped"
gz_type_name: "gz.msgs.Pose"
direction: GZ_TO_ROS
frame_id: "odom"
启动!然后我们运行看看能不能获取到这个话题的内容:
(.venv) jese--ki@KiBall:~/Projects/dev/KiBots/KiBotOne$ ros2 topic echo /flag_pose --once
header:
stamp:
sec: 0
nanosec: 100000000
frame_id: kibot_one_world
pose:
position:
x: 2.5
y: 1.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
---
(.venv) jese--ki@KiBall:~/Projects/dev/KiBots/KiBotOne$ ros2 topic echo /flag_pose --once
header:
stamp:
sec: 1
nanosec: 0
frame_id: kibot_one_world
pose:
position:
x: 2.5
y: 1.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
---
可以看到效果符合预期。
值得注意的是,我们只有当 Gazebo 处于正在模拟中的状态才能收到这个 topic 消息,否则会一直卡死。
我们在 Gazebo 中移动一下旗帜的位置看看:
(.venv) jese--ki@KiBall:~/Projects/dev/KiBots/KiBotOne$ ros2 topic echo /flag_pose --once
header:
stamp:
sec: 2
nanosec: 200000000
frame_id: kibot_one_world
pose:
position:
x: 2.5
y: -2.9728758335113525
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
---
可以看到我们移动后,pose正确反映到了我们的这个话题中。
就这样,我们成功实时监控了旗帜的位置并发布到了话题中。
以上。