ROS安装与测试

1、Linux系统介绍及安装

操作系统(OS):

  • 管理和控制计算机硬件与软件资源的计算机程序;
  • 直接运行在“裸机”上最基本的系统软件;
  • 任何其他软件都必须在操作系统的支持下才能运行。
image-20210819153836436

Linux是什么?

  • 类Linux系统:Linux是一种自由、开源的类似Unix的操作系统
  • Linux内核:严格来说,Linux这个词本身只表示Linux内核
  • 1991年,芬兰赫尔辛基的大学生Linus Torvalds编写
  • 加入到自由软件基金的GNU计划(GUN is Not Unix)
  • Linux以一只可爱的企鹅作为标志,象征着敢做敢为、热爱生活

Linux发行版包括:

  • Linux内核
  • 将整个软件安装到电脑上的一套安装工具
  • 各种GUN软件其他的一些自由软件
  • 在一些特定的Linux发行版中也有一些专有软件

Ubuntu安装方法

虚拟机安装硬盘安装
安装难易简单复杂
硬件支持一般
运行速度
安全备份简单复杂
适合人群初次接触或偶尔使用者有一定经验的开发者

2、Linux系统基础操作

命令行

cd:改变工作目录

pwd:显示当前工作目录的绝对路径

mkdir:创建一个目录

touchl:创建一个文件

ls:列出当前目录文件

mv:移动文件

cp:复制文件

rm:删除文件

sudo:提升权限

3、ROS是什么

3.1 安装ROS

1、添加ROS软件源:

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'

2、添加密钥:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654

3、安装ROS:

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

4、初始化rosdep

sudo rosdep init
rosdep update

5、设置环境变量

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

6、安装rosinstall

sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential

7、小海龟测试

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

3.2 ROS

ROS = 通信机制 + 开发工具 + 应用功能 + 生态系统

**目标:**提高机器人研发中的软件复用率

ROS中的开发工具

  • 命令行&编译器
  • TF坐标变换
  • QT工具箱
  • Rviz
  • Gazebo

ROS中的应用功能

  • Navigation
  • SLAM
  • Movelt!

ROS中的生态系统

1.发行版

2.软件源

3.ROS wiki

4.邮件列表

5.ROS Answers

6.博客

4、ROS的核心概念

4.1 节点——执行单元

  • 执行具体任务的进程、独立运行的可执行文件;
  • 不同节点可使用不同的编程语言,可分布式运行在不同的主机;
  • 节点在系统中的名称必须是唯一的。

4.2 节点管理器——控制中心

  • 为节点提供命名和注册服务;
  • 跟踪和记录话题/服务通信,辅助节点相互查找、建立链接;
  • 提供参数服务器,节点使用此服务器存储和检索运行时的参数。

4.3 话题——异步通信机制

  • 节点间用来传输数据的重要总线;
  • 使用发布/订阅模式,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一;

4.4 消息——话题数据

  • 具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型;
  • 使用编程语言无关的.msg文件定义,编译过程中生成相应的代码文件。

4.5 服务——同步通信机制

  • 使用客户端/服务器模型,客户端发送请求数据,服务器完成处理后返回应答数据;
  • 使用编程语言无关的.srv文件定义请求和应答数据结构,编译过程中生成对应的代码文件。

4.7 参数——全局共享字典

  • 可通过网络访问的共享、多变量字典;
  • 节点使用此服务器来存储和检索运行时的参数;
  • 适合存储静态、非二进制的配置参数,不适合存储动态配置的数据。

4.8 文件系统

功能包

  • ROS软件中的基本单元,包含节点源码、配置文件、数据定义等

功能包清单

  • 记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等

元功能包

  • 组织多个用于同一目的的功能包

5、ROS命令行工具

常用命令

  • rostopic
  • rosservice
  • rosnode
  • rosparam
  • rosmsg
  • rossrv

6、创建工作空间与功能包

工作空间是一个存放工程开发相关文件的文件夹。

  • src:代码空间
  • build:编译空间
  • devel:开发空间
  • install:安装空间

6.1 创建工作空间

同一个工作空间下,不允许存在同名功能包;

不同工作空间下,允许存在同名功能包。

创建工作空间:

$ mkdir -p ~/catkin_ws/src  //创建src文件,放置功能包源码
$ cd ~/catkin_ws/src        //进入src文件夹
$ catkin_init_workspace    //初始化文件夹

