ROS 编程基础

内 容:

1. 熟悉 ROS 功能包的基本组织架构、创建与编译;创建一个功能包 test_pkg_xxx 并编译。
2. 用 C++、python 语言编程实现发布者的消息发布和订阅者的消息订阅。
3. 在熟悉 ROS 的通信接口——消息的基础上,创建并编译自定义消息。

步 骤:

(一)安装 VSCode 编译环境及其插件

  1. 在 VSCode 官网 https://code.visualstudio.com/下载 Linux 环境下的.deb 安装包“code_1.75.1-1675893397_amd64.deb”。
  2. 将安装包拷贝到 Ubuntu 桌面并安装。
    安装包在一篇文件中有,因为安装包的特殊性,可能会出现分享文件夹使用不了的情况,这里我是先把安装包上传到网络上(qq)然后再下载到Ubuntu上。
    ROS 编程基础_第1张图片
  3. 从“显示应用程序”中找到“Visual Studio CODE”图标,鼠标右键“添加到收藏夹”。
    ROS 编程基础_第2张图片
  4. 从收藏夹快速启动 VSCode,从左侧快捷工具栏中选择“扩展商店”,安装 ROS 开发所需要的 VScode 插件:
    ROS,C/C++,Python,中文简体,CMake Tools。
    ROS 编程基础_第3张图片
    先安装中文搜索chinese
    中文
    ROS 编程基础_第4张图片

(二)创建并编译功能包

1. 创建功能包

在 catkin_ws 工作空间下的 src 文件夹内创建 test_pkg_xxx 功能包

cd ~/catkin_ws/src 
catkin_create_pkg test_pkg_xxx std_msgs roscpp rospy

ROS 编程基础_第5张图片
ROS 编程基础_第6张图片
可以看到在包内生成了 CMakeLists.txt 和 package.xml 文件。

2. 编译功能包

在终端输入以下命令,进行编译:

cd ~/catkin_ws 
catkin_make 
source devel/setup.bash

ROS 编程基础_第7张图片
ROS 编程基础_第8张图片
这里如果出现了报错,那就看看报错的地方问题出在哪。如果找不到,那就把之前创造的文件全部删除,然后重新进行这个步骤。

(三)Publisher 的编程实现(C++)

该 Publisher 发布一个 turte1/cmd_vel 话题,里面包含 geometry_msgs::Twist 数据结构这样的一个消息,以完成控制海龟的线速度、角速度,实现特定运动。具体实现步骤如下:

1. 创建功能包,添加依赖库

创建功能包,并添加一些依赖库:

cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

ROS 编程基础_第9张图片

2.c++编程

进入功能包中的 src 文件夹,创建一个 velocity_publisher.cpp 的文件
cd进入刚刚创建的learning_topic文件夹下的src文件夹,生成cpp文件,命名成velocity_publisher.cpp

cd learning_topic/src/
touch velocity_publisher.cpp

输入以下 C++代码:

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include 
#include 
int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "velocity_publisher");
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
    // 设置循环的频率
    ros::Rate loop_rate(10);
    int count = 0;
    while (ros::ok())
    {
        // 初始化geometry_msgs::Twist类型的消息
        geometry_msgs::Twist vel_msg;
        vel_msg.linear.x = 0.5;
        vel_msg.angular.z = 0.2;
        // 发布消息
        turtle_vel_pub.publish(vel_msg);
        ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
                vel_msg.linear.x, vel_msg.angular.z);
        // 按照循环频率延时
        loop_rate.sleep();
    }
    return 0;
}
3. 编译程序

编译前需要先在~/catkin_ws/src/learning_topic/ 下的CMakeLists.txt文件添加两条语句。
配置 CMakeLists.txt 中的编译规则:

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

粘贴位置在## Install ##正上
ROS 编程基础_第10张图片
接下来在终端依次输入以下命令,编译发布者cpp程序

cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore

出现 100%表示编译成功。
ROS 编程基础_第11张图片
ROS 编程基础_第12张图片

4. 运行程序

打开一个终端,运行 roscore 打开 ROS 空间

roscore

再开启一个终端,运行以下命令打开海龟仿真器:

rosrun turtlesim turtlesim_node

再开启一个终端,运行以下命令,执行功能包中的程序:

source ~/catkin_ws/devel/setup.bash 
rosrun learning_topic velocity_publisher

ROS 编程基础_第13张图片
接下来我们就可以看到小乌龟在画圈圈了。

(四)消息发布者 Publisher 的编程实现(python)

这里我是在网上搜索跟古月居实现的,有需要的可以去看看,链接放这里
跟古月居学ros

(五)订阅者Subscriber 的编程实现(C++)

通过海龟仿真器来发布数据,实现一个订阅者来订阅海龟的位姿信息。具体实现步骤如下:

1. 订阅者的 C++编程

进入功能包中的 src 文件夹,创建一个 pose_subscriber.cpp 的文件,并输入以下 C++代码:

/** 
* 该例程将订阅/turtle1/pose 话题,消息类型 turtlesim::pose 
*/ 
#include  
#include “turtlesim/Pose.h” 
//接收到订阅的消息后,会进入消息回调函数 
void poseCallback(const turtlesim::Pose::ConstPtr& msg) 
{ 
// 将接收到的消息打印出来 
ROS_INFO(“Turtle pose: x:%0.6f,y:%0.6f, msg->x, msg->y); 
} 
int main(int argc, char **argv) 
{ 
// 初始化 ROS 节点 
ros::init(argc, argv,” pose_subscriber”); 
//创建节点句柄 
ros::NodeHandle n; 
// 创建一个 subscriber,订阅名为/turtle1/pose 的 topic,注册回调函数 poseCallback 
ros::Subscriber pose_sub = n.subscribe(/turtle1/pose”, 10, poseCallback); 
// 循环等待回调函数 
ros::spin(); 
return 0; 
} 

