基于NVIDIA Jetson AGX Xavier的移动机器人开发(2)——ROS基础操作、Clion配置ROS工作空间

本文介绍了如何搭建ROS开发环境,包括创建ROS工作空间和功能包,使用Clion进行代码开发。详细阐述了Clion配置ROS工作空间的步骤,以及创建ROS节点(发布器和订阅器)的过程。同时,提到了自定义ROS消息的方法和使用launch文件启动多个节点的技巧。
摘要由CSDN通过智能技术生成

【摘要】环境基本配置完善后,进行开发环境的搭建,使用Clion进行代码和ROS相关的开发。本篇主要回顾和总结ROS的相关基础操作,以及使用Clion配置ROS工作空间进行开发的相关整理。

一、ROS工作空间和功能包

  1. 在创建新的ROS代码前,必须先建立一个目录(ROS工作区),且必须要有src子目录mkdir -p ros_ws/src
  2. 设置环境变量,让操作系统知道工作区的位置source ros_ws/devel/setup.bash
  3. 编译工作空间,将会自动在src中生成CmakeList.txt文件
  4. package是ROS中的一个概念,按代码逻辑分组(如关节控制、规划、建图、感知),在src目录下执行
    catkin_create_pkg xxx roscpp rospy std_msgs
    xxx为package的名称,后面的参数依赖项。功能包的名字不可重复!
  5. 此时xxx目录下会存在package.xml,Cmakelist和src及include目录
  6. 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,其他的依赖可以仿照写
  7. roscd pkg_name可以直接进入某个package的目录下
  8. ROS依赖Linux中正确的环境变量设置,否则无法编译和运行,打开新终端时,环境将被重置,因此除非将环境变量设置于/home目录下的隐藏文件.bashrc中,否则所有操作需要在同一个终端进行。

二、 使用Clion开发编译

  1. 打开新的终端,首先配置环境变量source ros_ws/devel/setup.bash
  2. 在同一个终端,从源启动clionsh /opt/clion-xxx/bin/clion.sh
  3. 打开位于package下的CmakeList.txt,作为项目打开
  4. 在src目录下,添加源文件,如main.cpp
  5. 修改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);
        }

}
  1. 编译后首先打开roscore,然后另外开启命令行rosrun package_name minial_publisher
  2. rostopic list显示当前的话题;
  3. rostopic hz topic_name显示当前发布器向话题发布消息的频率;
    • 在机器人系统内,通常合理的发布频率是1KHZ
    • 假设while内部执行需要0.00001秒,则设置为1KHz会在程序运行后再等待1/1KHz的时间,从而控制时间
ros::Rate naptime(1);	// 实例化一个1Hz的等待对象
while (ros::ok())
{
    ...
    naptime.sleep();		//将节点挂起1Hz
}
  1. rostopic bw topic_name显示当前发布器消耗了多少可用的通信带宽;
  2. 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自动启动多个节点

  1. 通常,launch文件的名字与程序包相同,通常位于程序包内以launch命名的子目录;
  2. 不必启动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>
  1. 直接使用roslaunch package_name xxx.launch即可启动

六、自定义ROS消息

  1. ROS消息基于14个基本消息(内置类型),可以构造更为复杂的消息,std_msgs定义了32种消息类型,非基本消息类型也可以被包含以形成更复杂的消息类型
  2. 内置了一个特殊类型Header,其中包含时间戳、帧号,大多数消息的第一行就会包含Header
  3. 在package文件夹下新建msg目录,并创建xxx.msg文件,假设为:
string first_name
string last_name
uint8 age
uint32 score
  1. 将msg文件转换为C++、python等的源代码,在package.xml中修改/添加/取消注释
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  1. 将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
)
  1. 编译后,将会生成C++头文件,位于ros_ws/deve/include/package_name/xxx.h,以便于在源文件中直接使用
Jetson AGX Orin是一款强大的嵌入式计算平台,可以轻松安装ROS 2以实现机器人及其他自动化系统的开发和运行。以下是使用300字中文回答Jetson AGX Orin安装ROS 2的步骤和注意事项。 首先,确保Jetson AGX Orin已经正常运行,并且您已经完成了基本的设置和配置。 接下来,从ROS 2官方网站(https://index.ros.org/doc/ros2/Installation/Foxy/Linux-Install-Debians/)下载适用于您的Jetson AGX Orin的ROS 2发行版,建议选择最新版本Foxy Fitzroy。下载完成后,将.deb文件保存到您的Jetson AGX Orin的本地存储中。 然后,在Jetson AGX Orin的终端中打开一个新的命令行窗口,以便在系统中进行安装。使用以下命令导航到.deb文件的目录: cd /path/to/deb/file 然后,使用以下命令安装ROS 2: sudo apt install ./ros-foxy-*.deb ROS 2的安装过程可能会花费一些时间,具体取决于您的Jetson AGX Orin的性能和网络连接速度。在安装过程中,请耐心等待,直到安装完成。 安装完成后,您需要设置ROS 2的工作环境。使用以下命令执行此操作: source /opt/ros/foxy/setup.bash 现在,您可以开始使用ROS 2在Jetson AGX Orin上进行开发和运行机器人应用程序了。请查阅ROS 2的文档和教程,以了解更多关于ROS 2在Jetson AGX Orin上的使用方法和功能。 总结一下,安装ROS 2到Jetson AGX Orin的过程包括下载适用于该平台的ROS 2发行版,并使用apt命令进行安装。安装完成后,使用source命令设置ROS 2的工作环境。最后,您就可以开始使用ROS 2在Jetson AGX Orin上进行开发和运行机器人应用程序了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值