目录
【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入门学习笔记|话题发布与订阅_舟同学的博客的博客-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