这里要注意,中文英文,再复制过程中可能会出现报错。
ROS 编程基础_第14张图片

2. 编译程序

配置 CMakeLists.txt 中的编译规则:
ROS 编程基础_第15张图片
设置需要编译的代码和生成的可执行文件:
add_executable(pose_subscriber src/pose_subscriber.cpp)
设置链接库:
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

add_executable(pose_subscriber src/pose_subscriber.cpp) 
target_link_libraries(pose_subscriber ${catkin_LIBRARIES}) 

接下来和前面步骤相同
source ~/catkin_ws/devel/setup.bash
设置环境变量后进行编译,编译成 c++的可执行文件。
进入到 catkin_ws 工作空间中执行 catkin_make,出现 100%表示编译成功

cd ~/catkin_ws
catkin_make
source devel/setup.bash

ROS 编程基础_第16张图片
如果这个地方出现报错的话,首先去看看是报错在哪,是哪个文件出错了,然后去文件里面改,我之前就是前面的c文件英文打成中文了。如果出现很长一段报错,恭喜你,删除文件,重新来过。

3. 运行程序

打开一个终端运行 roscore,打开 ROS 空间。
再运行以下命令,开启一个终端运行海龟仿真器:
rosrun turtlesim turtlesim_node
开启一个终端执行功能包中的程序:

source ~/catkin_ws/devel/setup.bash 
rosrun learning_topic pose_subscriber

ROS 编程基础_第17张图片
用键盘控制指令移动小海龟,读取到的坐标也会发生变化:

rosrun turtlesim turtle_teleop_key

ROS 编程基础_第18张图片

(六)订阅者 Subscriber 的编程实现(python)

1.创建Python代码
touch pose_subscriber.py

ROS 编程基础_第19张图片

2.编写.py文件内容
#!/usr/bin/env python
# -*- coding: utf-8 -*-
########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################
# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
import rospy
from turtlesim.msg import Pose
def poseCallback(msg):
    rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)
def pose_subscriber():
	# ROS节点初始化
    rospy.init_node('pose_subscriber', anonymous=True)
	# 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    rospy.Subscriber("/turtle1/pose", Pose, poseCallback)
	# 循环等待回调函数
    rospy.spin()
if __name__ == '__main__':
    pose_subscriber()

ROS 编程基础_第20张图片

3.授权文件

ROS 编程基础_第21张图片

4.程序编译

cd ~/catkin_ws
catkin_make
source devel/setup.bash

5.程序运行

roscore
rosrun turtlesim turtlesim_node
source ~/catkin_ws/devel/setup.bash
rosrun learning_topic pose_subscriber.py
rosrun turtlesim turtle_teleop_key
ROS 编程基础_第22张图片
总的来说用python做这一步和上面用python画圈圈有一点点相似,也是就是依据上面两个步骤,照葫芦画瓢。

(七)自定义消息的创建与编译

1. 完成数据接口的定义

在~/catkin_ws/src/learning_topic 目录下,创建 msg 文件夹及 Person.msg 文件在终端输入
以下命令:

touch Person.msg

ROS 编程基础_第23张图片
打开该文件,并写入以下内容,在编译的时候会编译成相应的 c++或者 python 可执行文件。

string name 
uint8 sex 
uint8 age 
uint8 unknown = 0 
uint8 male = 1 
uint8 female = 2 

ROS 编程基础_第24张图片

2. 定义设置编译规则

针对数据接口的定义设置编译规则,在功能包里边的 package.xml 中加载两项依赖:
在 package.xml 文件中添加以下两条语句,加载编译依赖和加载执行依赖:

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

ROS 编程基础_第25张图片

3. 添加编译选项

在 CMakeLists.txt 添加编译选项,添加依赖功能包,如图
find_package( …… message_generation)
ROS 编程基础_第26张图片
在 CMakeLists.txt 添加一个把.msg 文件编译成对应的不同的程序文件的配置项。
添加语句说明:
add_message_files(FILES Person.msg) 将 Person.msg 作为定义的交接接口,在编译时会发现该接口,针对它去做编译。

generate_messages(DEPENDENCIES std_msgs) 针对 Person.msg 需要用到

std_msgadd_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

ROS 编程基础_第27张图片

4. 添加依赖项

在 CMakeLists.txt 文件 catkin_package 中添加 message_runtime 的一个运行的依赖:

CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim 

ROS 编程基础_第28张图片

5. 编译

回到工作空间目录下 cd ~/catkin_ws 进行编译:
在这里插入图片描述

cd ~/catkin_ws
catkin_make

ROS 编程基础_第29张图片
——————————————————————————————————
总结一下我在整个过程中出现的问题:
1.在进行第步骤五时,编译的代码中英文符号没有很好的切换,导致编译时候报错。我的整个过程每进行一步都会进行编译,如果你的编译出现了报错,那么先看看自己报错的问题出在哪,如果出现很长很长的报错,那么恭喜你,文件损坏,重新来过。
2.在这里插入图片描述
在进行程序运行的时候要用source ~/catkin_ws下到其目录下,不然就会出现我上面这种情况,找不到文件
3.要仔细一点,整个过程下来有些长,花费时间也会不少,有些地方出问题了不能就不搞了,自己要学会去看错误,去分析错误。

后面会继续分享我所学习到有关ros相关的文章

你可能感兴趣的:(智能机器人,linux,ubuntu)