ROS知识:用python开发应用

发布于:2022-12-22 ⋅ 阅读:(875) ⋅ 点赞:(0)

目录

一、提要

二、用python实现ros节点

2.1 编写python文件的流程

2.2 编写CMakeLists.txt

2.3 产生错误类型

2.4 运行节点命令​​​​​​​

三、小乌龟发布者开发案例

3.1 启动节点​编辑

3.2 对应的python代码


一、提要

        在ROS工程,不仅需要熟悉C++;而且需要python,python存在比C++还要好的优势,就是可以和人工智能,图像处理相结合。因此,本文专门举了一个python开发项目,以强调其重要流程。

二、用python实现ros节点

2.1 编写python文件的流程

在python脚本的第一行,第一列,必须是:

       #! /usr/bin/env python

程序结构如下:

#! /usr/bin/env python
                                  #0.设定pyhton解释器
import rospy
                                  #1.导包
if __name__ == "__main__":
                                  #2.编写函数入口
    rospy.init_node("node_name")
                                  #3.初始化节点
    rospy.loginfo("hello hahaha")
                                  #4.输出日志

2.2 编写CMakeLists.txt

        在包生成指令:

        catkin_create_pkg  package_name roscpp rospy std-msgs ... ...

        自动生成CMakeLists.txt;注意,在C++中,CMakeLists.txt生成依赖路径,需要追加Add,targate...;而python包不需要配置。
现象:当路径配置不对,CMakeLists.txt时用rosrun执行python会报错

2.3 产生错误类型

  • /usr/bin/env python没有那个目录

        原因:当前noetic版本使用的是python3,配置文件的作用是定位到python3的解释器
解决方法:
1.直接声明解释器为python3(不建议,有可能调用别人的代码不能直接修改)
2.通过软连接将python连接到python3
sudo ls  /usr/bin/python3 /usr/bin/python

  • 错误:import-im6.q16: not authorized `rospy’ @ error/constitute.c/WriteImage/1037.

解决方案:
在py文件前面添加#!/usr/bin/env python(编写后没#!/usr/bin/env python语句)#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。 当系统看到这一行的时候,首先会到env设置(环境变量)里查找python的安装路径,再调用对应路径下的解释器程序完成操作。

2.4 运行节点命令

rosrun package-name node_name.py

三、小乌龟发布者开发案例

3.1 启动节点

3.2 对应的python代码


#!/usr/bin/env python
# -*- coding: utf-8 -*-


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

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到