奥特学园ROS笔记--3(122-143节)

上一节:奥特学园ROS笔记--2(76-120节)_echo_gou的博客-CSDN博客

目录

122节 常用API

123-132节 常用函数(c++)

133-141节 常用函数(python)

141节 自定义头文件的调用*

142节 自定义源文件的调用*

 143 python模块的导入


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节 自定义头文件的调用*

需求:设计头文件,可执行文件本身作为源文件。

流程:

  1. 编写头文件;
  2. 编写可执行文件(同时也是源文件);
  3. 编辑配置文件并执行。

创建功能包,在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节 自定义源文件的调用*

需求:设计头文件与源文件,在可执行文件中包含头文件。

流程:

  1. 编写头文件;
  2. 编写源文件;
  3. 编写可执行文件;
  4. 编辑配置文件并执行。

新建一个功能包:创建一个和上一节一样的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()动态获取当前路径

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值