上一节:奥特学园ROS笔记--2(76-120节)_echo_gou的博客-CSDN博客
目录
122节 常用API
熟练之后可以参考
官方文档:
123-132节 常用函数(c++)
123节
ros::init():
124节
ros::Nodehandle:创建句柄
nh.advertise<>():
125节
ros::spin()和ros::spinOnce():当callback(回调函数)的条件触发之后,在回调函数的下方如果存在spin函数,则执行一次回调函数,spin()每触发一次执行一次,相当于是进入了一个循环,此时就会一直去执行回调函数,spin()之后的代码就不会执行了。而spinonce只执行第一次触发,执行完之后还可以继续执行spinonce之后的代码。
126-130节
ros::Time
#include "ros/ros.h"
void cb(const ros::TimerEvent& event){ //对应需求4的回调函数
ROS_INFO("------------");
ROS_INFO("函数被调用的时刻:%.2f",event.current_real.toSec());
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"hello_time");
ros::NodeHandle nh; //使用时间api的时候此行是必须的
ros::Time rigth_now=ros::Time::now(); //将当前时刻(此行被调用的时候)时间返返回。参考时间:1970年1月1日
ROS_INFO("当前时间:%f",rigth_now.toSec());
ROS_INFO("当前时间:%d",rigth_now.sec);
ros::Time t1(20,123456); //距离1970年 20秒,123456纳秒的时间
ros::Time t2(40.1);
ROS_INFO("t1=%f",t1.toSec());
ROS_INFO("t2=%f",t2.toSec());
ROS_INFO("需求2----------------------------------");
ROS_INFO("开始休眠时间为:%.2lf",ros::Time::now().toSec());
ros::Duration du(4.5);
du.sleep(); //睡眠4.5秒
ROS_INFO("休眠结束时间为:%.2lf",ros::Time::now().toSec());
ROS_INFO("需求3----------------------------------");
ros::Time begin=ros::Time::now();
ros::Duration du1(5);
ros::Time stop=begin+du1;
ROS_INFO("开始时刻%.2f",begin.toSec());
ROS_INFO("结束时间:%.2f",stop.toSec());
//时刻之间的运算:相加不可行,相减可以
//ros::Time sum=begin+stop;
ros::Duration du2=begin-stop;
ROS_INFO("时刻相减:%.2f",du2.toSec());
//持续时间之间加减都可
ROS_INFO("持续时间相加:%.2f",(du1+du2).toSec());
ROS_INFO("持续时间相减:%.2f",(du1-du2).toSec());
ROS_INFO("需求4----------------------------------");
/*
createTimer()
使用:需要利用句柄创建一个定时器,然后利用回调函数
参数
ros::Duration period, //时间间隔
const ros::TimerCallback &callback, //回调函数
bool oneshot = false, //是否是一次性,即只执行一次回调函数
bool autostart = true //是否自动启动,
*/
ros::Timer timer =nh.createTimer(ros::Duration(1),cb,false,false);
timer.start(); //如果第四个参数为false,可以利用这个手动启动
ros::spin();
return 0;
}
131节
ros::shutdown()
132节
ROS_DEBUG("hello,DEBUG"); //不会输出
ROS_INFO("hello,INFO"); //默认白色字体
ROS_WARN("Hello,WARN"); //默认黄色字体
ROS_ERROR("hello,ERROR");//默认红色字体
ROS_FATAL("hello,FATAL");//默认红色字体
133-141节 常用函数(python)
133节
rospy.init_node()
134节
rospy.Publisher()
这里主要介绍参数latch
135-140节
rospy.Time
时刻之间不能加减
如果Timer里面是true那么回调函数就只执行一次
关闭节点:shutdown(),这里的回调函数为什么不需要spin()?
rospy.on_shutdown(cb) 关闭节点的时候,在关闭之前会执行这个on_shutdowncb中的回调函数
rospy.signal_shutdown("随便一个字符串")
141节 自定义头文件的调用*
需求:设计头文件,可执行文件本身作为源文件。
流程:
- 编写头文件;
- 编写可执行文件(同时也是源文件);
- 编辑配置文件并执行。
创建功能包,在plumbing_head中 新建头文件
右击新建文件
编写:
#ifndef _HELLO_H
#define _HELLO_H
//进行宏定义时为了防止重复引用头文件而引起重定义错误
/*
声明namespace
|--class
|--run
*/
namespace hello_ns{
class MyHello{
public:
void run();
};
}
#endif
然后创建可执行文件(.cpp文件)
注:这里(上图)要先配置.json文件中的includePath,将路径添加到其中才可以include(下图)(注意格式。不知道路径的可以右键在集成终端中打开后输入pwd查看)
然后就可以自动补齐不报错
然后编写代码:
#include "ros/ros.h"
#include "plumbing_head/hello.h"
namespace hello_ns{
void MyHello::run(){
ROS_INFO("run函数执行");
}
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"hello_head");
hello_ns::MyHello myhello;
myhello.run();
return 0;
}
然后要陪着cpp文件的CMakeLists文件
和之前不同的是这里多了一步放开注释步骤
然后和之前的add_excutable和add_dependencies和target_link_libraries
然后rosrun运行即可
142节 自定义源文件的调用*
需求:设计头文件与源文件,在可执行文件中包含头文件。
流程:
- 编写头文件;
- 编写源文件;
- 编写可执行文件;
- 编辑配置文件并执行。
新建一个功能包:创建一个和上一节一样的hello.h文件,然后为其在.json文件中添加路径
编写hello.cpp文件代码,这里要使用的代码
#include "ros/ros.h"
#include "plumbing_head_src/hello.h"
namespace hello_ns{
void MyHello::run(){
ROS_INFO("源文件中的run函数...");
}
}
然后编写use_hello.cpp来使用hello.cpp
#include "ros/ros.h"
#include "plumbing_head_src/hello.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"hello_head_src");
hello_ns::MyHello myhello;
myhello.run();
return 0;
}
配置CMakeLists(因为use_hello中只和hello.h之间存在关系(刚刚配置过),但是不能使用hello.cpp文件,所以这里配置cmake文件比之前一节更为复杂)配置分为两步:
库的配置:
首先
然后将
编写为(这里添加库,库中包含以下.h和.cpp文件):
最后配置这两部分:
然后才是可执行文件的配置:
这里注意和之前不同,因为use_hello需要链接到head_src库中,z所以要多出160这一行。
然后编译执行即可。
143 python模块的导入
tools.py:
#! /usr/bin/env python
#coding=UTF-8
num=100
use_tools.py:
#! /usr/bin/env python
#coding=UTF-8
import rospy
import tools
if __name__=="__main__":
rospy.init_node("use_tools")
rospy.loginfo("num=%d",tools.num)
然后chmod +x *.py
运行即可
视屏中说的不能查找模块的难题并没有遇到?老师说因为rosrun执行的工作空间并没有在scripts这个文件夹下,就找不到tools(我并没有出现这个情况)。
以下是老师的内容:
其中os.path.abspath()动态获取当前路径