当您使用具有许多相关框架的机器人时,将它们全部发布到tf成为一项艰巨的任务。 机器人状态发布者是一款可以为您完成此工作的工具。
机器人状态发布者可帮助您将机器人的状态广播到tf转换库。 机器人状态发布者在内部具有机器人的运动学模型。 因此,根据机器人的关节位置,机器人状态发布者可以计算和广播机器人中每个链接的3D姿态。
您可以将机械手状态发布器用作独立的ROS节点或库:
1.Running as a ROS node
1.1 robot_state_publisher
运行机器人状态发布者的最简单方法是作为节点。 对于普通用户,这是建议的用法。 您需要执行以下两项操作来运行机械手状态发布器:
- 在参数服务器上加载的urdf xml机械手描述。
- 将关节位置发布为sensor_msgs / JointState的源。
请阅读以下章节,了解如何为robot_state_publisher配置参数和主题。
1.1.1 Subscribed topics
- joint_states(sensor_msgs / JointState)
- 关节位置信息
1.1.2 Parameters
robot_description(urdf map)
urdf xml机械手说明。 通过`urdf_model :: initParam`访问
tf_prefix(string)
设置tf前缀,以进行名称空间感知的转换发布。 有关更多详细信息,请参见tf_prefix。
publish_frequency(double)
状态发布者的发布频率,默认值:50Hz。
1.2 Example launch file
设置XML机械手描述和关节位置信息源后,只需创建一个启动文件,如下所示:
<launch>
<!-- Load the urdf into the parameter server. -->
<param name="my_robot_description" textfile="$(find mypackage)/urdf/robotmodel.xml"/>
<node pkg="robot_state_publisher" type="robot_state_publisher" name="rob_st_pub" >
<remap from="robot_description" to="my_robot_description" />
<remap from="joint_states" to="different_joint_states" />
</node>
</launch>
2.Running as a library
高级用户还可以从自己的C ++代码中以库的形式运行机械手状态发布器。 包含标题后:
#include <robot_state_publisher/robot_state_publisher.h>
您只需要一个包含KDL树的构造函数:
RobotStatePublisher(const KDL::Tree& tree);
现在,每次您要发布机器人状态时,都可以调用publishTransforms函数:
// publish moving joints
void publishTransforms(const std::map<std::string, double>& joint_positions,
const ros::Time& time);
// publish fixed joints
void publishFixedTransforms();
第一个参数是具有关节名称和关节位置的地图,第二个参数是记录关节位置的时间。 如果地图不包含所有关节名称,也可以。 如果地图包含的运动学模型不包含某些关节名称,也可以。 但是请注意,如果您不将运动模型中的某些关节告诉联合州发布者,那么您的tf树将是不完整的。