本文作为我学习ROS的笔记,大多教程来自B站UP——机器人工匠阿杰讲解很通透,适合我这种新手入门
这里写目录标题
ros1小海龟仿真器
1、打开仿真器并用键盘控制
2、用话题查看器查看两个node之间的消息传递
rosrun rqt_graph rqt_graph
teleop_turtle与turtlesim两个节点之间通过/turtle1/cmd_vel进行通信,也就是话题,按键信息会发布在这个话题上,然后turtlesim_node从这个话题接受信息控制其移动,所以需要写一个文件发送控制指令。
3、发布节点使小乌龟圆周运动
# Twist后的指令通过‘Tab’键补全
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0"
工作空间创建
ROS学习–第3篇:ROS基础—创建工作空间
节点的创建
cd
#include <ros/ros.h>
int main(int argc, char*argv[])
{
/* code */
ros::init(argc, argv, "chao_node");
printf("我的枪去而复返\n");
while(ros::ok())
{
printf("别投\n");
}
return 0;
}
CmakeLists.txt中最下面添加
add_executable(chao_node src/chao_node.cpp)
target_link_libraries(chao_node
${catkin_LIBRARIES}
)
编译
在这里插入代码片
TOPIC 话题与Message消息
#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc, char*argv[])
{
/* code */
ros::init(argc, argv, "chao_node");
printf("我的枪去而复返\n");
ros::NodeHandle nh;
// < 消息类型 >(“话题名称”,缓冲区消息数量)
ros::Publisher pub = nh.advertise<std_msgs::String>("kuai_shang_che_kai_hei",10);
ros::Rate loop_rate(10);
while(ros::ok())
{
printf("我要开始刷屏了!\n");
std_msgs::String msg;
msg.data = "国服马超代飞";
pub.publish(msg);
loop_rate.sleep();
}
return 0;
}
rostopic echo /kuai_shang_che_kai_hei
下面data显示是由于中文的问题,换成英文没有问题
查看消息发布频率
rostopic hz /kuai_shang_che_kai_hei
创建订阅者节点
ma_node.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>
void chao_callback(std_msgs::String msg)
{
printf(msg.data.c_str()); // .c_str 转换成string型
printf("\n");
}
void yao_callback(std_msgs::String msg)
{
printf(msg.data.c_str()); // .c_str 转换成string型
printf("\n");
}
int main(int argc, char *argv[])
{
ros::init(argc, argv, "ma_node");
ros::NodeHandle nh;
//最后一个是回调函数
ros::Subscriber sub = nh.subscribe("kuai_shang_che_kai_hei",10,chao_callback);
ros::Subscriber sub_2 = nh.subscribe("ge_ge_dai_wo",10,yao_callback);
while (ros::ok())
{
ros::spinOnce(); //查看有无新消息包收到
}
return 0;
}
在终端分别开启三个节点
rosrun ssr_pkg chao_node
#发布者yao_node
rosrun ssr_pkg yao_node
# 订阅者ma_node
rosrun atr_pkg ma_node
使用如下指令查看话题和消息的通讯关系
rqt_graph
Launch文件编写
launch文件是只要有一个节点,就会启动roscore,所以不用单独写roscore
编写如下launch启动文件
<launch>
<node pkg = "ssr_pkg" type = "yao_node" name = "yao_node" />
<node pkg = "ssr_pkg" type = "chao_node" name = "chao_node" />
<node pkg = "atr_pkg" type = "ma_node" name = "ma_node" output = "screen"/>
</launch>
在终端用如下指令运行
roslaunch atr_pkg kai_hei.launch
机器人运动控制的C++实现(发布速度)
vel_node.cpp
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char *argv[])
{
ros::init(argc ,argv , "vel_node");
ros::NodeHandle n;
ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",10);
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.1;
vel_msg.linear.y = 0;
vel_msg.linear.z = 0;
vel_msg.angular.x = 0;
vel_msg.angular.y = 0;
vel_msg.angular.z = 0;
ros::Rate r(30);
while (ros::ok())
{
vel_pub.publish(vel_msg);
r.sleep();
}
return 0;
}
# 打开仿真环境
roslaunch wpr_simulation wpb_simple.launch
# 速度发布
rosrun vel_pkg vel_node
hector-mapping初体验(slam建图)
# 安装(若安装过wpr_simulation依赖项,则无需安装)
sudo apt install ros-melodic-hector-mapping
# 运行建图
roslaunch hector_mapping hector_mapping
#在rviz中订阅map
rviz
在rviz中分别订阅三个话题
# 运行小车控制器
rosrun rqt_robot_steering rqt_robot_steering