目录
ROS sensor_msgs
Message / Service Types
-
The sensor_msgs/JointState message is published by joint_state_controller, and received by robot_state_publisher (which combines the joint information with urdf to publish a robot's tf tree).
为了使创建的URDF机器人模型正确运动,必须给出robot_state_publisher 节点所需的sensor_msgs::JointState型topic:joint_states。可参见:robot_state_publisher sensor_msgs::JointState消息格式为:
std_msgs/Header header |
|
string[] name | |
float64[] position | |
float64[] velocity | |
float64[] effort | |
那么,如何正确给sensor_msgs::JointState型消息赋值呢? 从消息格式可知,该消息类型包含消息头std_msgs/Header header和数据内容两部分,因此赋值时也需要正确处理这两部分内容,缺一不可,否则消息不能正确发布,并有异常报警导致程序异常。 假设声明消息变量为:
sensor_msgs::JointState joint_state; |
|
1.消息头赋值
消息头的赋值仅需处理如下即可:
joint_state.header.stamp = ros::Time::now(); |
|
2.消息内容的赋值
从上述消息格式中可知,该消息数据包含多个不同含义的数组,并且该数组没有指定数组长度,因此在赋值时需要明确指定其数组长度,并赋值。方法有两种: 1.resize指定数组长度,再赋值
joint_state.name.resize(3); //指定name数组长度 |
|
joint_state.position.resize(3);//指定position数组长度 | |
joint_state.name[0] ="joint1";//name数组的第一个元素赋值 | |
joint_state.position[0] = 0;//position数组的第一个元素赋值 | |
2.{}赋值 该方法类似于C/C++声明数组并赋初值
joint_state.name={"joint1","joint2","joint3"};//指定数组大小,并赋值 |
|
joint_state.position={0,0,0}; | |
velocity和effort相同,经过上述两步赋值后,可正常发布消息。
3. 机器人实体订阅
机器臂控制器订阅/joint_state_publisher 发布的/JointStates类型msg,驱动机械臂运动,URDF robot_state_publisher 同时订阅该话题,并发布基于模型的机械臂运动学正解至/tf话题,tf类型消息。