本系列文章是 2024 春季学期北航计算机学院本科生课程《软件工程》(嵌入式方向)的实验部分报告,不包含团队大作业项目内容与相关细节
任务0-ROS配置与话题通信 Ubuntu系统安装 从北航云盘 (提取码:0GhE)下载 Ubuntu 18.04 版本系统,因为只有 18.04 对应的 ROS 版本是 melodic
,其他的版本有所不同。
第一步是创建共享文件夹,首先在虚拟机设置—选项中启用共享文件夹,再在虚拟机中挂载文件夹:
sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
melodic(ROS)安装 wget http://fishros.com/install -O fishros && . fishros
利用鱼香 ROS 安装 ROS 系统,注意安装过程中要选择 melodic
以及 melodic
(桌面版)。桌面版有一些可视化的库,在后续展示小车状态时十分有效。
安装后使用 roscore
指令在终端测试 ROS 是否安装成功
cookedbear@ubuntu:~$ roscore ... logging to /home/cookedbear/.ros/log/a0f68c1a-e06e-11ee-9294-000c29175981/roslaunch-ubuntu-36422.log Checking log directory for disk usage. This may take a while . Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://ubuntu:46803/ ros_comm version 1.14.13
创建ROS项目 第一步是创建项目工作目录与环境,首先进入 src
文件夹,在终端中运行 catkin_init_workspace
完成初始化,然后回到上一级目录运行 catkin_make
编译建好的工作空间
mkdir yknbmkdir yknb/srccd yknb/srccatkin_init_workspace cd ..catkin_make source ./devel/setup.bash
ROS节点话题通信 首先创建功能包,然后使用 Python 语言新建两个脚本,分别执行 Publisher
和 Subscriber
的功能。
Python 代码如下:
import rospyfrom std_msgs.msg import Stringdef talker (): pub = rospy.Publisher('chatter' , String, queue_size=10 ) rospy.init_node('talker' , anonymous=True ) rate = rospy.Rate(10 ) while not rospy.is_shutdown(): hello_str = "hello world %s" % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep() if __name__ == '__main__' : try : talker() except rospy.ROSInterruptException: pass
import rospyfrom std_msgs.msg import Stringdef callback (data ): rospy.loginfo(rospy.get_caller_id() + 'I heard %s' , data.data) def listener (): rospy.init_node('listener' , anonymous=True ) rospy.Subscriber('chatter' , String, callback) rospy.spin() if __name__ == '__main__' : listener()
两段代码利用 std_msgs.msg
作为传递字符串的载体,由 talker.py 在指定话题中以固定的频率循环发送信息;listener.py 同样加入该话题,并接收发送的 msg
信息,转化为字符串打印在控制台中
随后修改 CMakeLists.txt
文件,将原本注释的 python 脚本还原,并且加入两个新的脚本:
catkin_install_python(PROGRAMS scripts/talker.py scripts/listener.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
设置完毕后,使用 catkin_make
重新编译项目,即可分别在两个命令行中运行两个节点:
cookedbear@ubuntu:~/Desktop/ros/yknb$ rosrun iamyk talker.py [INFO] [1710258107.379227]: hello world 1710258107.3791575 [INFO] [1710258107.479932]: hello world 1710258107.4797711 [INFO] [1710258107.579850]: hello world 1710258107.5796387 [INFO] [1710258107.679717]: hello world 1710258107.679525 [INFO] [1710258107.780339]: hello world 1710258107.7801197 [INFO] [1710258107.880397]: hello world 1710258107.8802269 [INFO] [1710258107.979713]: hello world 1710258107.9794989 [INFO] [1710258108.079838]: hello world 1710258108.0796237
cookedbear@ubuntu:~/Desktop/ros/yknb$ rosrun iamyk listener.py [INFO] [1710258131.381349]: /listener_3772_1710258131254I heard hello world 1710258131.380313 [INFO] [1710258131.482291]: /listener_3772_1710258131254I heard hello world 1710258131.4802547 [INFO] [1710258131.581786]: /listener_3772_1710258131254I heard hello world 1710258131.5797513 [INFO] [1710258131.681842]: /listener_3772_1710258131254I heard hello world 1710258131.6798933 [INFO] [1710258131.781949]: /listener_3772_1710258131254I heard hello world 1710258131.77978
在节点运行过程中,使用 rosnode
打印节点名、查询详细信息:
cookedbear@ubuntu:~/Desktop/ros/yknb$ rosnode list /listener_3802_1710258195435 /rosout /talker_3826_1710258197701 cookedbear@ubuntu:~/Desktop/ros/yknb$ rosnode info /talker_3826_1710258197701 -------------------------------------------------------------------------------- Node [/talker_3826_1710258197701] Publications: * /chatter [std_msgs/String] * /rosout [rosgraph_msgs/Log] Subscriptions: None Services: * /talker_3826_1710258197701/get_loggers * /talker_3826_1710258197701/set_logger_level contacting node http://ubuntu:45411/ ... Pid: 3826 Connections: * topic: /chatter * to: /listener_3802_1710258195435 * direction: outbound (38897 - 127.0.0.1:40302) [10] * transport: TCPROS * topic: /rosout * to: /rosout * direction: outbound (38897 - 127.0.0.1:40306) [8] * transport: TCPROS
同样可以使用命令行 rostopic
对话题进行相关信息的查阅:
cookedbear@ubuntu:~/Desktop/ros/yknb$ rostopic list /chatter /rosout /rosout_agg cookedbear@ubuntu:~/Desktop/ros/yknb$ rostopic info /chatter Type: std_msgs/String Publishers: * /talker_3826_1710258197701 (http://ubuntu:45411/) Subscribers: * /listener_3802_1710258195435 (http://ubuntu:36141/) cookedbear@ubuntu:~/Desktop/ros/yknb$ rostopic echo /chatter data: "hello world 1710258298.9224079" --- data: "hello world 1710258299.022878" --- data: "hello world 1710258299.1224391" --- data: "hello world 1710258299.2226434" --- data: "hello world 1710258299.3219335" --- data: "hello world 1710258299.4222023"
接着新建一个 launch
文件夹和 launcher.launch
文件,实现多节点的同时工作:
<launch > <node pkg ="iamyk" type ="talker.py" name ="talker1" /> <node pkg ="iamyk" type ="talker.py" name ="talker2" /> <node pkg ="iamyk" type ="listener.py" name ="listener" /> </launch >
最后使用 rqt_graph
生成节点关系图: