ROS机器人编程系列(一)通信机制

一、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文件

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值