嵌入式开发基础01:ROS的安装及小海龟仿真(基于Ubuntu18.04)

一、ROS的介绍

ROS(Robotic Operating System)是一个开源的机器人操作系统,旨在为机器人软件开发提供一套灵活、强大的工具和库。ROS最初是由斯坦福大学人工智能实验室(Stanford AI Lab)开发的,现在由OSRF(Open Source Robotics Foundation)维护。

ROS提供了一系列用于构建机器人应用程序的工具和库,包括通用的操作系统服务、硬件抽象、消息传递、包管理、可视化工具等。它支持多种编程语言(如C++、Python)和运行在各种操作系统上。ROS的设计使得不同的模块可以以节点的形式运行,通过消息传递进行通信,从而实现模块化、分布式的系统开发。

ROS被广泛应用于机器人领域,包括教育、研究和商业项目。借助ROS,开发人员可以更快地构建、测试和部署机器人应用程序

ROS有具如下特点

  • 分布式架构: ROS采用分布式架构,将机器人软件系统划分为多个独立的节点(Nodes),各节点之间通过消息传递进行通信。这种分布式的设计使得不同部分的开发和测试可以相对独立,同时也提高了系统的灵活性和扩展性。

  • 节点间通信: ROS 使用轻量级的消息传递机制来实现节点之间的通信。节点可以通过发布/订阅(Publish/Subscribe)方式或服务调用(Service Call)方式进行消息交换,这种通信方式简单高效,方便实现模块化和分布式系统。

  • 工具和库: ROS 提供了丰富的工具和库,包括用于机器人建模、感知、运动控制、导航、仿真等方面的功能包(Packages)。此外,ROS还提供了用于可视化、调试、数据记录、参数配置等工具,帮助开发人员更有效地构建和调试机器人应用程序。

二、实验准备

1、虚拟机软件:Oracle VM VirtualBox
2、操作系统:Ubuntu18.04版本
3、ROS文件源及密钥

三、ROS的安装

添加软件源及密钥

打开Ubuntu控制终端,输入下列代码,在 Ubuntu 系统中添加 ROS的软件源并向系统添加一个 GPG 密钥,用于验证从特定密钥服务器(keyserver.ubuntu.com)下载的软件包。以便通过 apt-get 等包管理工具安装。

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654

下载安装ROS

sudo apt update
sudo apt-get install ros-melodic-desktop-full

