【Autolabor初级教程】ROS机器人入门 通信机制实操 笔记
实操01_话题发布
**需求描述:**编码实现乌龟运动控制,让小乌龟做圆周运动。
结果演示:
实现分析:
- 乌龟运动控制实现有两个关键节点,
turtlesim_node
(乌龟运动显示),turtle_teleop_key
(运动键盘控制),二者基于订阅发布模式实现通信 - 要想自己实现乌龟运动控制,要先获取两节点之间通信的话题和消息(计算图结合ros命令)
- 编写运动控制节点,通过指定的话题,按照一定的逻辑发布消息
实现
A.获取节点间通信消息和话题
获取通信话题:
-
通过计算图
rqt_graph
-
通过
rostopic list
指令
获取话题消息:
-
根据话题获取所使用的消息类型
rostopic info
或rostopic type
-
获取消息格式
rosmsg show
或rosmsg info
Ps:这里可以使用rostopic pub
进行通信,完成任务
B.编写代码实现发布节点
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char *argv[])
{
/* code */
ros::init(argc,argv,"circle");
ros::NodeHandle np;
ros::Publisher pub = np.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1000);
geometry_msgs::Twist msg;
msg.linear.x = 1;
msg.linear.y = 0;
msg.linear.z = 0;
msg.angular.x = 0;
msg.angular.y = 0;
msg.angular.z = 1;
ros::Rate rate(10);
while(ros::ok())
{
pub.publish(msg);
ros::spinOnce();
rate.sleep();
}
return 0;
}
运行结果:
实操02_话题订阅
需求描述: 已知turtlesim中的乌龟显示节点,会发布当前乌龟的位姿(窗体中乌龟的坐标以及朝向),要求控制乌龟运动,并时时打印当前乌龟的位姿。
结果演示:
实现
A.获取节点间通信消息和话题
B.编写代码实现订阅节点
#include "ros/ros.h"
#include "turtlesim/Pose.h"
void msg_handle(const turtlesim::Pose::ConstPtr &msg)
{
ROS_INFO("x:%.6f",msg->x);
ROS_INFO("y:%.6f",msg->y);
ROS_INFO("theta:%.6f",msg->theta);
ROS_INFO("linear_velocity:%.6f",msg->linear_velocity);
ROS_INFO("angular_velocity:%.6f",msg->angular_velocity);
}
int main(int argc, char *argv[])
{
/* code */
setlocale(LC_ALL,"");
ros::init(argc,argv,"echo");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe<turtlesim::Pose>("/turtle1/pose",1000,msg_handle);
ros::spin();
return 0;
}
运行结果:
实操03_服务调用
**需求描述:**编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。
结果演示:
实现
A.获取节点间服务与服务消息信息
B.编写代码实现客户端请求
#include "ros/ros.h"
#include "turtlesim/Spawn.h"
int main(int argc, char *argv[])
{
/* code */
setlocale(LC_ALL,"");
ros::init(argc,argv,"spawn");
ros::NodeHandle np;
ros::ServiceClient client = np.serviceClient<turtlesim::Spawn>("spawn");
turtlesim::Spawn spawn;
spawn.request.name = "haha";
spawn.request.theta = 1.57;
spawn.request.x = 7;
spawn.request.y = 7;
client.waitForExistence();
bool flag = client.call(spawn);
if(flag)
{
ROS_INFO("%s创建成功!",spawn.response.name.c_str());
}else{
ROS_INFO("创建失败!");
}
return 0;
}
运行结果:
实操04_参数设置
需求描述: 修改turtlesim乌龟显示节点窗体的背景色,已知背景色是通过参数服务器的方式以 rgb 方式设置的。
结果演示:
实现
A.参数名获取
Ps:需要设置相应参数后重新打开turtlesim_node
才能刷新颜色
B.编写代码实现参数修改
#include "ros/ros.h"
int main(int argc, char *argv[])
{
ros::init(argc,argv,"color");
ros::NodeHandle nh;
nh.setParam("/turtlesim/background_b",0);
nh.setParam("/turtlesim/background_g",0);
nh.setParam("/turtlesim/background_r",255);
return 0;
}
运行结果:
Note:
刚开始运行的launch文件如下:
<launch>
<node pkg="demo_color" type="color" name="color" output="screen"/>
<node pkg="turtlesim" type="turtlesim_node" name="sim" output="screen"/>
</launch>
运行结果背景色始终为蓝色,经过查询后得知(GPT)
在ROS中,launch 文件中定义的节点通常是并行启动的,而不是顺序执行的。
但是没有找到合适的修改launch文件的方法,暂时的解决方案是在终端分别执行命令roscore
,rosrun demo_color color
,rosrun turtlesim turtlesim_node