【ROS无人驾驶系列】1 软件环境基础(ROS CMake) 上

news/2024/5/18 22:17:00 标签: linux, c++, 自动驾驶, 强化学习, cmake

【ROS无人驾驶系列】1 软件环境基础(ROS CMake) 上

  • 01 创建ROS的工作空间
    • 1.1 创建catkin工作空间
    • 1.2 编译工作空间
    • 1.3 设置环境变量
    • 1.4 检查环境变量
  • 02 功能包的创建
  • 03 功能包的源代码编写
    • 3.1 编写发布器节点(july_say_node.cpp)
  • 03 功能包的编译配置(编译节点)
  • 04 功能包的编译
  • 05 测试消息发布器和订阅器
    • 5.1 启动发布器

7月在线课程【全】无人驾驶系列知识入门到提高
学习笔记

01 创建ROS的工作空间

1.1 创建catkin工作空间

创建一个 catkin 工作空间:

$ mkdir -p ~/catkin_ws/src  # 创建了第二层级的文件夹src,这是放ROS软件包的地方
$ cd ~/catkin_ws/src        # 进入工作空间,catkin_make必须在工作空间这个路径上执行
$ catkin_init_workspace     # 初始化src目录,生成的CMakeLists.txt为功能包编译配置

1.2 编译工作空间

$ cd ~/catkin_ws   # 回到工作空间,catkin_make必须在工作空间下执行;
$ catkin_make     # 开始编译,调用系统自动完成编译和链接过程,构建

生成目标文件
注意: catkin编译之前需要回到工作空间目录,catkin_make在其他路径下编译不会成功。
编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。
这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误。

1.3 设置环境变量

另外,如果你查看一下当前目录应该能看到 ‘build’ 和 ‘devel’ 这两个文件夹。在 ‘devel’ 文件夹里面你可以看到几个 setup.*sh 文件。source 这些文件中的任何一个都可以将当前工作空间设置在ROS工作环境的最顶层。接下来首先 source 一下新生成的 setup.*sh 文件:

$ source devel/setup.bash   # 刷新坏境

1.4 检查环境变量

要想保证工作空间已配置正确,需确保ROS_PACKAGE_PATH环境变量包含你的工作空间目录,采用以下命令查看:

$ echo $ROS_PACKAGE_PATH
#  出现 /home/<youruser>/catkin_ws/src:/opt/ros/kinetic/share

到此你的工作环境已经搭建完成。
创建好了一个ROS的工作空间了,接下来就是在catkin_ws工作空间下的src目录下新建功能包并进行功能包程序。

02 功能包的创建

在catkin_ws/src/目录下新建功能包topic_example,并在创建时显式的指明依赖roscpp和std_msgs。打开命令行终端,输入命令:

$ cd ~/catkin_ws/src

#创建功能包topic_example时,显式的指明依赖roscpp和std_msgs,
#依赖会被默认写到功能包的CMakeLists.txt和package.xml中
$ catkin_create_pkg july_say roscpp std_msgs

03 功能包的源代码编写

功能包中需要编写两个独立可执行的节点,一个节点用来发布消息,另一个节点用来订阅消息,所以需要在新建的功能包july_say/src/目录下新建两个文件talker.cpp和listener.cpp,并将下面的代码分别填入。

3.1 编写发布器节点(july_say_node.cpp)

『节点』(Node) 是指 ROS 网络中可执行文件。接下来,我们将会创建一个发布器节点(“talker”),它将不断的在 ROS 网络中广播消息。

如何实现一个发布者

  1. 初始化ROS系统;
  2. 在 ROS 网络内广播我们将要在 july 话题上发布 std_msgs/String 类型的消息;
  3. 以每秒 10 次的频率在 chatter 上发布消息。
