在 catkin_ws 工作空间下的 src 文件夹内创建 test_pkg_xxx 功能包
cd ~/catkin_ws/src
catkin_create_pkg test_pkg_xxx std_msgs roscpp rospy
可以看到在包内生成了 CMakeLists.txt 和 package.xml 文件。
在终端输入以下命令,进行编译:
cd ~/catkin_ws
catkin_make
source devel/setup.bash
这里如果出现了报错,那就看看报错的地方问题出在哪。如果找不到,那就把之前创造的文件全部删除,然后重新进行这个步骤。
该 Publisher 发布一个 turte1/cmd_vel 话题,里面包含 geometry_msgs::Twist 数据结构这样的一个消息,以完成控制海龟的线速度、角速度,实现特定运动。具体实现步骤如下:
创建功能包,并添加一些依赖库:
cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
进入功能包中的 src 文件夹,创建一个 velocity_publisher.cpp 的文件
cd进入刚刚创建的learning_topic文件夹下的src文件夹,生成cpp文件,命名成velocity_publisher.cpp
cd learning_topic/src/
touch velocity_publisher.cpp
输入以下 C++代码:
/**
* 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
*/
#include
#include
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 设置循环的频率
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
// 发布消息
turtle_vel_pub.publish(vel_msg);
ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
编译前需要先在~/catkin_ws/src/learning_topic/ 下的CMakeLists.txt文件添加两条语句。
配置 CMakeLists.txt 中的编译规则:
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
粘贴位置在## Install ##正上
接下来在终端依次输入以下命令,编译发布者cpp程序
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
打开一个终端,运行 roscore 打开 ROS 空间
roscore
再开启一个终端,运行以下命令打开海龟仿真器:
rosrun turtlesim turtlesim_node
再开启一个终端,运行以下命令,执行功能包中的程序:
source ~/catkin_ws/devel/setup.bash
rosrun learning_topic velocity_publisher
这里我是在网上搜索跟古月居实现的,有需要的可以去看看,链接放这里
跟古月居学ros
通过海龟仿真器来发布数据,实现一个订阅者来订阅海龟的位姿信息。具体实现步骤如下:
进入功能包中的 src 文件夹,创建一个 pose_subscriber.cpp 的文件,并输入以下 C++代码:
/**
* 该例程将订阅/turtle1/pose 话题,消息类型 turtlesim::pose
*/
#include
#include “turtlesim/Pose.h”
//接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO(“Turtle pose: x:%0.6f,y:%0.6f”, msg->x, msg->y);
}
int main(int argc, char **argv)
{
// 初始化 ROS 节点
ros::init(argc, argv,” pose_subscriber”);
//创建节点句柄
ros::NodeHandle n;
// 创建一个 subscriber,订阅名为/turtle1/pose 的 topic,注册回调函数 poseCallback
ros::Subscriber pose_sub = n.subscribe(“/turtle1/pose”, 10, poseCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
配置 CMakeLists.txt 中的编译规则:
设置需要编译的代码和生成的可执行文件:
add_executable(pose_subscriber src/pose_subscriber.cpp)
设置链接库:
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
接下来和前面步骤相同
source ~/catkin_ws/devel/setup.bash
设置环境变量后进行编译,编译成 c++的可执行文件。
进入到 catkin_ws 工作空间中执行 catkin_make,出现 100%表示编译成功
cd ~/catkin_ws
catkin_make
source devel/setup.bash
如果这个地方出现报错的话,首先去看看是报错在哪,是哪个文件出错了,然后去文件里面改,我之前就是前面的c文件英文打成中文了。如果出现很长一段报错,恭喜你,删除文件,重新来过。
打开一个终端运行 roscore,打开 ROS 空间。
再运行以下命令,开启一个终端运行海龟仿真器:
rosrun turtlesim turtlesim_node
开启一个终端执行功能包中的程序:
source ~/catkin_ws/devel/setup.bash
rosrun learning_topic pose_subscriber
rosrun turtlesim turtle_teleop_key
touch pose_subscriber.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
########################################################################
#### Copyright 2020 GuYueHome (www.guyuehome.com). ###
########################################################################
# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
import rospy
from turtlesim.msg import Pose
def poseCallback(msg):
rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)
def pose_subscriber():
# ROS节点初始化
rospy.init_node('pose_subscriber', anonymous=True)
# 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
rospy.Subscriber("/turtle1/pose", Pose, poseCallback)
# 循环等待回调函数
rospy.spin()
if __name__ == '__main__':
pose_subscriber()
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
source ~/catkin_ws/devel/setup.bash
rosrun learning_topic pose_subscriber.py
rosrun turtlesim turtle_teleop_key
总的来说用python做这一步和上面用python画圈圈有一点点相似,也是就是依据上面两个步骤,照葫芦画瓢。
在~/catkin_ws/src/learning_topic 目录下,创建 msg 文件夹及 Person.msg 文件在终端输入
以下命令:
touch Person.msg
打开该文件,并写入以下内容,在编译的时候会编译成相应的 c++或者 python 可执行文件。
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
针对数据接口的定义设置编译规则,在功能包里边的 package.xml 中加载两项依赖:
在 package.xml 文件中添加以下两条语句,加载编译依赖和加载执行依赖:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
在 CMakeLists.txt 添加编译选项,添加依赖功能包,如图
find_package( …… message_generation)
在 CMakeLists.txt 添加一个把.msg 文件编译成对应的不同的程序文件的配置项。
添加语句说明:
add_message_files(FILES Person.msg) 将 Person.msg 作为定义的交接接口,在编译时会发现该接口,针对它去做编译。
generate_messages(DEPENDENCIES std_msgs) 针对 Person.msg 需要用到
std_msgadd_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)
在 CMakeLists.txt 文件 catkin_package 中添加 message_runtime 的一个运行的依赖:
CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim
回到工作空间目录下 cd ~/catkin_ws 进行编译:
cd ~/catkin_ws
catkin_make
——————————————————————————————————
总结一下我在整个过程中出现的问题:
1.在进行第步骤五时,编译的代码中英文符号没有很好的切换,导致编译时候报错。我的整个过程每进行一步都会进行编译,如果你的编译出现了报错,那么先看看自己报错的问题出在哪,如果出现很长很长的报错,那么恭喜你,文件损坏,重新来过。
2.
在进行程序运行的时候要用source ~/catkin_ws下到其目录下,不然就会出现我上面这种情况,找不到文件
3.要仔细一点,整个过程下来有些长,花费时间也会不少,有些地方出问题了不能就不搞了,自己要学会去看错误,去分析错误。