这里的ROS需要安装对应版本,否则会出现Unable to locate package ros-kinetic-desktop-full的错误,安装时间较长(笔者大概花了四十分钟

安装python-rosdep

“python-rosdep” 是 ROS(机器人操作系统)中的一个工具,用于管理软件包的依赖项。在 ROS 中,软件包通常会依赖于其他软件包或库,而 “rosdep” 则负责管理这些依赖关系。"

sudo apt install python-rosdep

初始化rosdep

sudo rosdep init: 这个命令用于初始化 rosdep 工具,主要是在系统中创建一个 ROS 软件包依赖项数据库的配置文件,以便后续使用 rosdep 来解决软件包的依赖关系。

rosdep update: 这个命令用于更新 rosdep 数据库,即更新系统中的软件包依赖项数据库,以确保数据库中包含最新的软件包依赖信息。通过运行该命令,可以保证在安装或构建 ROS 软件包时,rosdep 能够正确地解析和满足软件包的依赖关系。

sudo rosdep init
rosdep update

rosdep更新过程中可能会出现ERROR: error loading sources list: <urlopen error <urlopen error timed out的报错,重新执行rosdep update命令可能会得到解决(如果实在无法解决,尝试切换网络,或者在本文结尾提供的参考资料中尝试本地安装

设置环境变量

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

安装rosinstall

sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
# ROS开发需要的一些库

四、小海龟仿真

1、键盘控制小海龟移动

启动ROS Master

#建立新终端
roscore

启动小海龟仿真器

#建立新终端
rosrun turtlesim turtlesim_node

小海龟运动轨迹将会显示在此终端

启动小海龟控制节点

#建立新终端
rosrun turtlesim turtle_teleop_key

执行命令后通过键盘的上下左右键控制海龟移动

在这里插入图片描述

2、终端命令发布话题控制海龟的圆周运动

ROS的话题与消息

话题

ROS创建了一个连接所有进程的网络,通过这个网络节点之间完成交互,获取其他节点发布的信息。ROS网络是一个单一Master,多Nodes的图。当它运行起来后,Master相当于ROS网络中的路由器,它提供各种名字的管理,包括nodes、message、service的注册以及名字解析;同时也提供参数服务器,以树形的结构开始,类似于Linux文件系统,提供以斜杠开始的名字参数的查询。节点与节点之间以话题订阅的方式来进行通信,无需关心另一个Nodes在哪儿,只需关心两者在哪一个Topic上,用什么消息进行通信即可。

消息

Message是指在Nodes之间传递的消息,是多对多的。所以不需要关心哪些Nodes在生产这个消息,也不需要关心哪些Nodes在消费这个消息,只要这个Topic的名字和类型确定,就可以使用它或生产它。消息的本质是数据载体,记住:在消息编译好了之后会生成中间文件,**分别是给C++调用的中间文件和python调用的中间文件。**C++调用的文件在devel下的头文件中,python调用的在devel中的lib中。

消息的用法:在头文件的地方包含include“功能包名称/该消息编译产生的C++头文件”

要知道,你创建出来的消息就相当于在C++文件里创建了一个结构体,在C++文件中使用消息的话,就要在C++文件中创建数据对象,然后直接像javasript中向对象添加属性的方法添加数据就可以了

查看两个node之间的消息传递

在上面的三个终端运行的时候,新建一个终端输入下面的命令查看话题:

rqt_graph

在这里插入图片描述

可以看到/teleop_turtle发布者通过 /turtle1/cmd_vel 这个话题向订阅者 /turtlesim 进行发布内容。

创建ROS工作空间

创建并初始化一个 catkin 工作空间,在该工作空间中开始开发和构建 ROS 软件包。

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

编译ROS工作空间

cd ~/catkin_ws
catkin_make
source devel/setup.bash

检查环境变量

echo $ROS_PACKAGE_PATH

在这里插入图片描述

创建ROS功能包

在 catkin 工作空间的 src 目录下创建一个新的 ROS 软件包(learning_topic),该软件包会依赖于 std_msgs、rospy等 ROS 包。

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

编译功能包

cd ~/catkin_ws
catkin_make
source devel/setup.bash

C++程序的编写和编译

在位置~/catkin_ws/src/learning_topic/src/下创建并编辑publisher.cpp文件.

cd ~/catkin_ws/src/learning_topic/src/
touch publisher.cpp
gedit publisher.cpp

话题发布逻辑:
1.初始化ROS节点;
2.向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型;
3.创建消息数据;
4.按照一定频率循环发布消息。

基于以上话题发布逻辑,publisher.cpp的代码如下:

#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "geometry_msgs/Twist.h"

int main(int argc, char **argv)
{
	//初始化节点
	ros::init(argc, argv, "publisher");
	//创建节点句柄
	ros::NodeHandle n;
	//创建publisher,发布话题[/turtle1/cmd_vel],消息类型[geometry_msgs::Twist]
	ros::Publisher chatter_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 1000);
	//设置循环频率
	ros::Rate loop_rate(100);
	while (ros::ok())
	{
		//定义发布的数据
		geometry_msgs::Twist msg;
		//定义linear数据
		geometry_msgs::Vector3 linear;
		linear.x=1;
		linear.y=0;
		linear.z=0;
		//定义angular数据
		geometry_msgs::Vector3 angular;
		angular.x=0;
		angular.y=0;
		angular.z=1;
		msg.linear=linear;
		msg.angular=angular;
		//发布msg数据
		chatter_pub.publish(msg);
		//循环等待回调函数
		ros::spinOnce();
		//按照循环频率延时
		loop_rate.sleep();
	}
	return 0;
}

在编译文件之前需要修改配置文件(Python在ubuntu里是可以运行的脚本语言,C++是编译语言)

打开配置文件

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

在文件最后加上以下代码用于在 ROS 软件包中创建一个可执行文件(executable)并将其链接到所需的库,构建 ROS 节点。

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

保存退出,重新编译工作空间

cd ~/catkin_ws
catkin_make

成功后结果如图所示,如果编译失败,请根据错误提示打开cpp或者配置文件进行修改,修改后重新编译

在这里插入图片描述

启动仿真程序实现控制

roscore
#打开新终端
rosrun turtlesim turtlesim_node
#打开新终端
cd ~/catkin_ws
source ~/catkin_ws/devel/setup.bash
rosrun learning_topic publisher

执行命令后可以看到小海龟做圆周运动

在这里插入图片描述

五、实验总结

在进行了ROS的安装与小海龟仿真实验后,我对ROS这一机器人操作系统有了更深入的了解和实践,同时也学会了如何在Ubuntu 18.04系统上进行相关操作

ROS的安装过程中,通过查阅资料和官方文档我成功地在Ubuntu 18.04系统上安装了ROS,同时也学到了如何配置软件源以及安装额外的依赖包。

在配置ROS开发环境和进行小海龟仿真实验的过程中,我了解到了ROS的核心概念如workspace(工作空间)、package(软件包)以及节点(node)等。通过创建工作空间并编写简单的ROS程序,我对ROS的工作原理有了更清晰的认识。

六、参考资料

ROS运行程序让小海龟实现圆周运动
Ubuntu18.04安装ROS——实现小海龟仿真
关于ros话题以及消息的理解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值