Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/callumjhays/spatialmath-rospy
ROS integration for Peter Corke's spatialmath library
https://github.com/callumjhays/spatialmath-rospy
geometry robotics ros rospy spatialmath
Last synced: about 1 month ago
JSON representation
ROS integration for Peter Corke's spatialmath library
- Host: GitHub
- URL: https://github.com/callumjhays/spatialmath-rospy
- Owner: CallumJHays
- License: mit
- Created: 2022-09-16T03:53:15.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2022-10-10T03:25:23.000Z (about 2 years ago)
- Last Synced: 2024-09-19T14:18:42.615Z (about 2 months ago)
- Topics: geometry, robotics, ros, rospy, spatialmath
- Language: Python
- Homepage: https://spatialmath-rospy.readthedocs.io/en/latest/
- Size: 143 KB
- Stars: 4
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
spatialmath-rospy
Spatial Math for ROS.
Intergration library between [`rospy`](http://wiki.ros.org/rospy) and [`spatialmath-python`](https://pypi.org/project/spatialmath-python/).
Currently this lib just contains conversion functionality.
Expect the conversion modules to work in any ROS1 version.## Install
```bash
pip install spatialmath-rospy
```## Documentation
[ReadTheDocs](https://spatialmath-rospy.readthedocs.io/en/latest/)## Usage
### Extended Classes [Recommended]
```python
# These classes extend their spatialmath-python counterparts
# to provide ROS functionality
from spatialmath_rospy import SE3, SO3, UnitQuaternionpose_msg = SE3(1, 2, 3).to_ros()
print(type(pose_msg), '\n', pose_msg)
"""
position:
x: 1.0
y: 2.0
z: 3.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
"""se3: SE3 = SE3.from_ros(pose_msg)
print(se3)
"""
1 0 0 1
0 1 0 2
0 0 1 3
0 0 0 1
"""
```### Conversion Functions
For those who prefer a functional style or don't want to use the extended classes
```python
import spatialmath as sm
from spatialmath_rospy import to_spatialmath, to_rospose_msg = to_ros(sm.SE3(1, 2, 3))
se3: sm.SE3 = to_spatialmath(pose_msg)
```### Monkey Patching
[Not Recommended]
You may prefer to use this option if wanting to add the `.from_ros()` and `.to_ros()` methods to the original `SE3`, `SO3` and `UnitQuaternion` classes via a monkey-patch. This may be useful for integrating legacy code. Not recommended as static type analysis tools like PyLance will not work.
```python
import spatialmath as sm
from spatialmath_rospy import monkey_patch_spatialmath# Invoke this at any point before calling conversion functions
monkey_patch_spatialmath()pose_msg = sm.SE3(1, 2, 3).to_ros()
```## ROS `Transform` Messages
The `to_ros()` function returns a `Pose` msg by default.
A `Transform` msg can be returned instead with `to_ros(as_tf=True)`.
```python
from spatialmath_rospy import SE3tf_msg = SE3(1, 2, 3).to_ros(as_tf=True)
print(type(tf_msg), '\n', tf_msg)
"""translation:
x: 1.0
y: 2.0
z: 3.0
rotation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
"""
```## ROS `Quaternion` Messages
`Quaternion` msgs convert to `UnitQuaternion` objects and vice versa:
```python
from spatialmath_rospy import UnitQuaternionquat_msg = UnitQuaternion(1, [0, 0, 0]).to_ros()
print(type(quat_msg), '\n', quat_msg)
"""
x: 0.0
y: 0.0
z: 0.0
w: 1.0
"""
unit_quat = UnitQuaternion.from_ros(quat_msg)
print(unit_quat)
" 1.0000 << 0.0000, 0.0000, 0.0000 >>
````UnitQuaternion` can also be converted to a `Transform` msg with `to_ros(as_tf=True)`:
```python
from spatialmath_rospy import UnitQuaternion, SE3quat = UnitQuaternion(1, [0, 0, 0])
tf_msg = quat.to_ros(as_tf=True)
print(tf_msg)
"""
translation:
x: 0
y: 0
z: 0
rotation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
"""
```This `Transform` will have always zero translation.
## ROS Stamped messages
Just pass a `std_msgs.msg.Header` in to `to_ros()` to construct stamped objects:
```python
from std_msgs.msg import Header
from spatialmath_rospy import SE3pose_stamped_msg = SE3(1, 2, 3).to_ros(
Header(frame_id="world")
)
print(type(pose_stamped_msg), '\n', pose_stamped_msg)
"""
header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: "world"
pose:
position:
x: 1.0
y: 2.0
z: 3.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
"""
```This works for all supported ros msg types:
- `Pose` / `PoseStamped`
- `Transform` / `TransformStamped`
- `Quaternion` / `QuaternionStamped`## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
## Credits
This package was created with
[Cookiecutter](https://github.com/audreyr/cookiecutter) and the
[browniebroke/cookiecutter-pypackage](https://github.com/browniebroke/cookiecutter-pypackage)
project template.