参考链接: 古月·ROS入门21讲 | 一学就会的ROS机器人入门教程.
参考链接:Linux入门基础命令.
Ctrl+Alt+t : 打开终端
Ctrl+d :关闭终端
(指令 --help) : 显示指令的说明
pwd : 显示当前工作目录
cd(+目录): 进入目录
cd .. : 进入上一级目录
cd - : 显示上一次访问的目录
clear : 清除屏幕
ls : 显示目录下内容
mkdir aaa : 在当前目录下创建aaa目录,相对路径;
mkdir ./bbb : 在当前目录下创建bbb目录,相对路径;
mkdir /ccc : 在根目录下创建ccc目录,绝对路径;
touch : 创建文件
rm -r : 删除目录或文件
sudo apt-get update
参考文章链接:ubuntu与windows互传文件的3种方法
mv 原先目录 文件的名称 mv tomcat001 tomcat
mv /aaa /bbb : 将根目录下的aaa目录,移动到bbb目录下(假如没有bbb目录,则重命名为bbb);
mv bbbb usr/bbb : 将当前目录下的bbbb目录,移动到usr目录下,并且修改名称为bbb;
mv bbb usr/aaa : 将当前目录下的bbbb目录,移动到usr目录下,并且修改名称为aaa;
(下载前设置软件源:清华或者阿里云)
编译器安装
sudo apt-get install g++
sudo apt-get install python
学习网站: 菜鸟教程.
学习链接: l小甲鱼C++快速入门.
参考链接:vim编辑器编写c代码步骤.
ROS(Robot Operating System,下文简称“ROS”)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。
简要解释ROS:
通道:ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。
工具:ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统。
强大的库:ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。
生态系统:ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。
ROS 的主要目标是为机器人研究和开发提供代码复用的支持。ROS是一个分布式的进程(也就是“节点”)框架,这些进程被封装在易于被分享和发布的程序包和功能包中。ROS也支持一种类似于代码储存库的联合系统,这个系统也可以实现工程的协作及发布。这个设计可以使一个工程的开发和实现从文件系统到用户接口完全独立决策(不受ROS限制)。同时,所有的工程都可以被ROS的基础工具整合在一起。
ROS的首要目标是提供一套统一的开源程序框架,用以在多样化的现实世界与仿真环境中实现对机器人的控制。
ROS的核心是节点(node)。节点是一小段用Python或C++写成的程序,用来执行某个相对简单的任务或进程。多个节点之间互相传递信息(message),并可以独立控制启动或终止。某一节点可以面向其它节点针对特定标题(topic)发布信息或提供服务(service)。
例如:现有以节点将传感器读数传递至机器人控制器,在“/head_sonar标题“下存在一条信息包含有变量值“0.5“,即意味着传感器检测到的当前物体距离为0.5米。任何一个想要知道该传感器读数的节点都只要订阅(subscribe)/head_sonar标题即可。为了便于使用该读数,针对该订阅者的节点会定义一个回调函数,每当有新的信息传递到订阅者标题时,即执行该函数。上述流程的运行频率取决于发布者节点(publisher node)更新信息的频率。
此外,节点还可以用来定义一个或多个服务(service)。ROS中服务的作用是在接收到来自其它节点的请求时回复该节点或执行某项任务。例如:控制LED灯的开关是一个服务;移动机器人在给定起始和目标位置的条件下返回导航路线规划也是一个服务。
1.执行具体任务的进程,独立运行的可执行文件
2.不同节点可使用不同的编程语言,可分布式运行在不同主机
3.节点在系统中的名称必须唯一
:为节点提供命名和注册服务
:跟踪和记录话题就/通信服务,辅助节点相互查找,建立连接
:提供参数服务器,节点使用服务器存储和检索运行时的参数
:节点间用来传输数据的重要总线
:使用发布/订阅模型,数据有发布者传输到订阅者,同一个话题的订阅者可以不唯一;
:具有一定的类型和数据结构,包括ROS提供的标准用户自定义类型
:使用编程语言无关的.msg文件定义,编译过程生成对应的代码文件
:使用客户端/服务器(C/S)模型,客户端发送请求数据,服务端完成处理后返回应答数据;
:使用编程语言无关的.src文件定义请求和应答数据结构,编译过程中生成对应的代码文件
:可通过网络访问的共享,多变量字典
:节点使用此服务器来存储和检索运行时的参数
:适合存储静态,非二进制的配置参数,不适合存储动态配置的数据
参考文章:ROS是什么
参考文章: ROS的系统架构.
//2022.4.6
先后打开终端分别输入命令(打开Ctrl+Alt+t)
注意,每输入一个命令都需要重新打开一个终端。
因为这里的每一条命令都会对终端占用。
1启动ROS Master
roscore
2 启动小乌龟仿真器
rosrun turtlesim turtlesim_node
3 启动小乌龟控制节点
rosrun turtlesim turtle_teleop_key
这个终端窗口必须置顶才能键盘控制
rqt_graph//打开节点图可以更直观地看到这两个节点间传递消息的主题(基于QT的可视化工具)
turtlesim是一个功能包;先打开turtlesim_node节点(小乌龟);再打开turtle_teleop_key节点(键盘控制)
ps:
/teleop_tutle:键盘控制节点
/turtlesim:仿真器节点
/turtle/cmd_vel:一个话题
键盘控制节点将输入的指令打包成话题传给仿真器节点
roscore指令是在运行ROS操作系统首先运行的指令;
rosrun指令(启动新节点)是运行ROS某个功能包的某个节点的指令,后面加的参数是功能包名和节点名;
(1)rqt_graph
rqt_graph
显示当前正在运行的节点关系图
(2)rqt_plot
rqt_plot
list和info比较常用
rosnode list:获取正在运行的节点
ps:/rosout:这个节点始终是有的,随着roscore的运行而运行;
rosnode info node1:查看节点“node1”的具体信息
rostopic list
rostopic echo
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
rqt_graph
rosnode list
/rosout:这个节点始终是有的,随着roscore的运行而运行;
rosrun info /turtlesim
Publications: (发布的话题)
* /rosout [rosgraph_msgs/Log]
* /turtle1/color_sensor [turtlesim/Color]
* /turtle1/pose [turtlesim/Pose]
Subscriptions: (订阅的话题)
* /turtle1/cmd_vel [geometry_msgs/Twist]
Services: (提供的服务)
* /clear
* /kill
* /reset
* /spawn
* /turtle1/set_pen
* /turtle1/teleport_absolute
* /turtle1/teleport_relative
* /turtlesim/get_loggers
* /turtlesim/set_logger_level
rostopic list
//列出当前话题
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
//Tab键补全
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist(消息结构) "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
(linear线速度angular角速度)
rostopic pub -r 10 加频率实现循环
rosmsg show geometry_msgs/Twist查看消息结构
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
rosservice list服务列表
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn产生
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
rosservice call 服务名
//请求服务
召唤第二只小海龟
rosservice call /spawn "x: 2.0
y: 2.0
theta: 2.0
name: 'turtle2'"
name: "turtle2"
保存数据
== -a是全部保存 -大o是以压缩包形式保存==
== Enter后要加Ctrl+C==
rosbag record -a -O 压缩包名
播放数据
rosbag play 压缩包名
一共要创建4个文件夹(主工作空间下)
src:代码空间
build:编译空间
devel:开发空间
install:安装空间
1.mkdir 一个工作空间workspace1(自定义文件名)
2.cd workspace并mkdir src(放工程包和源码,只能叫src)
3.catkin_init_workspace(指令)初始化
4.cd到workspace1,输入catkin_make(指令),会创建出bulid和devel文件夹
5.输入catkin_make install,会创建出install文件夹
简而言之
1.mkdir 自定义文件夹(现在的根目录)
2.根目录下分别输入catkin_make和catkin_make install命令创建bulid,devel和install文件夹
3.根目录下mkdir src文件夹,用catkin_init_workspace命令初始化src文件夹
#include "ros/ros.h"
#include "std_msgs/String.h"
#include
int main(int argc, char *argv[])
{
/* code */
ros::init(argc,argv,"erGouZi");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);
std_msgs::String msg;
ros::Rate rate(10);
int count = 0;
while(ros::ok())
{
count++;
//msg.data = "hello";
std::stringstream ss;
ss << "hello" << count;
msg.data = ss.str();
pub.publish(msg);
ROS_INFO("%s",ss.str().c_str());
rate.sleep();
}
return 0;
}
#include "ros/ros.h"
#include "std_msgs/String.h"
//using namespace ros;
void doMsg(const std_msgs::String:: ConstPtr &msg){
ROS_INFO("cuihua dingyue de shuju:%s",msg->data.c_str());
}
int main(int argc, char *argv[])
{
/* code */
ros::init(argc,argv,"cuiHua");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("fang",10,doMsg);
ros::spin();
return 0;
}