6.1 机器人运动控制以及里程计信息显示
(1)ros_control 简介
场景:如何在不同的机器人系统上实现同一套 ROS 程序的部署?例如,在开发阶段,为了提高测试效率,程序通常在仿真平台(如 Gazebo)上进行。然而,实际部署时,可能涉及不同的实体机器人平台。这些平台在实现细节上存在差异,如何确保 ROS 程序的可移植性?ROS 提供的内置解决方案是 ros_control。
ros_control:ros_control 是一组 ROS 软件包,提供了机器人控制的标准接口,包括控制器接口、控制器管理器、传动和硬件接口。它为开发者提供了一个机器人控制的中间件,设计了一套通用的控制规范。只要不同的机器人平台按照这套规范实现接口,便可以无缝对接 ROS 程序。通过这种规范化的架构设计,ros_control 实现了一种可插拔的系统,使得机器人程序可以灵活地适应不同硬件环境,从而大大提高了程序设计、测试与部署的效率和灵活性。
Gazebo 与 ros_control:Gazebo 仿真平台已经实现了 ros_control 的相关接口。这意味着开发者可以在 Gazebo 中使用相同的 ROS 控制程序来模拟机器人控制,并且可以在仿真和实际硬件系统之间进行无缝切换。如果需要在 Gazebo 中控制机器人,只需调用 ros_control 接口,利用 Gazebo 的仿真环境模拟硬件行为,实现对机器人的运动控制。
(2)运动控制实现流程(Gazebo)
1)编写 Xacro 文件:在已创建好的机器人模型基础上,编写一个独立的 Xacro 文件,为机器人模型添加所需的传动装置(如轮子或关节)以及控制器组件。通常这些控制器是通过 ros_control 提供的标准控制接口来实现的,例如速度控制器、位置控制器等。
例如,Xacro 文件可能会包含以下内容:
<transmission name="my_robot_transmission">
<type>transmission_interface/SimpleTransmission</type>
<joint name="joint1">
<hardwareInterface>EffortJointInterface</hardwareInterface>
</joint>
<actuator name="motor1">
<hardwareInterface>EffortJointInterface</hardwareInterface>
</actuator>
</transmission>
其中传动装置(transmission
)定义了机器人运动关节与执行器(如电机)之间的关系。
2)集成 Xacro 文件:将新编写的 Xacro 文件包含到主 URDF 或 Xacro 机器人模型文件中。通过这种方式,模型将拥有完整的物理和控制功能,既包含机器人的几何结构,又具备运动控制能力。
使用文件包含的方式将控制器文件集成到主模型文件中:
<xacro:include filename="$(find my_robot_description)/urdf/transmissions.xacro" />
3)启动 Gazebo 并控制机器人运动:启动 Gazebo 仿真环境,加载包含控制器的机器人模型。启动后,通过发布 /cmd_vel
(或其他控制话题)消息,使用 ROS 话题或服务来控制机器人的运动。
发布控制指令的示例:
rostopic pub /cmd_vel geometry_msgs/Twist '{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.5}}'
该命令会向机器人发送线速度和角速度指令,从而使其在 Gazebo 中移动。通过使用 ros_control 的接口,您可以在仿真中调试机器人的控制行为,并最终将相同的控制逻辑移植到实际的机器人硬件平台上。
(3)Rviz查看里程计信息
里程计: 机器人相对出发点坐标系的位姿状态(X 坐标 Y 坐标 Z坐标以及朝向)。
6.2 雷达信息仿真以及显示
6.3 摄像头信息仿真以及显示
6.4 kinect信息仿真以及显示
Kinect 点云数据显示:
问题:在 RViz 中显示 Kinect 生成的点云时出现错位现象。
原因:这是由于 Kinect 的图像数据和点云数据使用了不同的坐标系统,而这两套坐标系统的位姿并不一致,导致在 RViz 中显示时出现不匹配的情况。
解决方案: (1)为 Kinect 设置统一的坐标系,确保点云和图像数据的坐标系统一致。可以通过修改相应插件的配置文件来设置正确的坐标系。具体方法是找到配置文件中的 <frameName>
标签,并将其内容修改为与点云和图像数据一致的坐标系名称。
<frameName>support_depth</frameName>
(2)发布新设置的坐标系到kinect连杆的坐标变换关系 距离+偏航(x,y,z,z,y,z),在启动rviz的launch中,添加:
<node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /support /support_depth" />