【ROS-0】基础篇

发布于:2023-01-20 ⋅ 阅读:(472) ⋅ 点赞:(0)

目录

【ROS-1】ubuntu 安装ROS

【ROS-2】创建ROS工作空间

【ROS-3】自定义消息

【ROS-4】ROS话题

【ROS-5】Launch文件

【ROS-6】RVIZ


【ROS-1】ubuntu 安装ROS

参考链接:

Ubuntu安装ROS系统_枕头与面包的博客-CSDN博客_ubuntu安装ros

Ubuntu18.04上安装ROS的详细教程_sws青年的博客-CSDN博客_ubuntu18.04安装ros

WorkSpace --- 自定义的工作空间

    |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。

    |--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。

    |--- src: 源码

        |-- CMakeLists.txt: 编译的基本配置

        |-- package:功能包(ROS 基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成

            |-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件

            |-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)

            |-- scripts 存储 python 文件

            |-- src 存储 C++ 源文件

            |-- include 头文件

            |-- msg 消息通信格式文件

            |-- srv 服务通信格式文件

            |-- action 动作格式文件

            |-- launch 可一次性运行多个节点 

            |-- config 配置信息

        |-- package

参考链接 ROS基础教程_Flower_For_Algernon的博客-CSDN博客_ros教程

【ROS-2】创建ROS工作空间

1、创建工作空间

mkdir -p  catkin_ws/src      #工作空间名称catkin_ws自定义
cd catkin_ws
catkin_make   #编译

catkin_ws就是我们创建的工作空间的名称,工作空间包括src(代码空间)、build(编译空间)、devel(开发空间)、install(安装空间)。

在编译完工作空间之后,需要source一下,来让工作空间中的环境变量生效。

source devel/setup.bash

source完之后,仅对本次开启的终端窗口有效。以后每次打开一个终端需要重新source一下,因此下在终端键入

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

这样环境变量就可以在所有终端中有效了。

为确保环境变量已经生效,键入一下命令检查

echo $ROS_PACKAGE_PATH

出现以下命令行,则说明环境变量已经生效

/home/lizh/catkin_ws/src:/opt/ros/melodic/share

2、创建功能包

# 功能包一定要创建在工作空间下。 
cd src catkin_create_pkg ros_test roscpp rospy std_msgs    #自定义ROS包名ros_test

备注: 创建的功能包ros_test依赖于 roscpp、rospy 与 std_msgs,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。

创建完包之后,回到工作空间根目录

cd ~/catkin_ws

进行编译

catkin_make
注:rosrun命令
rosrun package名 executable文件

参考链接 我的ROS入门教程(一) - 知乎

【ROS-3】自定义消息

在ROS中,话题通讯机制和服务通讯机制所用的消息类型是不同的,前者消息类型的后缀是.msg,而后者消息类型的后缀是.srv。

一、在功能包下创建msg文件夹存储自定义消息

# 定义消息类型时,名称尽量首字母大写
touch Person.msg

二、对package.xml和CMakeLists.txt进行修改

1、在package.xml中添加如下代码,注意添加的位置,放在<export>之前。

  <build_depend>message_generation</build_depend>   <exec_depend>message_runtime</exec_depend>

2、修改CMakeLists.txt

在find_package中添加message_generation

 取消add_message_files的注释,并添加自定义的消息文件,取消generate_messages的注释

cd ~/catkin_ws catkin_make

去掉CATKIN_DEPANDS前面的#,添加message_runtime

三、编译整个工作空间

cd ~/catkin_ws catkin_make

在终端中键入以下命令,即可查询自定义的消息

# 重新生成环境变量 
source catkin_ws/devel/setup.bash 
# rosmsg show 程序包名/消息类型 
rosmsg show learning_topic/Person

# rosmsg 命令行指令
rosmsg show    显示消息描述
rosmsg info    显示消息信息
rosmsg list    列出所有消息
rosmsg md5    显示 md5 加密后的消息
rosmsg package    显示某个功能包下的所有消息
rosmsg packages    列出包含消息的功能包

【ROS-4】ROS话题

一、ROS话题通信机制

 

发布者将消息发布到话题上,订阅者从话题订阅消息。也即:一个节点发布消息,另一个节点订阅该消息。

