编写节点从ROS的FollowJointTrajectoryGoal主题订阅路径点数据

一、首先建一个包

工作空间catkin_ws事先建好了,路径是/root/catkin_ws 

然后运行以下命令在src文件夹下建立test包

$ cd ~/catkin_ws/src
$ catkin_create_pkg test roscpp

 

注意在包的名字后加上一些基本的依赖,比如roscpp和rospy这样就可以直接调用C++和python节点了,这将会在CMakeLists.txt中出现

find_package(catkin REQUIRED COMPONENTS roscpp)
/*test1.cpp
*创建时间:2018.3.1
*   作者:向建平
*/

   #include "ros/ros.h"  
//ros/ros.h是一个实用的头文件,它引用了ROS系统中大部分常用的头文件  
#include "std_msgs/String.h"  
//std_msgs/String存放在std_msgs package里,由String.msg文件自动生成的头文件
#include <control_msgs/FollowJointTrajectoryAction.h>  
#include <control_msgs/FollowJointTrajectoryActionGoal.h>
#include <control_msgs/FollowJointTrajectoryGoal.h>
#include <trajectory_msgs/JointTrajectory.h>
#include <trajectory_msgs/JointTrajectoryPoint.h>
  
//回调函数,当message topic消息到达后会调用此函数  control_msgs/FollowJointTrajectoryActionGoal
void execute(const  control_msgs::FollowJointTrajectoryActionGoal::ConstPtr& msg)
{  
    std::cout << "points[0]: "  
             << "[" << msg->goal.trajectory.points[0].positions[0]  
             << "," << msg->goal.trajectory.points[0].positions[1]  
             << "," << msg->goal.trajectory.points[0].positions[2]  
             << "," << msg->goal.trajectory.points[0].positions[3]  
             << "," << msg->goal.trajectory.points[0].positions[4]  
             << "," << msg->goal.trajectory.points[0].positions[5]  
             << "]" << std::endl ;

    std::cout << "points[1]: "  
             << "[" << msg->goal.trajectory.points[1].positions[0]  
             << "," << msg->goal.trajectory.points[1].positions[1]  
             << "," << msg->goal.trajectory.points[1].positions[2]  
             << "," << msg->goal.trajectory.points[1].positions[3]  
             << "," << msg->goal.trajectory.points[1].positions[4]  
             << "," << msg->goal.trajectory.points[1].positions[5]  
             << "]" << std::endl ;

std::cout << "points[2]: "  
             << "[" << msg->goal.trajectory.points[2].positions[0]  
             << "," << msg->goal.trajectory.points[2].positions[1]  
             << "," << msg->goal.trajectory.points[2].positions[2]  
             << "," << msg->goal.trajectory.points[2].positions[3]  
             << "," << msg->goal.trajectory.points[2].positions[4]  
             << "," << msg->goal.trajectory.points[2].positions[5]  
             << "]" << std::endl ;


std::cout << "points[3]: "  
             << "[" << msg->goal.trajectory.points[3].positions[0]  
             << "," << msg->goal.trajectory.points[3].positions[1]  
             << "," << msg->goal.trajectory.points[3].positions[2]  
             << "," << msg->goal.trajectory.points[3].positions[3]  
             << "," << msg->goal.trajectory.points[3].positions[4]  
             << "," << msg->goal.trajectory.points[3].positions[5]  
             << "]" << std::endl ;

std::cout << "points[4]: "  
             << "[" << msg->goal.trajectory.points[4].positions[0]  
             << "," << msg->goal.trajectory.points[4].positions[1]  
             << "," << msg->goal.trajectory.points[4].positions[2]  
             << "," << msg->goal.trajectory.points[4].positions[3]  
             << "," << msg->goal.trajectory.points[4].positions[4]  
             << "," << msg->goal.trajectory.points[4].positions[5]  
             << "]" << std::endl ;

 std::cout << "points[5]: "  
             << "[" << msg->goal.trajectory.points[5].positions[0]  
             << "," << msg->goal.trajectory.points[5].positions[1]  
             << "," << msg->goal.trajectory.points[5].positions[2]  
             << "," << msg->goal.trajectory.points[5].positions[3]  
             << "," << msg->goal.trajectory.points[5].positions[4]  
             << "," << msg->goal.trajectory.points[5].positions[5]  
             << "]" << std::endl ;    

std::cout << "points[6]: "  
             << "[" << msg->goal.trajectory.points[6].positions[0]  
             << "," << msg->goal.trajectory.points[6].positions[1]  
             << "," << msg->goal.trajectory.points[6].positions[2]  
             << "," << msg->goal.trajectory.points[6].positions[3]  
             << "," << msg->goal.trajectory.points[6].positions[4]  
             << "," << msg->goal.trajectory.points[6].positions[5]  
             << "]" << std::endl ;

std::cout << "points[7]: "  
             << "[" << msg->goal.trajectory.points[7].positions[0]  
             << "," << msg->goal.trajectory.points[7].positions[1]  
             << "," << msg->goal.trajectory.points[7].positions[2]  
             << "," << msg->goal.trajectory.points[7].positions[3]  
             << "," << msg->goal.trajectory.points[7].positions[4]  
             << "," << msg->goal.trajectory.points[7].positions[5]  
             << "]" << std::endl ;

std::cout << "points[8]: "  
             << "[" << msg->goal.trajectory.points[8].positions[0]  
             << "," << msg->goal.trajectory.points[8].positions[1]  
             << "," << msg->goal.trajectory.points[8].positions[2]  
             << "," << msg->goal.trajectory.points[8].positions[3]  
             << "," << msg->goal.trajectory.points[8].positions[4]  
             << "," << msg->goal.trajectory.points[8].positions[5]  
             << "]" << std::endl ;

std::cout << "points[9]: "  
             << "[" << msg->goal.trajectory.points[9].positions[0]  
             << "," << msg->goal.trajectory.points[9].positions[1]  
             << "," << msg->goal.trajectory.points[9].positions[2]  
             << "," << msg->goal.trajectory.points[9].positions[3]  
             << "," << msg->goal.trajectory.points[9].positions[4]  
             << "," << msg->goal.trajectory.points[9].positions[5]  
             << "]" << std::endl ;

}  
  
  
int main(int argc, char **argv)  
{  
    
    //初始化ROS,注意:名称必须唯一  
    ros::init(argc, argv, "test1");  
  //监听/arm_controller/follow_joint_trajectory/goal话题发布的消息
    //设置节点进程句柄  
    ros::NodeHandle n;  
  
    //参数一为订阅的话题名称(/arm_controller/follow_joint_trajectory/goal);  
    //参数二是消息缓存队列,这里设置为1000,即缓存了1000个消息后,如果由新的消息到达,则开始丢弃先前接收的消息;  
    //参数三为当收到消息后调用的函数名称(execute)  
    ros::Subscriber sub = n.subscribe("/arm_controller/follow_joint_trajectory/goal", 1000, execute);  
      
    //ros::spin()进入自循环,可以尽可能快的调用消息回调函数  
    ros::spin();    
    return 0;  
}  