// ros/ros.h 是一个实用的头文件,它引用了 ROS 系统中大部分常用的头文件。
#include "ros/ros.h"
/*这引用了 std_msgs/String 消息, 它存放在 std_msgs package 里,是由 String.msg 文件自动生成的头文件。需要关于消息的定义,可以参考 msg 页面。
 */
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char ** argv) {
    // 初始化 ROS;
    // 可以指定节点名称,节点的名称必须唯一。
    ros::init(argc, argv, "july_talker");

    // 为这个进程的节点创建一个句柄;
    /* 第一个创建的 NodeHandle 会为节点进行初始化,最后一个销毁的 NodeHandle 则会释放该节点所占用的所有资源。
    */
    ros::NodeHandle n;//NodeHandle是ros提供的一些类,可以通过这个类来实例化一些publisher,即我这个节点要发布的哪些数据

    //创建一个Publisher,发布名为july的topic,消息类型为std_mags::String
    /*告诉 master 我们将要在 july(话题名)上发布 std_msgs/String 消息类型的消息。这样 master 就会告诉所有订阅了july_topic话题的节点,将要有数据发布。第二个参数是发布序列的大小。如果我们发布的消息的频率太高,缓冲区中的消息在大于 10 个的时候就会开始丢弃先前发布的消息。
    */
    /*NodeHandle::advertise() 返回一个 ros::Publisher 对象,它有两个作用: 1) 它有一个 publish() 成员函数可以让你在topic上发布消息; 2) 如果消息类型不对,它会拒绝发布。*/
    ros::Publisher july_pub = n.advertise<std_msgs::String>("july_topic", 10);//july_topic会发送std_msgs类型的数据,10代表发送的数据放到ros-master缓存里面最多10个,超过10个以前没有用的数据会被抛弃掉

    //设置循环的频率以 10Hz 的频率运行。
    /*
     ros::Rate 对象可以允许你指定自循环的频率。它会追踪记录自上一次调用 Rate::sleep() 后时间的流逝,并休眠直到一个频率周期的时间。
    */
    ros::Rate loop_rate(10);//频率,talk的速度,10HZ

    int count = 0;
    //创建一个主循环
    while (ros::ok()) // 一旦 ros::ok() 返回 false, 所有的 ROS 调用都会失效。
    {
        // 初始化std_msgs::String类型的消息
        std_msgs::String msg;//把数据装到std_msgs里面,然后再发布

        std::stringstream ss;
        ss << "hello july" << count;//把消息装进去
        count++;
        msg.data = ss.str();//把讲的话包装再msg里面
        //向所有订阅 july 话题的节点发送消息。
        july_pub.publish(msg);//最重要!!把消息发送出去
        // 按照循环频率延时; 调用 ros::Rate 对象来休眠一段时间以使得发布频率为 10Hz。
        loop_rate.sleep();
    }

    return 0;
}

03 功能包的编译配置(编译节点)

说明:

  1. C++代码必须通过编译生成可执行文件;
  2. python代码是可执行文件,不需要编译;

如何编译代码
4. 设置需要编译的代码和生成的可执行文件;
5. 设置链接库;
6. 设置依赖。
创建功能包topic_example时,显式的指明依赖roscpp和std_msgs,依赖会被默认写到功能包的
在 CMakeLists.txt 中取消这几句的注释

find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/july_say_node.cpp)
target_link_libraries(${PROJECT_NAME}_node
   ${catkin_LIBRARIES}
 )

取消注释就好

04 功能包的编译

$ cd ~/catkin_ws
$ catkin_make -DCATKIN_WHITELIST_PACKAGES="july_say"    
$ source ~/catkin_ws/devel/setup.bash   # 刷新环境

05 测试消息发布器和订阅器

5.1 启动发布器

第一步,打开一个命令行终端:

$ roscore

第二步,再打开一个命令行终端:

# 用rosrun <package_name> <node_name>启动功能包中的发布节点。
$ source ~/catkin_ws/devel/setup.bash    # 激活catkin_ws工作空间(必须有,必不可少) 
$ rosrun july_say july_say_node

现在还没有任何显示
检测是否成功,在cmd输入

willing@willing-virtual-machine:~$ rostopic list
/july_topic
/rosout
/rosout_agg
willing@willing-virtual-machine:~$ rosnode list
/july_talker
/rosout
willing@willing-virtual-machine:~$ rostopic echo july_topic
data: "hello july2039"
---
data: "hello july2040"
---
data: "hello july2041"
---
data: "hello july2042"
---

成功了
接下来编写listener,在cmd输入

