一、ROS的核心概念
节点:
节点管理器:
话题:
消息:
服务:
参数:
二、 命令行工具的使用
命令行工具都是以ros开头的。
常用命令
- rostopic
- rosservice
- rosnode
- rosparam
- rosmsg
- rossrv
2.1 rostopic
2.2 rosservice
2.3 rosnode
2.4 rosrun
rosrun 包名 C++节点
三、创建工作空间与功能包
所有的ROS程序,包括我们自己开发的程序,都被组织成功能包,而ROS的功能包被存放在称之为工作空间的目录下。因此,在我们写程序之前,第一步是创建一个工作空间以容纳我们的功能包。
1. 创建工作空间
mkdir -p catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
2. 编译工作空间
cd ~/catkin_ws
catkin_make
3. 设置环境变量
source devel/setup.bash
4. 检查环境变量
echo $ROS_PACKAGE_PATH
5.创建功能包
cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp
注:功能包要放在src文件夹下,同一个工作空间不能有同名的功能包
创建功能包后,在功能包test_pkg文件夹下有src、include文件夹和package.xml、CMakeLists.txt文件
(1)src文件夹:放置代码文件
(2)include文件夹:放置头文件
(3)package.xml:与功能包相关的信息(如名字、版本号、许可证、作者信息、功能包的依赖信息等)
(4)CMakeLists.txt:描述功能包的编译规则
6.编译功能包
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
四、发布者的实现
主要步骤:
1.初始化ROS节点,并创建节点句柄;
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄
ros::NodeHandle n;
2.向ROS Master 注册节点信息,包括发布的话题名和话题中的消息类型;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
3.创建消息数据;
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
4.按照一定的频率循环发布消息
// 设置循环的频率
ros::Rate loop_rate(10);
// 发布消息
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();
整体如下:
//来自古月居21讲,自学做笔记用
/* 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
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;
}
如何配置CMakeList.txt中的编译规则
1.设置需要编译的代码合生成可执行文件;
设置链接库;
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
add_executable(targetName source1 [source2 ...])
这将创建一个可执行文件,它可以在CMake项目中被称为 targetName
。该名称可能包含字母、数字、下划线和连字符。构建项目时,将在构建目录中创建一个具有平台相关名称的可执行文件,默认名称基于目标名称。思考以下简单的命令示例:
source1 [source2 ...]:CPP文件
target_link_libraries(add_ex的可执行文件名 ${catkin_LIBRARIES})
添加头文件搜索路径: 在include_directories()添加所需要的头文件目录, 相当于编译过程中的 -I命令。
添加库文件搜索路径: 在link_directories()里添加所需要的库的目录,相当于编译过程中的 -L命令。
添加对库的链接:在target_link_libraries()里面添加需要添加的库的名称,相当于编译过程中的-l命令。
编译
$ cd ~/catkin_ws
$ catkin_make
$ roscore
运行
C++节点指的是可执行文件名,而不是cpp
cd 工作空间
source ./devel/setup.bash
rosrun 包名 C++节点
source ~/工作空间/devel/setup.bash
可以添加进.bashrc
文件,使用上更方便
添加方式1: 直接使用 gedit 或 vi 编辑 .bashrc 文件,最后添加该内容
添加方式2:echo "source ~/工作空间/devel/setup.bash" >> ~/.bashrc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)