基于NVIDIA Jetson AGX Xavier的移动机器人开发(2)——ROS基础操作、Clion配置ROS工作空间
ROS消息基于14个基本消息(内置类型),可以构造更为复杂的消息,std_msgs定义了32种消息类型,非基本消息类型也可以被包含以形成更复杂的消息类型内置了一个特殊类型Header,其中包含时间戳、帧号,大多数消息的第一行就会包含Header在package文件夹下新建msg目录,并创建xxx.msg文件,假设为:uint8 age将msg文件转换为C++、python等的源代码,在packag
·
【摘要】环境基本配置完善后,进行开发环境的搭建,使用Clion进行代码和ROS相关的开发。本篇主要回顾和总结ROS的相关基础操作,以及使用Clion配置ROS工作空间进行开发的相关整理。
一、ROS工作空间和功能包
- 在创建新的ROS代码前,必须先建立一个目录(ROS工作区),且必须要有src子目录
mkdir -p ros_ws/src
- 设置环境变量,让操作系统知道工作区的位置
source ros_ws/devel/setup.bash
- 编译工作空间,将会自动在src中生成CmakeList.txt文件
- package是ROS中的一个概念,按代码逻辑分组(如关节控制、规划、建图、感知),在src目录下执行
catkin_create_pkg xxx roscpp rospy std_msgs
xxx为package的名称,后面的参数依赖项。功能包的名字不可重复! - 此时xxx目录下会存在package.xml,Cmakelist和src及include目录
- package.xml会重新组织package,其中可以命名、列出依赖项,其中的注释说明了如何编辑。
<name>xxx</name>
应该与package名字一致(注意引用其他人的源码时修改),其中包含四种依赖项,首先唯一需要依赖的构建工具为catkin,即:<buildtool_depend>catkin</buildtool_depend>
,<build_depend>......</build_depend>
表示构建的依赖项,<exe_depend>......</exe_depend>
表示运行时的依赖项,此时已经包括roscpp,rospy,std_msgs,其他的依赖可以仿照写 roscd pkg_name
可以直接进入某个package的目录下- ROS依赖Linux中正确的环境变量设置,否则无法编译和运行,打开新终端时,环境将被重置,因此除非将环境变量设置于/home目录下的隐藏文件.bashrc中,否则所有操作需要在同一个终端进行。
二、 使用Clion开发编译
- 打开新的终端,首先配置环境变量
source ros_ws/devel/setup.bash
- 在同一个终端,从源启动clion
sh /opt/clion-xxx/bin/clion.sh
- 打开位于package下的CmakeList.txt,作为项目打开
- 在src目录下,添加源文件,如main.cpp
- 修改CmakeList.txt,主要有两处,然后reload
add_executable(my_package src/my_package.cpp)
target_link_libraries(my_package ${catkin_LIBRARIES})
三、创建ROS节点(以最小发布器为例)
#include <ros/ros.h>
#include <std_msgs/Float64.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "minimal_publisher"); // 节点名
ros::NodeHandle n; // nodehandle可以建立节点间的通信
//实例化发布器对象,向名为topic1的话题进行发布消息
ros::Publisher my_publisher_object = n.advertise<std_msg::Float64> ("topic1", 1);
// 实例化消息
std_msgs::Float64 input_float;
input_float.data = 0.0;
// 此循环只有当关闭roscore时才会停止
while (ros::ok())
{
input_float.data += 0.001;
my_publisher_object.publish(input_float);
}
}
- 编译后首先打开roscore,然后另外开启命令行
rosrun package_name minial_publisher
rostopic list
显示当前的话题;rostopic hz topic_name
显示当前发布器向话题发布消息的频率;- 在机器人系统内,通常合理的发布频率是1KHZ
- 假设while内部执行需要0.00001秒,则设置为1KHz会在程序运行后再等待1/1KHz的时间,从而控制时间
ros::Rate naptime(1); // 实例化一个1Hz的等待对象
while (ros::ok())
{
...
naptime.sleep(); //将节点挂起1Hz
}
rostopic bw topic_name
显示当前发布器消耗了多少可用的通信带宽;rostopic info topic_name
显示话题的信息
四、创建ROS节点(以最小订阅器为例)
#include <ros/ros.h>
#include <std_msgs/Float64>
//接受消息类型指针参数,话题中已发布的数据会通过引用传回message_holder中
void myCallback(const std_msgs::Float64& message_holder)
{
//C风格的命令行信息输出
ROS_INFO("received value is: %f", message_holder.data);
//C++风格的命令行信息输出
ROS_INFO_STREAM("received value is " << message_holder.data << std::endl);
}
int main(int argc, char **argv)
{
ros::init(argc, argc, "minimal_subscriber");
ros::NodeHandle n;
// 订阅topic1话题,一旦所订阅的话题有了新的数据,会唤醒进入callback
ros::Subscriber my_subscriber_object = n.advertise("topic1", 1, myCallback);
ros::spin(); //将主程序挂起,为回调函数的响应提供时间
return 0;
}
五、使用launch自动启动多个节点
- 通常,launch文件的名字与程序包相同,通常位于程序包内以launch命名的子目录;
- 不必启动roscore
<launch>
<node name="publisher" pkg="my_minimal_nodes" type="my_minimal_publisher"/>
<node name="subscriber" pkg="my_minimal_nodes" type="my_minimal_subscriber"/>
</launch>
- 直接使用
roslaunch package_name xxx.launch
即可启动
六、自定义ROS消息
- ROS消息基于14个基本消息(内置类型),可以构造更为复杂的消息,std_msgs定义了32种消息类型,非基本消息类型也可以被包含以形成更复杂的消息类型
- 内置了一个特殊类型Header,其中包含时间戳、帧号,大多数消息的第一行就会包含Header
- 在package文件夹下新建msg目录,并创建
xxx.msg
文件,假设为:
string first_name
string last_name
uint8 age
uint32 score
- 将msg文件转换为C++、python等的源代码,在package.xml中修改/添加/取消注释
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
- 将message_generation依赖项添加到CmakeList中的find_package;将message_runtime添加到运行依赖;取消注释add_message_files并将xxx.msg添加进消息列表;取消注释generate_message以在编译时运行generate_message
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
**************************************************
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
**************************************************
add_message_files(
FILES
xxx.msg
)
**************************************************
generate_messages(
DEPENDENCIES
std_msgs
)
- 编译后,将会生成C++头文件,位于
ros_ws/deve/include/package_name/xxx.h
,以便于在源文件中直接使用

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)