ros使用服务启动节点

编程入门 行业动态 更新时间:2024-10-06 20:40:00

ros使用服务启动<a href=https://www.elefans.com/category/jswz/34/1771452.html style=节点"/>

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使用服务启动节点

本文发布于:2024-03-09 03:15:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1723577.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:节点   ros

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!