Gazebo多场景下的TurtleBot4键盘控制与真值轨迹记录

发布于:2025-05-28 ⋅ 阅读:(48) ⋅ 点赞:(0)

前言:

上一篇博客已经介绍了如何安装turtlebot4机器人包,运行机器人的ign gazebo仿真环境并加载turtlebot4机器人模型,接下来需要使用键盘控制机器人运动,在运动的过程中订阅tutlebot4机器人发布的/odom话题消息,保存为真值轨迹文件,并使用evo进行可视化(如果还未安装turtlebot4包,可以参考我上篇博客)

原理:

turtlrbot4的机器人的urdf文件里有一个差速控制插件diff,turtlrbot4机器人在仿真过程中通过该插件订阅/cmd_vel和发布/odom话题。而ros2的键盘控制节点能够发布/cmd_vel的话题,从而可以使用键盘控制机器人运动(当然也可以自己写一个节点发布cmd_vel话题)。发布的/odom话题数据,就是机器人的真实位姿

键盘控制:

输入以下指令启动机器人ign gazebo仿真

ros2 launch turtlebot4_ignition_bringup turtlebot4_ignition.launch.py

待机器人完成初始化后,就可以使用键盘控制机器人运动了,输入指令:

ros2 run teleop_twist_keyboard teleop_twist_keyboard 

就可以控制机器人运动。控制机器人走一段路径,如下图所示:

保存轨迹:

odom数据格式

启动机器人仿真ign gazebo仿真后,机器人会发布/odom话题数据,我们先来看看/odom话题数据格式,输入以下指令:

ros2 topic list
ros2 topic echo /odom

通过以上指令,我们可以看到/odom话题的数据消息格式,如下图所示:

可以看到,话题数据是一个列表形式,我们只需要其中的position和orientation数据,即位置和姿态。

创建ros2节点

在turtlrbot4的工作空间turtlrbot4_ws/src中创建一个功能包,输入以下指令:

ros2 pkg create trajectory_save  --build-type ament_python --dependencies rclpy

创建功能包后,进入trajectory_save/trajectory_save文件路径下,创建node.py的文件,在这个文件中,我们编写代码实现订阅/odom话题数据,并保存为轨迹文件,代码如下:

import rclpy
from rclpy.node import Node
from nav_msgs.msg import Odometry
import sys

class OdomSubscriber(Node):
    def __init__(self):
        super().__init__('odom_subscriber')
        self.subscription = self.create_subscription(
            Odometry,
            '/odom',
            self.odom_callback,
            10
        )
        self.file = open('trajectory_real_odom.tum', 'w')

    def odom_callback(self, msg):
        # 提取时间戳、位置和四元数
        timestamp_sec = msg.header.stamp.sec
        timestamp_nsec = msg.header.stamp.nanosec
        timestamp = timestamp_sec + timestamp_nsec * 1e-9

        position = msg.pose.pose.position
        orientation = msg.pose.pose.orientation

        # 写入 TUM 文件格式
        line = f"{timestamp} {position.x} {position.y} {position.z} " \
               f"{orientation.x} {orientation.y} {orientation.z} {orientation.w}\n"
        self.file.write(line)

def main(args=None):
    rclpy.init(args=args)
    odom_subscriber = OdomSubscriber()
    try:
        rclpy.spin(odom_subscriber)
    except KeyboardInterrupt:
        pass
    finally:
        odom_subscriber.file.close()
        odom_subscriber.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

同时在setup.py中修改配置,如图所示:

   entry_points={
        'console_scripts': [
             "node = trajectory_save.node:main"
        ],
    },

进入turtlebot4_ws工作空间运行编译指令:

colcon build

注意事项:

由于turtlrbot4的工作空间和该ros2节点的工作空间相同,我们可把/turtlrbot4_ws/install/setup.bash文件添加到~/.bashrc中,这样可以不用每次运行前在终端source环境变量。

运行以下指令打开~/.bashrc文件

vim ~/.bashrc

添加环境如图所示:

# >>> fishros initialize >>>
source /opt/ros/humble/setup.bash
# <<< fishros initialize <<<

source /home/petermi/turtlebot4_ws/install/setup.bash #替换成你自己的路径

保存退出后,运行以下指令进行刷新

source ~/.bashrc

打开任意一个终端,输入以下指令:

ros2 run trajectory_save node

运行以上指令,就可以在该终端对应的文件路径下生成轨迹文件trajectory_real_odom.tum,如下图所示:

键盘控制运动同时保存轨迹文件

最终,我们只需要在ign gazebo环境中,同时启动键盘控制和录制轨迹,就可以得到机器人在运动过程中的真实轨迹文件

(1) 启动ign gazebo仿真环境

ros2 launch turtlebot4_ignition_bringup turtlebot4_ignition.launch.py

(2) 启动键盘控制节点

ros2 run teleop_twist_keyboard teleop_twist_keyboard

(3) 启动ros2节点

ros2 run trajectory_save node

手动操作键盘控制机器人走一段路径后停止,如下图所示:

在与运行了ros2 run trajectory_save node指令的终端界面按ctrl+c结束录制,得到轨迹文件trajectory_real_odom.tum,并打开tum文件,如图所示:

evo画出轨迹

我这里已经提前下载好evo,如果想要下载,可以直接输入以下命令:

pip install evo --upgrade --no-binary evo -i https://pypi.tuna.tsinghua.edu.cn/simple
#用清华源加速pip安装

# 添加 ~/.local/bin 到 PATH
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

这里要注意的就是evo的版本。最后就可以使用evo画出机器人的真实轨迹,输入指令如下:

evo_traj tum trajectory_real_odom.tum -p

机器人的真实轨迹如图所示:

补充:/sim_ground_truth_pose话题数据也是机器人的真实位姿,ign gazebo仿真中该话题发布的位姿数据比/odom话题数据更加准确,大家有兴趣的可以试一试。本人最近在学习slam,如果有不对的地方,恳请指正,谢谢 


网站公告

今日签到

点亮在社区的每一天
去签到