编译工作空间:

$ cd ~/catkin_ws/
$ catkin_make

设置环境变量:

$ source devel/setup.bash

检查环境变量:

$  echo $ROS_PACKAGE_PATH

6.2 创建功能包

创建功能包

cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp

编译功能包

 cd catkin_ws
 catkin_make
 source devel/setup.bash

7、发布者Publisher的编程实现

img

7.1创建功能包

cd ~/catkin_ws_me/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim  #learning_topic功能包的名称,后面就是依赖

7.2实现发布者的流程

1.初始化ROS节点

2.向ROS Master注册节点信息,包括话题名和话题中的消息类型

3.创建消息数据

4.按照一定循环频率发布消息

(1)编写一个C++话题发布者

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char **argv)
{
	// 用ros::init完成ROS节点初始化,(argc, argv是两个参数,默认就可以了,不需要配置)velocity_publisher为节点名,注意节点名称是不可以重复的
	ros::init(argc, argv, "velocity_publisher");

	// 创建节点句柄,管理ros的API接口
	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
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;

	    // 发布消息。利用publish方法发布vel_msg数据内容
		turtle_vel_pub.publish(vel_msg);
	    //类似print使得相关信息显示
		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;
}

(2)编写一个Python话题发布者

import rospy
from geometry_msgs.msg import Twist
 
def velocity_publisher():
	# ROS节点初始化
    rospy.init_node('velocity_publisher', anonymous=True)
 
	# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
 
	#设置循环的频率
    rate = rospy.Rate(10) 
 
    while not rospy.is_shutdown():
		# 初始化geometry_msgs::Twist类型的消息
        vel_msg = Twist()
        vel_msg.linear.x = 0.5
        vel_msg.angular.z = 0.2
 
		# 发布消息
        turtle_vel_pub.publish(vel_msg)
    	rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z)
 
		# 按照循环频率延时
        rate.sleep()
 
if __name__ == '__main__':
    try:
        velocity_publisher()
    except rospy.ROSInterruptException:
        pass

7.3配置发布者代码编译规则

编辑CMakelists.txt文件,目的是为了:

  • 设置需要编译的代码和生成的可执行文件;
  • 设置连接库

将下面这两句话放到这个位置

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

回到工作空间的根目录下来做编译

cd ~/catkin_ws_me
catkin_make
source devel/setup.bash	#添加换进变量。
roscore #第一个终端运行
rosrun turtlesim turtlesim_node	#第二个终端运行
rosrun learning_topic velocity_publisher	#第三个终端运行

8、订阅者Subscriber的编程实现

实现一个订阅者

  • 初始化ROS节点;
  • 订阅需要的话题;
  • 循环等待话题消息,接收到消息后进入回调函数;
  • 在回调函数中完成消息处理。

8.1 创建功能包

cd ~/catkin_ws_me/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim  #learning_topic功能包的名称,后面就是依赖

然后在创建的learning_topic文件下的src文件下创建一个pose_subscriber.cpp文件

8.2 在.cpp文件中输入以下内容

/**
 * 该历程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
 */

#include <ros/ros.h>
#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,订阅名为/turtle/pose的topic,注册回调函数poseCallback
	ros::Subscriber pose_sub=n.subscribe("/turtle1/pose",10,poseCallback);

	// 循环等待回调函数
	ros::spin();

	return 0;
}

8.3 配置CmakeLists.txt中的编译规则

打开src/learning_topic下的CMakeList.txt文件

在该文件中加入如下俩句:

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

8.4 编译并运行发布者

cd /catkin_ws
catkin_make

8.5 验证

roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber

9、话题消息的定义

9.1 话题消息的定义流程

1、定义话题消息

//person 属性
string name
uint8 sex
uint8 age
//宏定义
uint8 unknown   =0
uint8 male		=1
uint8 female	=2

2、在文件package.xml添加功能包的依赖

包含两个依赖:编译和执行依赖

<build_depend>message_generation</build_depend>  //依赖于message_generation功能包
<exec_depend>message_runtime</exec_depend>     //运行时的依赖message_runtime

3、CmakeList.txt中添加编译选项

find_package( …… message_generation) //增加message_generation依赖

