基础知识必备
我们先了解ROS的机制,发布者(pub) ──发消息──▶ 话题 /yolo_msg ──收消息──▶ 订阅者(sub),还需要清楚目录的结构
catkin_ws/
└── src/
└── drone_planner/ # 任意命名
├── package.xml
├── CMakeLists.txt
├── msg/
│ └── drone_planner_msg.msg # 自定义消息定义 (需要自己来写)
└── src/
├── pub_msg.cpp # 发布者
└── sub_msg.cpp # 订阅者(新增)
注意roscore,才能启动rosrun,但是roslaunch 本身包含了roscore了,所以这里不需要再roscore了
清楚这个就好办了,那么我们先写一个发布者,如下操作:
发布话题
第一步:先写个程序,新建src下,命名为pub_msg.cpp,把下面程序复制过来。
#include <ros/ros.h>
#include <drone_planner/drone_msg.h>
int main(int argc, char **argv)
{
//ROS节点初始化,节点名pub_cmd_vel
ros::init(argc,argv,"drone_pub");
//创建节点句柄,管理ROS API资源、调用
ros::NodeHandle n;
//创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长10
ros::Publisher drone = n.advertise<drone_planner::drone_msg>("/drone_pub",10);
//设置循环频率,不断publish
ros::Rate loop_rate(10);
while (ros::ok())
{
//初始化geometry_msgs::Twist类型消息
drone_planner::drone_msg abc;
abc.name = "name";
abc.x = 2;
abc.y = 3;
//发布消息
drone.publish(abc);
//ROS_INFO("Publish turtle velocity command%.2f m/s, %.2f rad/s", vel_msg.linear.x, vel_msg.angular.z);
//按照循环频率延时
loop_rate.sleep();
}
return 0;
}
**第二步:**在drone_planner文件夹下有个msg文件夹,创建一个名字叫drone_msg.msg文件(这里任意命名),在这个msg文件中复制如下内容
这是自定义消息的定义文件,每行定义一个字段
string name # 字符串类型的名字
int32 x # 整数 x 坐标
int32 y # 整数 y 坐标
第三步:去找drone_planner文件夹下的Cmake.list这个文件进行修改
为什么这个文件也要进行修改呢?
答:普通包只用 ROS 自带的消息(如 std_msgs),但你的包里有自己的 drone_msg.msg。编译时要先把这个 .msg 变成 C++ 头文件 ,这个步骤必须手动写进 CMakeLists,否则程序里 #include <drone_planner/drone_msg.h> 会找不到文件。
操作:181行,处enter,腾出空间,复制下面这个
add_executable(可执行名 src/源文件名.cpp)
target_link_libraries(可执行名 ${catkin_LIBRARIES})
可执行名换做,CPP的文件名字
以及在75行处回车添加下面内容,添加的是msg的
add_message_files(
FILES
drone_msg.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
第四步:跟我这个图片一致就行 
结果来啦,终端进入catkin_ws下,catkin_make下,先是编译,因为自己定义的消息类型需要source devel/setup.bash下,接着开启新终端
如图片
另一个终端

再开一个终端,看下我们发布的话题有哪些
终端
这时候显示了,我们成功发布话题了。
定点飞行程序
定点飞行的核心程序如下:

最终效果如下:飞到指定的点

以上不懂可私信我,培训相应无人机仿真视频