willing@willing-virtual-machine:~$ cd catkin_ws
willing@willing-virtual-machine:~/catkin_ws$ cd src
willing@willing-virtual-machine:~/catkin_ws/src$ catkin_create_pkg july_listen std_msgs roscpp
Created file july_listen/CMakeLists.txt
Created file july_listen/package.xml
Created folder july_listen/include/july_listen
Created folder july_listen/src
Successfully created files in /home/willing/catkin_ws/src/july_listen. Please adjust the values in package.xml.
willing@willing-virtual-machine:~/catkin_ws/src$ ls
CMakeLists.txt  july_listen  july_say

用clion打开july_listen project
接下集


http://www.niftyadmin.cn/n/1399197.html

相关文章

【C++基础语法入门】7 指针

【C基础语法入门】7 指针7.1 基本概念7.2 指针变量的定义与使用7.3 指针所占内存空间7.4 空指针和野指针7.5 const修饰指针7.6 指针和数组7.7 指针和函数7.8 指针、数组、函数黑马程序员匠心之作|C教程从0到1入门编程 学习笔记 目标&#xff1a;对C有初步了解&#xff0c;能够有…

【自动驾驶入门:从建模到跟随】1 环境搭建和建模准备

【自动驾驶入门&#xff1a;从建模到跟随】1 环境搭建和建模准备1 配置环境2 Gazebo2.1 Gazebo2.2 使用roslaunch打开world模型3 在仿真世界中添加一个立方体3.1 学习 urdf3.2 学习 xacro准备工作&#xff1a;具备ROS基础知识&#xff08;古月&#xff1a;ROS入门21讲&#xff…

【自动驾驶入门:从建模到跟随】 2 创建小车基础模型

【自动驾驶入门&#xff1a;从建模到跟随】2 创建小车基础模型准备工作&#xff1a;具备ROS基础知识&#xff08;古月&#xff1a;ROS入门21讲&#xff09; 自动驾驶入门&#xff1a;从建模到跟随 学习笔记 参考&#xff1a; https://github.com/czhherry/self-driving-vehicl…

【C++基础语法入门】8 结构体

【C基础语法入门】8 结构体8.1 基本概念8.2 定义和使用8.3 结构体数组8.4 结构体指针8.5 结构体嵌套结构体8.6 结构体做函数参数8.7 结构体中const使用场景8.8 结构体案例8.8.1 案例18.8.2 案例2黑马程序员匠心之作|C教程从0到1入门编程学习笔记目标&#xff1a;对C有初步了解&…

【C++基础语法入门】9 通讯录管理系统

【C基础语法入门】9 通讯录管理系统1. 系统需求2. 实现步骤1.1 菜单功能1.2 添加联系人1.3 显示联系人1.4 删除联系人1.5 查找联系人1.6 修改联系人1.7 清空联系人3 全部代码展示4 结果展示黑马程序员匠心之作|C教程从0到1入门编程 学习笔记 目标&#xff1a;对C有初步了解&…

【C++核心编程】1 内存分区模型

【C核心编程】1 内存分区模型1.1 程序运行前1.2 程序运行后1.3 new操作符黑马程序员匠心之作|C教程从0到1入门编程学习笔记本阶段主要针对C 面向对象编程技术做详细讲解&#xff0c;探讨C中的核心和精髓内存大致分为4个区域&#xff1a; 代码区&#xff1a;存放函数体的二进制…

【C++核心编程】2 引用

【C核心编程】2 引用2.1 基本使用2.2 注意事项2.3 引用做函数参数2.4 引用做函数返回值2.5 引用的本质2.6 常量引用黑马程序员匠心之作|C教程从0到1入门编程学习笔记本阶段主要针对C 面向对象编程技术做详细讲解&#xff0c;探讨C中的核心和精髓2.1 基本使用 作用&#xff1a;…

【C++核心编程】3 函数提高

【C核心编程】3 函数提高3.1 函数默认参数3.2 函数占位参数3.3 函数重载3.3.1 函数重载概述3.3.2函数重载注意事项黑马程序员匠心之作|C教程从0到1入门编程学习笔记本阶段主要针对C 面向对象编程技术做详细讲解&#xff0c;探讨C中的核心和精髓3.1 函数默认参数 在c中&#xf…