Turtlebot_follower 使用记录
为了方便使用,我把turtlebot_apps 中的这个包拷贝到了我的工作目录中,直接编译即可
运行:
roslaunch turtlebot_follower follower.launch
此外,这个包与一般ROS的包不太一样,其他的包中一般都有可执行文件,而这个包中的follower.cpp却是作为库文件加载进去。
add_library(${PROJECT_NAME} src/follower.cpp)
因此,对follower的更改只能对库文件进行改动
如上图所示,我简单的连接了turtlebot运行了这个launch文件,从rqt图中可以看出这个程序的内部流程,主要就是turtlebot_follower将camera中的RGB-D信息进行处理,然后将控制信息(cmd_vel)发给kobuki 。而follower.cpp中的核心函数
void imagecb(const sensor_msgs::ImageConstPtr& depth_msg)
正是图像部分的回调函数,其他的函数基本上都是为整个程序架外设的。
我想添加的内容就是让这个程序在丢失所跟踪的人时,向其他模块发布一个话题。步骤很简单:
向函数
virtual void onInit()
添加
follow_pub_ = private_nh.advertise(“follow_msgs”,1);
然后在
void imagecb(const sensor_msgs::ImageConstPtr& depth_msg)
需要的位置处添加
std_msgs::String str;
str.data =”someflag”;
follow_pub_ .pub(str);
一切都很顺利,但是当接受话题的时候出现问题
rostopic echo /follow_msgs
所接受的话题中没有任何信息,但是当我在pub后面添加
std::cout << “I have publish this topic!”;
std:;cout << endl;
确实显示到了这一步。
新开一个终端查看话题信息:
rostopic list | grep follow_msgs
这时至少会出现两个话题名:
/camera1/follow_msgs //这个其实事先我也不知道,当时只是随便看一下,结果找到了
/follow_msgs
显示话题具体信息:
rostopic info TOPIC_NAME
结果发现/follow_msgs只有接受的节点,没有发布的节点
而/camera1/follow_msgs中pub的节点正是turtlebot_follower, 然后使用
rostopic echo /camera1/follow_msgs
实时显示我预想中的消息,事情解决。
原因分析:改动的程序中没有任何问题,但是(估计)默认的launch文件中有remap这个动作,而我并没有改动(但但是这是我自定义的话题啊啊啊!),将话题名/follow_msgs变成了/camera1/follow_msgs。
还有就是接收端对接受消息的处理,假设接收端的回调函数在收到消息时候会通过语音模块播放对应的语音,由于接受的消息有start(I will follow you)、following(I am following you)、lost(I have lost you),如果一直接受消息做出反应,语音则会一直播放(I am following you)之类的东西,而我并不能对接受的频率进行控制。
解决方案:
设置变量
follow_flag=”null”
每次调用回调函数时,加入if语句
if (msg.data == “STATE” && follow_flag != “STATE”) //STATE为接受的状态
{…
following_flag = “STATE”;
}
即加入微分式的判断,只有在状态变化时才进行所要执行的功能。