创建一个新的ROS包
- 创建在 ~/catkin_ws/src 文件夹里
cd ~/catkin_ws/src
- 创建包的语法
catkin_create_pkg <包名><依赖项列表>
catkin_create_pkg atr_pkg rospy roscpp std_msgs
运行一个简单的ROS程序
-
新建cpp文件 chao_node.c 并写入以下代码
#include <ros/ros.h>
ros::init(argc, argv, "chao_node"); //ROS初始化
while(true)
{
printf("Hello World\n");
}
return 0;
-
在 CMakeLists 中找到 Build 模块中的 :
- “定义一个可执行的C++” 根据示例代码 写入
add_executable(chao_node src/chao_node.cpp)
- “链接结点中的外部库” 根据示例代码 写入
target_link_libraries(chao_node ${catkin_LIBRARIES} )
- 来到终端:
- roscore 初始化ros环境
- 输入
rosrun rosrun ssr_pkg chao_node
运行chao这个结点 - 至此便能看到屏幕不断打印出 “Hello World”
Publisher的C++实现
- 在终端创建名为
ssr_pkg
的包 然后在vsode的ssr_pkg/src
中创建chao_node.cpp
文件 -
在 chao_node 文件中写入以下代码
#include <std_msgs::String.h>
//ROS初始化
ros::init(argc, argv, "chao_node");
// 可以看作是一个句柄 是ROS的大BOSS 功能都要从他这拿
ros::NodeHandle nh;
// 消息发布者的初始化 std_msgs::String【定义发送数据的类型】 "Kai_Hei"【Topic名称】 10【缓冲队列】
ros::Publisher pub = nh.advertise<std_msgs::String>("Kai_Hei",10);
//表示将发送的频率控制在10Hz
ros::Rate loot_rate(10);
int main(int argc, char *argv[])
{
while(true)
{
std_msgs::String msg; // 定义字符串msg
msg.data = "I'am Ma Chao"; // msg赋值
pub.publish(msg); // pulisher将msg发布
loot_rate.sleep(); // 实现睡眠10Hz
}
return 0;
}
-
接着使用 Ctrl+Shift+B 将程序编译
-
Ctrl+Alt+T 打开终端
roscore
运行ros环境- Ctrl+Shift+O 分出一个终端页面后 输入
rosrun rosrun ssr_pkg chao_node
运行chao这个结点 - 使用
rostopic list
查看所有正在运行的topic 能看到我们刚刚创建的话题名称 “Kai_Hei” - 使用
rostopic echo /Kai_Hei
来显示这个话题中的会话内容 会看到我们创建的msg内容 “I’am Ma Chao” - 使用
rostopic hz /Kai_Hei
来显示这个话题的会话频率
Subscriber的C++实现
- 创建名为
atr_pkg
的包 - 在 vsode 的
atr_pkg/src
中创建名为 ma_node.cpp
的文件 - 代码模块与Publisher基本相似:
#include <ros/ros.h>
#include <std_msgs/String.h>
void chao_callback(std_msgs::String msg) // 接收到信息后的“中断回调函数”
{
ROS_INFO(msg.data.c_str());
}
void yao_callback(std_msgs::String msg)
{
ROS_WARN(msg.data.c_str());
}
int main(int argc, char *argv[])
{
ros::init(argc, argv, "ma_node");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("Kai_Hei", 10, chao_callback);
ros::Subscriber sub_2 = nh.subscribe("Qiu_Zu_Dui", 10, yao_callback);
while(true)
{
ros::spinOnce(); // 要不断回头“看”还有没有新的消息发送过来 可以类比为重新使能中断
}
return 0;
}
- 新的工具
rqt_graph
可以可视化发布者和接受者之间的关系【前提是要打开所有的发布者和接受者】借助这个工具可以便于分析复杂系统中的接受逻辑关系
使用launch启动多个结点
机器人运动的简单控制
-
核心是作为Publisher发布者 将速度信息发布给 /cmd_vel
话题
- 新建包
vel_pkg
在 src
中新建文件夹 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; // 控制机器人运动方向的数据类型
// linear控制矢量方向上及速度
vel_msg.linear.x = 0.1;
vel_msg.linear.y = 0;
vel_msg.linear.z = 0;
// angular控制旋转方向及速度
vel_msg.angular.x = 0;
vel_msg.angular.y = 0;
vel_msg.angular.z = 0;
while(true)
{
vel_pub.publish(vel_msg);
}
return 0;
}
- 记得在
CMakeLists
定义执行编译
和引入头文件
相关操作 -
打开终端
- 输入
roscore
启动ros - 输入
roslaunch wpr_simulation wpb_simple.launch
启动仿真机器人的demo - 输入
rosrun vel_pkg vel_node
启动我们刚刚编写的控制机器人运行的结点 - 可以观察到画面中的机器人按照我们的指示向x轴缓慢向前移动