# rostopic命令行指令 
rostopic echo :打印话题信息 
rostopic hz :话题频率 
rostopic info :话题信息 
rostopic list:列举话题 
rostopic pub:往话题输入信息 
rostopic bw:话题带宽 
rostopic find:从数据类型寻找话题 
rostopic type:查看话题的数据类型

例:rostopic pub+话题名+话题类型+需要修改的参数及值 
话题类型为功能包名字/消息类型

# 查看节点之间的通讯关系 
rosrun rqt_graph rqt_graph

 

二、发布话题流程

1、创建一个发布者

2、创建消息数据

3、消息赋值

4、将消息发布出去

三、订阅话题流程

1、创建一个订阅者

2、创建一个回调函数

参考链接  ROS入门(一)——基本概念和话题 - 古月居

ROS入门学习笔记|话题发布与订阅_舟同学的博客的博客-CSDN博客_ros发布话题

四、示例程序:

1.发布者.cpp文件

cd ~/catkin_ws/src/learning_topic/src 
touch person_publisher.cpp 
sudo gedit person_publisher.cpp
/**
 * 该例程将发布/person_info话题,自定义消息类型learning_topic::Person
 */
#include <ros/ros.h>
#include "learning_topic/Person.h"
int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "person_publisher");
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
    ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);
    // 设置循环的频率
    ros::Rate loop_rate(1);
    int count = 0;
    while (ros::ok())
    {
        // 初始化learning_topic::Person类型的消息
    	learning_topic::Person person_msg;
		person_msg.name = "Tom";
		person_msg.age  = 18;
		person_msg.sex  = learning_topic::Person::male;
        // 发布消息
		person_info_pub.publish(person_msg);
       	ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", 
				  person_msg.name.c_str(), person_msg.age, person_msg.sex);
        // 按照循环频率延时
        loop_rate.sleep();
    }
    return 0;
}

2.订阅者.cpp文件

cd ~/sor_ws/src/learning_topic/src 
touch person_subscriber.cpp 
sudo gedit person_subscriber.cpp
/**
 * 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person
 */
#include <ros/ros.h>
#include "learning_topic/Person.h"
// 接收到订阅的消息后,会进入消息回调函数
void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", 
			 msg->name.c_str(), msg->age, msg->sex);
}
int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "person_subscriber");
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback
    ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);
    // 循环等待回调函数
    ros::spin();
    return 0;
}

3、再次配置CMakeLists.txt

cd ~/catkin_ws/src/learning_topic 
sudo gedit CMakeLists.txt

在build后面添加

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)

add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

再次编译:

cd ~/catkin_ws
catkin_make

打开新终端,输入

roscore

再打开一个新终端,设置环境变量,防止找不到可执行文件,再运行订阅者指令

source ~/sor_ws/devel/setup.bash
rosrun learning_topic person_subscriber

再打开一个新终端,运行发布者指令

source ~/sor_ws/devel/setup.bash
rosrun learning_topic person_publisher

【ROS-5】Launch文件

roslaunch能够实现同时启动多个节点,同时通过roslaunch启动节点时,不必提前单独开启roscore。

<!----------project.launch----------------->
<launch>
    <node pkg="learning_topic" type="persion_publisher" name="persion_publisher" output="screen" />
    <node pkg="learning_topic" type="persion_subscriber" name="persion_subscriber" output="screen" />
</launch>

<node>标记指定您希望启动的ROS节点。

  • pkg=“mypackage”, 包名
  • type=“nodetype” ,执行文件的名称如果是用Python编写的就填写xxx.py,如果是cpp就写编译生成的可执行文件名
  • name=“nodename”,这将会覆盖掉ros::init()定义的node_name
  • output="screen",日志打印到终端
# 运行指令 roslaunch 包名 文件名 
source catkin_ws/devel/setup.bash 
roslaunch learning_launch project.launch

参考链接  ROS学习记录10——.launch文件的编写与使用_康娜喵的博客-CSDN博客

【ROS学习笔记】15.launch启动文件的使用方法_takedachia的博客-CSDN博客_ros启动launch文件

【ROS-6】RVIZ

启动RVIZ 命令:

# 启动 roscore 
roscore 
# 另开一个终端,输入以下命令 
rviz
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到