注意:这个cpp输出的是弧度制的角度,如果需要角度值需要转换,用下面的cpp

/*test1.cpp
*创建时间:2018.3.1
*   作者:向建平
*/

   #include "ros/ros.h"  
//ros/ros.h是一个实用的头文件,它引用了ROS系统中大部分常用的头文件  
#include "std_msgs/String.h" 
#include <angles/angles.h>   //角度转换的头文件
#include <cmath>
//std_msgs/String存放在std_msgs package里,由String.msg文件自动生成的头文件
#include <control_msgs/FollowJointTrajectoryAction.h>  
#include <control_msgs/FollowJointTrajectoryActionGoal.h>
#include <control_msgs/FollowJointTrajectoryGoal.h>
#include <trajectory_msgs/JointTrajectory.h>
#include <trajectory_msgs/JointTrajectoryPoint.h>
  
//回调函数,当message topic消息到达后会调用此函数  control_msgs/FollowJointTrajectoryActionGoal
void execute(const  control_msgs::FollowJointTrajectoryActionGoal::ConstPtr& msg)
{  
    std::cout << "points[0]: "  
             << "[" << (msg->goal.trajectory.points[0].positions[0]) * 180.0 / M_PI
             << "," << (msg->goal.trajectory.points[0].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[0].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[0].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[0].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[0].positions[5]) * 180.0 / M_PI  
             << "]" << std::endl ;

    std::cout << "points[1]: "  
             << "[" << (msg->goal.trajectory.points[1].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[1].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[1].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[1].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[1].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[1].positions[5]) * 180.0 / M_PI  
             << "]" << std::endl ;

std::cout << "points[2]: "  
             << "[" << (msg->goal.trajectory.points[2].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[2].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[2].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[2].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[2].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[2].positions[5]) * 180.0 / M_PI  
             << "]" << std::endl ;


std::cout << "points[3]: "  
             << "[" << (msg->goal.trajectory.points[3].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[3].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[3].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[3].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[3].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[3].positions[5]) * 180.0 / M_PI  
             << "]" << std::endl ;

std::cout << "points[4]: "  
             << "[" << (msg->goal.trajectory.points[4].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[4].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[4].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[4].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[4].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[4].positions[5]) * 180.0 / M_PI  
             << "]" << std::endl ;

 std::cout << "points[5]: "  
             << "[" << (msg->goal.trajectory.points[5].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[5].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[5].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[5].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[5].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[5].positions[5]) * 180.0 / M_PI  
             << "]" << std::endl ;    

std::cout << "points[6]: "  
             << "[" << (msg->goal.trajectory.points[6].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[6].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[6].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[6].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[6].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[6].positions[5]) * 180.0 / M_PI  
             << "]" << std::endl ;

std::cout << "points[7]: "  
             << "[" << (msg->goal.trajectory.points[7].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[7].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[7].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[7].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[7].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[7].positions[5]) * 180.0 / M_PI 
             << "]" << std::endl ;

std::cout << "points[8]: "  
             << "[" << (msg->goal.trajectory.points[8].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[8].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[8].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[8].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[8].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[8].positions[5]) * 180.0 / M_PI
             << "]" << std::endl ;

std::cout << "points[9]: "  
             << "[" << (msg->goal.trajectory.points[9].positions[0]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[9].positions[1]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[9].positions[2]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[9].positions[3]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[9].positions[4]) * 180.0 / M_PI  
             << "," << (msg->goal.trajectory.points[9].positions[5]) * 180.0 / M_PI  
             << "]" << std::endl ;

}  
  
