一、安装ROS
参考链接:
【ROS】Ubuntu18.04下安装ROS-Melodic的步骤及rosdep update报错的解决方案_Quentin_HIT的博客-CSDN博客_ros国内源
noetic/Installation/Ubuntu - ROS Wiki
机器人操作系统 ROS 快速入门教程_哔哩哔哩_bilibili
二、学习ROS
1、ROS核心概念
1、节点Node 节点管理器ROS Master
2、节点通讯方式——话题通信 服务通信
1)话题通信——异步通信(单向传输 发布/订阅模型)
话题Topic 消息Message
多话题模型
6、可以通过ROS Index 网站 找到Message的数据类型和数据容量
简单理解:
将 消息类型 理解为 结构体类型
将 实际发送的消息包 理解为 使用结构体类型定义的结构体变量
2)服务通信——同步通信(有反馈的双向传输 请求/应答模型 通常request和response各1次)
话题与服务的区别
(有点像串口的USART、UART)
3、参数
(有点像全局静态变量)
4、文件系统
包package
2、ROS命令行工具
格式:rosxxxx
turtle三行:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
rqt_xxx:基于QT的可视化工具
rqt_graph:显示系统计算图
rosnode:显示系统node的可操作命令
rostopic:显示系统当前topic可操作命令
rosservice:显示系统当前service可操作命令
tips:
按一次/两次tab补全
按两次tab列出所有node
rosbag:话题记录+话题复现(记录数据)
1)话题记录
-a:-all
-O:将数据保存成压缩包
cmd_record:压缩包名
2)话题复现
rosbag paly + 压缩包名.bag
3、创建工作空间与功能包
4、发布者Publisher的编程实现
add_executable(文件名 src/文件名.cpp)
target_link_libraries(文件名 ${catkin_LIBRARIES})
三、Code
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char *argv[])
{
//ROS节点初始化
ros::init(argc, argv, "vel_ctrl");
// 创建节点句柄
ros::NodeHandle n;
ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
ROS_INFO("draw_circle start...");//输出显示信息
while(ros::ok())
{
geometry_msgs::Twist vel_cmd;
vel_cmd.linear.x = 2.0;
vel_cmd.linear.y = 0.0;
vel_cmd.linear.z = 0.0;
vel_cmd.angular.x = 0;
vel_cmd.angular.y = 0;
vel_cmd.angular.z = 1.8;
vel_pub.publish(vel_cmd);
ros::spinOnce();
}
return 0;
}
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#define PI 3.14159265358979323846
int main(int argc, char **argv){
ros::init(argc, argv, "draw_rectangle");
std::string topic = "/turtle1/cmd_vel";
ros::NodeHandle n;
ros::Publisher cmdVelPub = n.advertise<geometry_msgs::Twist>(topic, 1);
ros::Rate loopRate(2);
ROS_INFO("draw_retangle start...");
geometry_msgs::Twist speed;
int count = 0;
while (ros::ok()){
speed.linear.x = 1; // 设置线速度为1m/s,正为前进,负为后退
speed.linear.y = 0;
speed.linear.z = 0;
speed.angular.x = 0;
speed.angular.y = 0;
speed.angular.z = 0;
count++;
while(count == 5)
{
count=0;
speed.angular.z = PI; //转90°
}
cmdVelPub.publish(speed);
ros::spinOnce();
loopRate.sleep();
}
return 0;
}