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
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值