一、ROS核心概念
Master(主节点):
Node(节点):
编程中需要节点初始化、创建句柄操作,即:
// ROS节点初始化
ros::init(argc, argv, "节点名称");
// 创建节点句柄
ros::NodeHandle n;
Topic(话题):
Publisher(发布)、Subscriber(订阅)
1、Publisher:注册节点信息、创建消息数据、发布消息
a、注册节点消息
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
b、创建消息数据
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
c、发布消息
// 发布消息
turtle_vel_pub.publish(vel_msg);
2、Subscriber:订阅需要的话题、循环等待话题消息、回调函数中消息处理
a、订阅话题
// 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
b、循环等待话题消息
// 循环等待回调函数
ros::spin();
c、回调函数中消息处理
注意:回调函数形参格式??,例如:
// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}
注:《ROS入门21讲》利用小海龟创建发布/订阅,共创建三个节点(rosout除外):turtlesim、velocity_publisher、pose_subscriber;共创建话题2个(/rosout、/rosout_agg、/turtle1/color_sensor):/turtle1/cmd_vel、/turtle1/pose;
使用2个消息类型:geometry_msgs::Twist、turtlesim::Pose
$ 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
$ rosmsg show turtlesim/Pose
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity
Message(消息):
定义话题消息:1、定义msg文件,文件内容为消息中数据类型及数据项,其中的宏定义与与C语言中不同,类似于C语言带初始化的变量声明。
2、添加功能包依赖(通知编译器需要生成新的消息头)
必须编译package.xml文件,才利用“$gedit package.xml”打开进行编辑
<build_depend>message_generation</build_depend>//编译依赖
<exec_depend>message_runtime</exec_depend>//执行依赖
3、在CMakeList.txt 添加编译选项
找到find_package,增加find_package( …… message_generation)
add_message_files(FILES Person.msg) //添加msg文件
generate_messages(DEPENDENCIES std_msgs)
catkin_package(…… message_runtime)
注意:package.xml 与 CMakeList.txt 中添加项要对应。
通过catkin_make 编译后会在根目录./devel/include/learning_topic 中生成Person.h头文件
4、怎样调用
在根目录下 ./devel/include中 拥有新创建的消息头文件,程序开头include一下即可。
Service(服务):cl
Ubuntu16.04 系统下,安装ros-kinetic-desktop-full!
二、创建工作空间与功能包
疑问:刚开始在/usr/local/catkin_ws 下创建工作空间不成功(即catkin_init_workspace),后来查资料发现都是在~/catkin_ws下创建工作空间的。
1、创建工作空间
一定要在工作空间根目录下/src/执行:catkin_init_workspace
在./src/下生成 CMakeLists.txt 文件
2、编译工作空间
一定要在工作空间根目录下执行:catkin_make
在工作空间根目录下生成:build、devel两文件夹
3、设置环境变量
每次编译完成后都要设置一次环境变量,即source ./devel/setup.bash(相对路径,工作空间根目录下)
也可以在~/.bashrc中增加source devel/setup.bash,注意这里需用绝对路径。(如果再~/下隐藏了.bashrc 文件,可使用“Ctrl+H”显示隐藏文件)
4、创建功能包
功能包可以使功能模块化,便于代码重复利用。功能包一般在~/catkin_ws/src/下创建,
即:catkin_create_pkg <package_name> <depend1> <depend2> <depend3>
例如:
$catkin_create_pkg test_pkg std_msg rospy roscpp
说明:a、test_pkg功能包名,std_msg标准消息接口、rospy--Python接口、roscpp---C++接口;b、创建成功后生成四个文件
三、CMakeList语法
一般只修改功能包中的CMakeList.txt文件