int main(int argc, char **argv)  
{  
    
    //初始化ROS,注意:名称必须唯一  
    ros::init(argc, argv, "test1");  
  //监听/arm_controller/follow_joint_trajectory/goal话题发布的消息
    //设置节点进程句柄  
    ros::NodeHandle n;  
  
    //参数一为订阅的话题名称(/arm_controller/follow_joint_trajectory/goal);  
    //参数二是消息缓存队列,这里设置为1000,即缓存了1000个消息后,如果由新的消息到达,则开始丢弃先前接收的消息;  
    //参数三为当收到消息后调用的函数名称(execute)  
    ros::Subscriber sub = n.subscribe("/arm_controller/follow_joint_trajectory/goal", 1000, execute);  
      
    //ros::spin()进入自循环,可以尽可能快的调用消息回调函数  
    ros::spin();    
    return 0;  
}  

三、编写CMakeLists.txt文件

这里仅仅在自动生成的CMakeLists.txt文件后面加了以下两句话,并没有额外添加什么依赖

add_executable(test1 src/test1.cpp)
target_link_libraries(test1 ${catkin_LIBRARIES})

四、编译

$ cd ~/catkin_ws
$ catkin_make --pkg test

执行编译完成后运行该节点就行了
 

$ rosrun test test1

当在rviz中用moveit设置一个目标姿态,然后plan and execute的时候,/arm_controller/follow_joint_trajectory/goal这个地方就有路径数据出来了,我们编写的这个test1节点就可以截获到数据了。

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值