节点"/>
ros使用服务启动节点
ros使用服务启动节点
最近在忙图形化编程后台程序编写,而由于我们的底盘工控机性能问题不能开机把所有程序自启,特别是摄像头和识别的一些节点。然鹅我连ros开机自启都不知道怎么整,后来在网上看了ros通过gnome-session-properties开机自启ros节点。忽然想到在程序中运行一个脚本,这个脚本中 启动ROS应用程序,任务不就完成了!那一刻我仿佛看到了我的:
说干就干,用一句:
system("roslaunch /home/ln/oryxbot_ws/src/ar_pose_adjust/launch/ar_track_camera.launch&")
通过服务call节点忽然笔记本电脑摄像头的灯亮了,ctrl+c关闭程序摄像头完美。敲完完事。
。
。
。
然鹅,正当我想着升职加薪的时候悲催才刚刚开始,
Ctrl+c???图形化编程???我是不是发现了什么?
然后经历了多线程,线程并不能回收打开的节点;多进程,也不行,并且有一次标志位忘了清标志位,以rate(100)的速度创建开启摄像头节点的子进程,瞬间电脑就卡成PPT了/(ㄒoㄒ)/~
后来想Ctrl+c是发送一个信号而已,就给这个进程发送信号不就完了!
int killa;killa=getProcessPidByName("/opt/ros/kinetic/lib/tf/static_transform_publisher");kill(killa,SIGTERM);killa=getProcessPidByName("/home/ln/oryxbot_ws/devel/lib/ar_track_alvar/individualMarkersNoKinect");kill(killa,SIGTERM);killa=getProcessPidByName("/opt/ros/kinetic/lib/rviz/rviz");kill(killa,SIGTERM);
然后就有了这种不太清真的解决方式,kill掉每一个进程,毕竟一个launch文件有很多节点开启很多进程。
》》》
又后来,发现了launch文件的required参数,当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。这样的话就可以杀死一个节点从而退出整个launch文件了。在每一个启动的launch文件主要节点增加如下:
<node name="ar_track_alvar" pkg="ar_track_alvar" type="individualMarkersNoKinect" required="true" output="screen">
然后程序里面只需要kill掉这个节点就可以了。
坑填了一个挖一个,暂时就只有这种解决方式了。
代码如下:
oryxbot_interaction.cpp
#include<unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>#include "ros/ros.h"
#include "oryxbot_msgs/standard_mode.h"uint8_t usb_state=0,ar_state=0;//进程id返回函数。
pid_t getProcessPidByName(const char *proc_name)
{FILE *fp;char buf[100];char cmd[200] = {'\0'};pid_t pid = -1;sprintf(cmd, "pidof %s", proc_name);if((fp = popen(cmd, "r")) != NULL){if(fgets(buf, 255, fp) != NULL){pid = atoi(buf);}}printf("pid = %d \n", pid);pclose(fp);return pid;
}//打开launch回调函数
bool usbcam_callback(oryxbot_msgs::standard_mode::Request &req,oryxbot_msgs::standard_mode::Response &res)
{if(req.mode==1&&req.number==0&&usb_state==0){if(system("roslaunch /home/ln/oryxbot_ws/src/ar_pose_adjust/launch/usb_cam_with.launch&")<0){ROS_ERROR("system() errorr");}else{usb_state=1;}}else if(req.mode==0&&req.number==0&&usb_state==1){int killa;killa=getProcessPidByName("/opt/ros/kinetic/lib/usb_cam/usb_cam_node");kill(killa,SIGTERM);usb_state=0;}else if(req.mode==1&&req.number==1&&ar_state==0){if(system("roslaunch /home/ln/oryxbot_ws/src/ar_pose_adjust/launch/ar_track_camera.launch&")<0){ROS_ERROR("system() errorr");}else{ar_state=1;}}else if(req.mode==0&&req.number==1&&ar_state==1){int killa;killa=getProcessPidByName("/home/ln/oryxbot_ws/devel/lib/ar_track_alvar/individualMarkersNoKinect");kill(killa,SIGTERM);ar_state=0; }return true;
}int main(int argc,char** argv)
{ros::init(argc,argv,"oryxbot_interaction");ros::NodeHandle n;ros::ServiceServer intera=n.advertiseService("oryxbot_interaction",usbcam_callback);ros::spin();return 0;
}
standard_mode.srv定义如下:
uint8 number
uint8 mode
---
bool success
string message
更多推荐
ros使用服务启动节点
发布评论