文章目录
- 1、创建工作空间与功能包
-
- 1.1工作空间
-
- 1.1.1工作空间的介绍
- 1.1.2创建工作空间
- 1.1.3编译工作空间
- 1.2功能包
-
- 1.2.1功能包的介绍
- 1.2.1功能包的创建
- 1.2.2功能包的编译
- 1.2.3功能包中文件的意义
- 1.2.4设置环境变量
- 2、发布者Publisher的实现
-
- 2.1实现的话题模型
- 2.2创建功能包并编写代码
- 2.3修改文件并编译
- 2.4运行功能包并查看节点
- 2.5利用python脚本运行
- 3、订阅者Subscriber的实现
-
- 3.1实现模型
- 3.2创建订阅者代码c++
- 3.3利用python脚本实现
-
1、创建工作空间与功能包
1.1工作空间
1.1.1工作空间的介绍
- 工作空间是一个存放工程开发相关文件的文件夹。其中包含
-
-
- build:编译空间(编译过程文件,一般为二进制文件)
-
-
1.1.2创建工作空间
- 1、创建文件目录存放文件。其中catkin_ws是工作空间的名称,可以改变,但工作空间下面必须有src,不能改变。
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
- 3、配置好环境变量才能执行catkin_init_worksapce,可以输入catkin_init_worksapce进行尝试。若提示无法需要安装catkin添加环境变量。
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
catkin_init_worksapce
1.1.3编译工作空间
- 1、回到工作空间根目录,直接根据SRC目录的makelists文件编译空的工作空间
cd ~/catkin_ws
catkin_make
- 2、此时已经产生build,devel文件夹。install文件夹需要单独命令进行生成。
catkin_make install
此时产生install文件夹
1.2功能包
1.2.1功能包的介绍
- 工作空间创建之后可以创建功能包,在一个工作空间可以有多个功能包大部分放在src中。当功能包设计太多是可以根据类型划分多个工作空间。
1.2.1功能包的创建
cd ~/catkin_ws/src
catkin_create_pkg demo std_msgs rospy roscpp
1.2.2功能包的编译
cd ~/catkin_ws
catkin_make
1.2.3功能包中文件的意义
- include是存放c++的头文件
- src是存放源代码文件
- CMakeLists.txt是功能包编译的规则,利用CMAKE语法,编译依赖的功能包、生成可执行文件。
- package.xml是html语言编译和功能包相关的信息,名称、版本号、描述信息、维护者信息、lincense(开源的许可证)、依赖信息(后期可以修改)
1.2.4设置环境变量
echo $ROS_PACKAGE_PATH
source ~/catkin_ws/devel/setup.bash
echo $ROS_PACKAGE_PATH
2、发布者Publisher的实现
2.1实现的话题模型
- 主要有两个节点,一个是海龟仿真器、一个是需要实现的Publisher的节点,通过程序实现发布一个话题控制仿真器海龟的移动。
- Publisher发布一个Message消息类型是geometry_msgs::Twist其中包括线速度和角速度,通过turtle1/cmd_vel话题,然后海龟订阅这个话题,进一步控制仿真器中海龟的位置。
2.2创建功能包并编写代码
cd ~/catkin_ws/src/
$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
$ cd ~/catkin_ws/src/learning_topic
$ cd src
$ touch velocity_publisher.cpp
$ gedit velocity_publisher.cpp
#include
#include
int main(int argc,char **argv)
{
ros::init(argc,argv,"velocity_publisher");
ros::NodeHandle n;
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);
ros::Rate loop_rate(10);
while(ros::ok)
{
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("Publisher turtle velocity command[%0.2f m/s,%0.2f rad/s]",vel_msg.linear.x,vel_msg.angular.z);
loop_rate.sleep();
}
return 0;
}
2.3修改文件并编译
- 1、修改package.xml。
-
- 由于创建功能包时增加了创建的依赖,这里会自动生成,若创建时没有调节依赖或者后面编写程序需要添加其他依赖可以进行修改。
- 2、修改CMakeLists.txt。添加下面代码
# 将velocity_publisher.cpp编译成velocity_publisher可执行文件
add_executable(velocity_publisher src/velocity_publisher.cpp)
# 可执行文件和ROS的库进行链接
target_link_libraries(velocity_publisher
${catkin_LIBRARIES}
)
$ cd ~/catkin_ws/
2.4运行功能包并查看节点
- 1、修改环境变量。对用户目录下的.bashrc文件进行修改。
gedit ~/.bashrc
source /opt/ros/melodic/setup.bash
source /home/ubuntu/catkin_ws/devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher
- 3、现象,海龟根据发送的指令进行移动。
- 4、查看节点通信状态。
$ rqt_graph
rosnode kill -a
2.5利用python脚本运行
- 1、打开功能包创建存放python文件夹和文件,并修改文件权限
$ roscd learning_topic/
$ mkdir scripts
$ cd scripts
$ touch velocity_publisher.py
chmod +x velocity_publisher.py
$ gedit velocity_publisher.py
import rospy
from geometry_msgs.msg import Twist
def velocity_publisher():
rospy.init_node('velocity_publisher', anonymous=True)
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
rate = rospy.Rate(10)
while not rospy.is_shutdown():
vel_msg = Twist()
vel_msg.linear.x = 0.5
vel_msg.angular.z = 0.2
turtle_vel_pub.publish(vel_msg)
rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z)
rate.sleep()
if __name__ == '__main__':
try:
velocity_publisher()
except rospy.ROSInterruptException:
pass
- 4、对工作空间再次编译,对于python可以不需要
$ cd ~/catkin_ws
$ catkin_make
- 5其运行和c++的基本一样,最后需要调用时使用learning_topic的velocity_publisher.py。
rosrun learning_topic velocity_publisher.py
- 6、当把python中的节点名不增加时间戳,和c++的名字一样,当两个都需要运行时发现他们会相互把对方挤推出
3、订阅者Subscriber的实现
3.1实现模型
- 发布者为海龟仿真器,订阅者为需要实现的订阅者,通过/turtle1/pose的节点接收海龟仿真器发送的turtlesim::Pose的消息类型内容。
3.2创建订阅者代码c++
$ cd ~/catkin_ws/src/learning_topic/src
$ touch pose_subscriber.cpp
$ gedit pose_subscriber.cpp
#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::init(argc,argv,"posr_subscriber");
ros::NodeHandle n;
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose",10,PoseCallback);
ros::spin();
return 0;
}
$ gedit ~/catkin_ws/src/learning_topic/CMakeLists.txt
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber
${catkin_LIBRARIES}
)
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun py_learning_topic py_velocity_publisher.py
$ rosrun learning_topic pose_subscriber
3.3利用python脚本实现
- 1、打开存放python文件夹和文件,并修改文件权限
$ roscd learning_topic/
$ cd scripts
$ touch pose_subscriber.py
chmod +x pose_subscriber.py
$ gedit pose_subscriber.py
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():
rospy.init_node('pose_subscriber', anonymous=True)
rospy.Subscriber("/turtle1/pose", Pose, poseCallback)
rospy.spin()
if __name__ == '__main__':
pose_subscriber()
- 4、对工作空间再次编译,对于python可以不需要
$ cd ~/catkin_ws
$ catkin_make
- 5其运行和c++的基本一样,最后需要调用时使用learning_topic的pose_subscriber.py。
rosrun learning_topic velocity_publisher.py
- 6、当把python中的节点名不增加时间戳,和c++的名字一样,当两个都需要运行时发现他们会相互把对方挤推出
欢迎关注微信工作号,推送文章更及时。