//将msg文件编译成不同成语文件的配置项
add_message_files(FILES Person.msg)  //增加建立的person.msg 文件的消息接口,用来发现person文件
generate_messages(DEPENDENCIES std_msgs)// 编译person.msg 文件时需要依赖std_msgs 包(如uint8 便是定义在std_msg 中)

catkin_package(…… message_runtime)// 增加运行依赖message_runtime

4、编译生成语言相关的文件

10、客户端Client的编程实现

创建一个客户端

  • 初始化ROS节点;
  • 创建一个Client实例;
  • 发布服务请求数据;
  • 、等待Server处理之后的应答结果。

1、创建功能包

cd ~/catkin_ws/src
catkin_create_pkg learning_service roscpp rospy stdmsgs geometry_msgs turtlesim

2、创建客户端代码

2.1 打开turtle_spawn.cpp文件

gedit ~/catkin_ws/src/learning_service/src/turtle_spawn.cpp

2.2 复制下列代码,保存退出

#include <ros/ros.h>
#include <turtlesim/Spawn.h>

int main(int argc, char** argv)
{
    // 初始化ROS节点
	ros::init(argc, argv, "turtle_spawn");

    // 创建节点句柄
	ros::NodeHandle node;

    // 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");

    // 初始化turtlesim::Spawn的请求数据
	turtlesim::Spawn srv;
	srv.request.x = 2.0;
	srv.request.y = 2.0;
	srv.request.name = "turtle2";

    // 请求服务调用
	ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]", 
			 srv.request.x, srv.request.y, srv.request.name.c_str());

	add_turtle.call(srv);

	// 显示服务调用结果
	ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());

	return 0;
};

3、配置客户端代码编译规制

3.1 打开CMakeList.txr文件

gedit ~/catkin_ws/src/learning_service/CMakeLists.txt

3.2 加入下面代码

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

4、编译功能包

cd ~/catkin_ws/
catkin_make

5、运行程序

roscore
rosrun turtlesim turtlesim_node 
rosrun learning_service turtle_spawn.py

11、服务端Server的编程实现

实现一个服务器

  • 初始化ROS节点;
  • 创建Server实例;
  • 循环等待服务请求,进入回调函数;
  • 在回调函数中完成服务功能的处理,并反馈应答数据。

1、创建功能包

cd ~/catkin_ws/src
catkin_create_pkg learning_service roscpp rospy stdmsgs geometry_msgs turtlesim

2、打开turtle_spawn.cpp文件,复制下列代码,保存退出

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
#include<std_srvs/Trigger.h>
 
ros::Publisher turtle_vel_pub;
bool pubCommand=false;
 
// service回调函数,输入参数req,输出参数res
bool commandCallback(std_srvs::Trigger::Request &req,std_srvs::Trigger::Response &res)
{
    pubCommand=!pubCommand;
 
    //显示请求数据
    ROS_INFO("Publish turtle velocity command [%s]",pubCommand==true?"Yes":"No");
 
    //设置反馈数据
    res.success=true;
    res.message="Change turtle command state!";
    return true;
}
 
int main(int argc,char **argv)
{
    //初始化ROS节点
    ros::init(argc,argv,"turtle_command_server");
 
    //创建节点句柄
    ros::NodeHandle n;
 
    //创建一个名为 /turtle_command的server,注册回调函数commandCallback
    ros::ServiceServer command_service=n.advertiseService("/turtle_command",commandCallback);
 
    //创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    turtle_vel_pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);
 
    //循环等待回调函数
    ROS_INFO("Ready to receive turtle command.");
 
    //设置循环的频率
    ros::Rate loop_rate(10);
 
    while(ros::ok())
    {
        //查看一次回调函数队列
        ros::spinOnce();
 
        //如果标志为true,则发布速度指令
        if(pubCommand)
        {
            geometry_msgs::Twist vel_msg;
            vel_msg.linear.x=0.5;
            vel_msg.angular.z=0.2;
            turtle_vel_pub.publish(vel_msg);
        }
 
        //按照循环频率延时
        loop_rate.sleep();
    }
    return 0;
}

3、配置服务器代码编译规则

  • 设置需要编译的代码和生成的可执行文件
  • 设置链接库
add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})
 
add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})

4、编译并运行服务器

cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_command_server
rosservice call/turtle_command"{}"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值